猿问

使用函数存在并需要一次 - 仍然致命错误:先前声明

我知道,这已经出现了无数次,但预期的解决方案 -! 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 个其他包含之一,但是当您对其进行单元测试时,仅包含此文件。


这是一个如此简单和基本的事情,有什么方法可以确定是否声明了全局函数?


慕田峪9158850
浏览 86回答 2
2回答

墨色风雨

我不确定发生了什么,因为错误消息暗示该文件被多次需要,即使您使用了require_once. 和的_once版本的全部意义在于防止重新定义。requireinclude与其将if语句放在 周围require_once,不如将其放入file-containing-the-function.php,然后require_once无条件使用。if (!function_exists('some_function')) {    function some_function(...) {        ...    }}

ITMISS

对于仍然有兴趣知道的人,在您提到的 fritzmg 评论中,function_exists 仍然不会使您受益,因为您无法通过在错误情况下加载文件来再次声明该函数。只需在您不需要的项目中使用"include_once"或任何地方。但如果你仍然得到错误,那是因为两种情况中的任何一种。"require_once"function_exists1 . 您在项目的多个文件中声明了函数。2 . 您正在使用的项目中的其他一些地方需要或包含两次以包含相同的文件。或按要求执行一次,按包含执行一次。
随时随地看视频慕课网APP
我要回答