Функция в коде пространства имен работает в бесконечном цикле или как?

я использую PHP 7.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";
}
?>

Выход :

45
7

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 262144 bytes) in ... on line 7

Насколько мне известно, PHP вернется к глобальной функции, если функция пространства имен не существует.

Тогда почему я получаю Фатальная ошибка Вот?

Кроме того, фатальная ошибка, которую я получил, означает, что программа работает в бесконечном цикле? Если да, то как? Если нет, каково точное значение этой фатальной ошибки?

-3

Решение

Да, код, который вы используете, работает в бесконечном цикле. Вот как выглядят результаты моего теста (немного более информативно):

~ » php test.php
45
7
PHP Fatal error:  Maximum function nesting level of '256' reached,
aborting! in /Users/xxx/test.php on line 5

Если вы уже перезаписываете функцию std php (которую я бы не рекомендовал), вам нужно явно запустить функцию std, добавив перед ней обратную косую черту (используйте глобальное пространство имен).

<?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

РЕДАКТИРОВАТЬ: Только сейчас я нашел это руководство с очень похожим примером: http://php.net/manual/en/language.namespaces.global.php

1

Другие решения

Других решений пока нет …