Я читаю книгу о PHP и об использовании TRUE
и FALSE
, она говорит:
На самом деле версии нижнего регистра более стабильны, потому что PHP не позволяет вам переопределять их; заглавные могут быть переопределены
Я пытался переопределить TRUE
и FALSE
, и это не сработало! Я google redefining константы и выяснил, что мне нужно использовать runkit_constant_redefine()
, у меня нет расширения runkit_constant_redefine()
, поэтому я не могу попробовать его на TRUE и FALSE ..
Мой вопрос: может ли TRUE
, true
, FALSE
или false
переопределяться с помощью runkit_constant_redefine()
или без runkit_constant_redefine()
?
Boolean true определяется как константа без учета регистра , при этом true
является обозначение по умолчанию.
define("true", 1, 1);
Это означает, что он будет работать и в любом другом корпусе, будь то TRUE
или True
или TrUe
или tRUE
.
То, что ваша книга намекает на это, переопределяет константу в другом варианте случая снова. Что вы можете. Все, кроме строчной буквы, являются открытыми точками в таблице постоянного поиска.
Например, define("True", 2)
он будет иметь приоритет над строчным значением true
которое заменило бы остальные случаи else.
Это бессмысленный совет от вашей книги. Даже если вы можете объявить дюжину вариантов для булевых констант, никто на самом деле этого не делает. Предполагаемое «более стабильное» рассуждение является практически фиктивным. Предпочитайте обозначение, которое более читаемо или соответствует существующему стилю кодировки.
Да, вы можете, для версий в верхнем регистре:
$ 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
Но зачем вам это нужно? Переосмысление реальности редко срабатывает в конце.
Вы можете определить разные true
и false
в каждом пространстве имен.
namespace foo; define('foo\true', 0); if (true) { echo 'This will be never printed.'; }
Вот выдержка из руководства PHP Booleans :
константы 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). Поэтому я думаю, что до сих пор существует актуальная релевантность для этой темы.