2015-12-26 3 views
3

См https://3v4l.org/6OelkПочему PHP var_export() печатает NULL в верхнем регистре, но true и false в нижнем регистре?

var_export(array(NULL, TRUE, FALSE)); 

Результат:

array (
    0 => NULL, 
    1 => true, 
    2 => false, 
) 

NULL заглавная, но истина и ложь в нижнем регистре.

Я полагаю, что у этого есть историческая причина, но я нигде не обнаружил его документально.


Следующий эксперимент также весьма интересен, и предполагает, что внутренне «каноническое» правописание нуля, истинного и ложного в нижнем регистре, вопреки тому, что var_export() делает: https://3v4l.org/ggM4E

define('false', '- false -'); 
define('FALSE', '- FALSE -'); 
define('null', '- null -'); 
define('NULL', '- NULL -'); 
var_export(array(TRUE, true, FALSE, false, NULL, null)); 

Это показывает, что:

  • define ('NULL', ..) и define ('FALSE', ..) разрешены, но не имеют эффекта в последних версиях PHP.
  • define ('null', ..) и define ('false', ..) дают уведомление, но также не имеют эффекта в последних версиях PHP.
  • В старой версии PHP (4.x), «NULL» и «FALSE» могут быть переопределены, и это имеет эффект. Но «null» и «false» не могут быть переопределены.

О, только для полноты: define ('NULL', ..) и define ('FALSE', ..) на самом деле НЕ игнорируются, если внутри пространства имен в PHP 5.x. См. https://3v4l.org/JusvB. Или, если вы действительно хотите, вы можете даже отменить «нулевой» и «ложь» в пространстве имен: https://3v4l.org/i796C


Связанные: Uppercase Booleans vs. Lowercase in PHP см этот ответ: https://stackoverflow.com/a/3807178/246724

+0

Ok, я подозреваю, что, может быть, ответ действительно скучный. Человек, который написал var_export(), мало думал об этом, и просто подумал, что NULL выглядит лучше в верхнем регистре, даже если это противоречиво. И теперь нам нужно жить с ним, потому что в противном случае существующие модульные тесты с hardcoded var_export() будут неудачными. Может быть, у кого-то есть лучший ответ, но я боюсь, что может быть не так много. – donquixote

+0

Если кто-то может подтвердить это объяснение/мою теорию, в идеале с некоторыми доказательствами/ссылками, то это будет правильным и полезным ответом на этот вопрос.Это может быть скучно, но это будет означать, что люди могут перестать смотреть. – donquixote

+1

Это скучный ответ: https://github.com/php/php-src/blob/master/ext/standard/var.c#L436 (изменить: обновленная ссылка, как-то вставлена ​​неправильно) – Dukecz

ответ

1

Как @NikiC заметки в комментариях О.П. , для этого нет конкретных аргументов.

Наиболее логичное объяснение хотя бы что рассматривает PHP написан на C и исторические стандарты определяют NULL в верхнем регистре, и true, false как строчными, причина следует, что стандарты в PHP последуют этому примеру.

IEEE Std 1003.1 Ссылки:

Смежные вопросы