Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 命名空间代码中的函数是否运行在无限循环中?_Php_Function_Namespaces_Global_Built In - Fatal编程技术网

Php 命名空间代码中的函数是否运行在无限循环中?

Php 命名空间代码中的函数是否运行在无限循环中?,php,function,namespaces,global,built-in,Php,Function,Namespaces,Global,Built In,我使用的是PHP7.2.1 考虑以下代码: <?php namespace A\B\C; const E_ERROR = 45; function strlen($str) { return strlen($str) - 1; } echo E_ERROR, "\n"; // prints "45" echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL echo strlen('hi'), "\n";

我使用的是PHP7.2.1

考虑以下代码:

<?php
namespace A\B\C;

const E_ERROR = 45;
function strlen($str)
{
    return strlen($str) - 1;
}

echo E_ERROR, "\n"; // prints "45"
echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL

echo strlen('hi'), "\n"; // prints "1"
if (is_array('hi')) { // prints "is not array"
    echo "is array\n";
} else {
    echo "is not array\n";
}
?>
据我所知,如果名称空间函数不存在,PHP将退回到全局函数

那为什么我会在这里出现致命错误


另外,我收到的致命错误是否意味着程序正在无限循环中运行?如果是,如何进行?如果否,此致命错误的确切含义是什么?

是的,您使用的代码确实在无限循环中运行。以下是我的测试结果(信息量稍微大一点):

如果您已经在覆盖std-php函数(我不建议这样做),那么必须通过在std函数前面加反斜杠(使用全局名称空间)来显式运行它


编辑:直到现在,我才发现这本手册中有一个非常类似的例子:

我所看到的只是“名称空间”函数存在……”“如果名称空间函数不存在,则返回到全局函数”——好吧,但是
strlen
确实存在于您的名称空间中,并且它是一个无限递归函数。当然,它唯一能做的就是耗尽内存让它调用PHP内置函数。@deceze我是说,老实说,我希望它会溢出某种垂直方向的内存结构…:3c@Sammitch啊,像一个筒仓排气?是的,同样的区别。
45 
7 

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 262144 bytes) in ... on line 7
~ » php test.php
45
7
PHP Fatal error:  Maximum function nesting level of '256' reached, 
aborting! in /Users/xxx/test.php on line 5
<?php
namespace A\B\C;

const E_ERROR = 45;
function strlen($str)
{
    return \strlen($str) - 1;
}

echo E_ERROR, "\n"; // prints "45"
echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL

echo strlen('hi'), "\n"; // prints "1"
if (is_array('hi')) { // prints "is not array"
    echo "is array\n";
} else {
    echo "is not array\n";
}
~ » php test.php
45
7
1
is not array