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



我知道这已经出现了无数次,但预期的解决方案 -! 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()require_once()的组合(或include_once,也尝试过(可以防止此问题,但在这种环境中并非如此。

我发现的最有见地的花絮是这条评论:

PHP 函数可能不存在,但仍已声明。

因此,我的问题似乎没有一个好的答案(除了正确重建整个系统,这不会很快发生。

这是在一个巨大的遗留系统中,到处都是全局变量和函数。没有命名空间和很少的类,有很多地方出错。我知道问题出在这个问题的某个地方 -file-containing-the-function.php包含在包含的包含中,依此类推,很多层深(堆栈跟踪甚至没有显示它。即便如此,根据 S.O. 上的所有描述、定义和大量响应,包装器应该可以工作。

在此代码点,它不会出现在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 个其他包含之一,但是当您对其进行单元测试时,仅包含此文件。

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

我不太确定发生了什么,因为错误消息暗示该文件被多次需要,即使您使用了require_once_once版本的requireinclude的全部意义在于防止重新定义。

不要把if语句放在require_once周围,而是把它放在file-containing-the-function.php,然后无条件地使用require_once

if (!function_exists('some_function')) {
function some_function(...) {
...
}
}

对于仍然有兴趣知道的人,在弗里茨姆提到的评论中, function_exists仍然不会使您受益,因为您无法通过以 false 大小写加载文件来再次声明该函数。 只是 如果在项目中的任何位置使用"include_once""require_once",则不需要function_exists。但是,如果您仍然遇到错误,那是由于两种情况中的任何一种。

1. 您在项目中的多个文件中声明了函数。

2.您正在使用的项目中的其他位置需要或包含两次才能包含相同的文件。 或者按要求执行一次,按包含执行一次。

最新更新