В чем разница между 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.