我知道,这已经出现了无数次,但预期的解决方案 -! function_exists()并且require_once()- 不起作用。问题是(我已经做了很多搜索)有没有办法在给定的执行点确定一个函数是否已声明但不存在?
把它打出来几乎没有意义,但这就是正在发生的事情。细节:
这是我们所拥有的以及致命的地方:
if (! function_exists('some_function')) {
require_once('file-containing-the-function.php');
}
Fatal error: cannot redeclare some_function, previously declared in file-containing-the-function.php on line XX . . . .
您会认为function_exists()and require_once()(或 include_once,也尝试过)的组合可以防止这个问题,但在这种环境中它不会。
我发现的最有见地的花絮是在这条评论中:
PHP 函数可能不存在,但仍被声明。
因此,我的问题似乎没有一个好的答案(除了正确重建整个系统,这不会很快发生。)
这是一个巨大的遗留系统,到处都有全局变量和函数。没有命名空间,类也很少,有很多地方会出错。我知道问题出在那个问题的某个地方 -file-containing-the-function.php包含在包含等的包含中,很多层很深(堆栈跟踪甚至没有显示它。)。即便如此,根据 SO 上的所有描述、定义和大量响应,包装器应该可以工作。
在这段代码中,它没有出现在get_defined_functions(). 一切都是全局和顶级的,函数内部没有函数或任何常见的嫌疑犯,比如被忽略的额外包含。require_once()也适用于file-containing-the-function.php包含的其他文件。get_included_files() 文件不显示该文件file-containing-the-function.php甚至在此代码执行时已包含在内。
此代码所在的文件是一个包含本身,并some_function()从其他地方的另一个包含继承。我无法将此文件的包含或此代码向上移动到调用堆栈足够远以确保首先执行它(如果我这样做会破坏很多其他事情。)此代码必须存在于它所在的位置,因为这个特定的文件可以包括但不包括file-containing-the-function.php. 例如,这可能是在实际使用中用于网页输出的 20 或 30 个其他包含之一,但是当您对其进行单元测试时,仅包含此文件。
这是一个如此简单和基本的事情,有什么方法可以确定是否声明了全局函数?
墨色风雨
ITMISS