Подтвердить что ты не робот

В чем разница между `while (true)` vs` while (\ true) `?

В чем разница между while (true) vs while (\true) и наиболее важным может кто-нибудь объяснить, почему boolean влияет на пространство имен в PHP?

4b9b3361

Ответ 1

В PHP true, false и null есть константы, которые защищены от перезаписи в пространствах имен. Таким образом, недопустимый код:

namespace Foo;
const true = false; // Cannot redeclare constant 'true'

По-прежнему можно перезаписать такую ​​константу, используя '' define() '':

namespace Foo;
define('Foo\true', false);
var_dump(true); // bool(false)

Однако эта функция не поддерживается (ее можно назвать ошибкой), и PHP может предположить, что true нельзя перезаписать. Например, использование true в контексте constexpr не будет затронуто описанным выше определением:

// Note: This uses eval() to make sure the define() runs before the constexpr
//       constant resolution happens

namespace Foo;
define('Foo\true', false);
var_dump(eval('namespace Foo;
static $t = true;
return $t;')); // bool(true)

Причина, по которой замещение происходит в случае constexpr, но не в "нормальном" случае, является ошибкой в ​​реализации. Для constexprs замена происходит до разрешения имени, тогда как для обычного кода это происходит после разрешения имени.

Правильная реализация будет заключаться в том, чтобы всегда подставлять после разрешения имен, но в частности, учитывайте true, false и null во время подстановки. Я планирую исправить это для PHP 7.