Php 命名空间代码中的函数是否运行在无限循环中?
我使用的是PHP7.2.1 考虑以下代码: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";
<?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