В чем разница между while (true)
vs while (\true)
и наиболее важным может кто-нибудь объяснить, почему boolean
влияет на пространство имен в PHP
?
В чем разница между `while (true)` vs` while (\ true) `?
Ответ 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.