Можно ли переопределить Boolean FALSE и TRUE

Я читаю книгу о PHP и об использовании TRUE и FALSE, она говорит:

В самом деле, версии с нижним регистром более стабильны, потому что PHP не позволяют вам переопределить их; заглавные могут быть переопределены

Я попытался переопределить TRUE и FALSE, и это не сработало!! Я google redefining константы и выяснил, что мне нужно использовать runkit_constant_redefine(), у меня нет расширения runkit, поэтому я не могу попробовать его на TRUE и FALSE..

Мой вопрос: можно ли TRUE, TRUE, FALSE или FALSE переопределить с помощью или без runkit_constant_redefine()?

Ответ 1

Логическое значение true определяется как нечувствительная к регистру константа, причем true является обозначением по умолчанию.

 define("true", 1, 1);

Это означает, что он будет работать и в любом другом корпусе, будь то true или true или true или true.

То, о чем ваша книга ссылается, еще раз переопределяет константу в другом варианте. Что вы можете. Все, кроме строчных true, являются открытыми точками в таблице постоянного поиска.

С помощью, например, define("True", 2) он будет иметь приоритет над строчным true, который заменит остальные случаи else.

Это бессмысленный совет от вашей книги. Даже если вы можете объявить дюжину вариантов для булевых констант, никто на самом деле этого не делает. Предполагаемое "более стабильное" рассуждение является практически фиктивным. Предпочитайте обозначение, которое более читаемо или соответствует существующему стилю кодирования.

Ответ 2

Да, вы можете, для версий в верхнем регистре:

$ php
php > var_dump(defined('TRUE'), TRUE);
bool(true)
bool(true)
php > define('TRUE', 'arglebargle');
php > var_dump(defined('TRUE'), TRUE);
bool(true)
string(11) "arglebargle"

php > echo phpversion();
5.4.16

В нижнем регистре, не так много:

php > var_dump(defined('true'), true);
bool(true)
bool(true)
php > define('true', 'foobarbaz');
PHP Notice:  Constant true already defined in php shell code on line 1

Но зачем вам это нужно? Переосмысление реальности редко срабатывает в конце.

Ответ 3

Вы можете определить разные true и false в каждом пространстве имен.

namespace foo;

define('foo\true', 0);
if (true) {
    echo 'This will be never printed.';
}

Ответ 4

Здесь выдержка из руководства PHP Логические значения:

константы TRUE или FALSE. Оба не чувствительны к регистру.

...

$foo = True; // assign the value TRUE to $foo

...

if ($show_separators == TRUE) {

Поскольку это формулировка руководства, вы можете предположить, что новые версии, вероятно, не нарушат обратной совместимости. Вы можете рассматривать запись True в любом случае стабильной. Рекомендуется использовать один последовательный стиль кода. Но это не имеет никакого отношения к стабильности.

Тот факт, что константа, чувствительная к регистру, хранится с канонизированным нижним регистром True, является деталью реализации и не имеет дальнейшей значимости.


Относительно тех, кто заявляет о переопределении True: Единственный сценарий, который мне удалось сделать, был в собственном пространстве имен:

namespace foo;

define("TRUE", "bar");
assert (TRUE === "bar");
assert (TRUE !== \TRUE)

Это определение foo\TRUE, а не \TRUE!

Марио написал, что в пред-пространствах имен возможно PHP-версии (PHP < 5.3) переопределение True. Ну, PHP-5.3 был выпущен 5 лет назад. Удивительно, что доля рынка в PHP составляет 5.3%, составляет около 23% (от PHP-5). Поэтому я думаю, что до сих пор существует актуальная релевантность для этой темы.