在 PHP 中需要文件后取消对文件的要求

Posted

技术标签:

【中文标题】在 PHP 中需要文件后取消对文件的要求【英文标题】:unrequire a file once it's been required in PHP 【发布时间】:2014-09-17 14:09:48 【问题描述】:

假设我这样做

require('lol.php');

其中lol.php包含以下函数声明

function lolfunc()


是否可以“取消要求”lol.php,以便我可以要求另一个文件

require('lol2.php');

其中lol2.php包含一个与之前在lol.php中声明的同名的函数:

function lolfunc()
  echo "this is lol2 biyotch";

并让lolfunc() 成为lol2.php 中声明的那个?例如,如果我调用 lolfunc() 它会回显“这是 lol2 biyotch”??

【问题讨论】:

不,这不可能也不合理。用例是什么? 例如,我下载了一个包含 2 个不同版本的库,但它们具有相同的函数名称等...在某些情况下,我首先使用旧版本,但如果出现某些情况,则需要覆盖旧版本和新版本......我的朋友总是有一个用例 一开始听起来是个糟糕的地方。 这些可能对php.net/manual/en/function.function-exists.php和php.net/manual/en/function.method-exists.php和php.net/manual/en/function.class-exists.php有帮助 @pillarOfLight 您假设您可以从交错的新旧文件中调用函数而不会出现任何问题。除非您已经验证这是真的,否则我的经验是这很少是正确的:通常随着库的发展,它们的数据结构和要求也在发展。 【参考方案1】:

我的回答:不要那样做。

尝试与原作者合作,将您需要的功能包含在旧代码的修补版本中,然后在任何地方使用该修补版本。

如果您无法做到这一点,请了解将所有代码更新到新版本实际上是一项艰巨的任务。从白盒分析开始:查看接口、数据结构等方面的变化。然后检查调用代码,看看调用者是否关心任何已更改的内容。

如果您甚至不能这样做,请使用命名空间或其他形式的包装,以便您可以包含两个库。但是,请确保在两个库上都完成了任何初始化或设置!

【讨论】:

【参考方案2】:

您应该做的是根据条件子句包含所需的(组)文件,而不是尝试“取消要求”。

所以:

if($flag_use_oldver)

  include("oldver.php");

else

 include("newver.php");

如果您想要一个更复杂的解决方案,当然您可以尝试使用一个包装类层次结构,该层次结构将根据需要进行扩展/覆盖,但我认为这对于一个非常简单的问题陈述来说有点过度设计。

【讨论】:

这就是我的用例中的事情,为了知道我需要包含新版本,我需要包含旧版本,因为基本上如果旧版本中的某些内容失败,那么执行新版本中的一个 @pillarOfLight 这是一个有点复杂的用例 :) 您可以尝试的一件事是正常包含 oldver。对于 newver,创建一个处理程序包装器并且不要在任何地方包含它。如果 oldver 失败,则对 newver 包装器进行 curl 调用,该包装器将依次调用 newver 并执行所需的处理... 也许在您的代码中添加一个版本号,并使用条件语句检查它是否是最新的。以前见过类似的东西,但不记得在哪里看到的了。 @pillarOfLight @Fred-ii- 似乎 OP 遇到的问题是,他/她想要包含并执行 oldver,然后评估其结果,如果不行,则包含并执行 newver。但是似乎 newver 和 oldver 具有相同的函数名称。您的意思是代码中的版本号建议运行哪个版本? “你的意思是代码中的版本号建议运行哪个版本?” - 是的,我以前见过它,但对于我的一生来说,不记得我在哪里看到的。我通常将类似的东西放在我的书签中,但我在其中找不到对它的引用。 @raidenace

以上是关于在 PHP 中需要文件后取消对文件的要求的主要内容,如果未能解决你的问题,请参考以下文章

如何解除文件夹加密

PHP通过exec函数实现对APK自动签名

ecshop程序(php内核)怎么来实现 下订单后3小时不付款,自动取消订单

使用des对文件加密后怎么解密

在 PHP 应用程序中需要 .vue 单文件组件

我需要在 php 文件测验中动态分配单选按钮