чем являются false/true/null

zerkms

TDD infected
Команда форума
чем являются false/true/null

возник тут идеологический спор: чем же являются false/true/null - константами или ключевыми словами

с одной стороны мануал утверждает:
To specify a boolean literal, use either the keyword TRUE or FALSE.
NULL is the only possible value of type NULL.
и в числе predefined constants (http://www.php.net/manual/en/reserved.constants.php) этих "слов" нет
с другой стороны
var_dump(defined('TRUE')); выдаёт true
 

WP

^_^
=)) Всё проще. echo constant('TrUe')?'константа:'не константа';
constant — Returns the value of a constant

-~{}~ 03.07.07 09:32:

А спор вытек из спора о том как писать true или TRUE, я считаю что надо TRUE т.к. константы принято писать в верхнем регистре, а на что TRUE - константа указывает синтаксический вид и constant('TRUE'). А ув. zerkms говорит что это ни разу не константа а "ключевое слово".

-~{}~ 03.07.07 09:32:

з.ы. единственное отличие от любых других констант - регистронезависимость.
 

Андрейка

Senior pomidor developer
PHP:
var_dump(defined(TRUE));
->bool(false) вообще-то

з.ы. единственное отличие от любых других констант - регистронезависимость.
о, особые регистронезависимые мегаконстанты? реально? а чему ж тогда их значение равно?

а это типа доказательство?
PHP:
echo constant('TrUe')?'константа':'не константа';
 

crocodile2u

http://vbolshov.org.ru
$ php -r 'var_dump(defined(TRUE));'
bool(false)
$ php -r 'var_dump(defined("TRUE"));'
bool(true)

-~{}~ 03.07.07 10:19:

Однако, я всегда пишу тру/фолс/нулл в нижнем регистре.
 

WP

^_^
Андрейка
> ->bool(false) вообще-то
В кавычки надобно взять.
> о, особые регистронезависимые мегаконстанты? реально? а чему ж тогда их значение равно?
"мега" это 1024*1024? Регистронезависимые константы вполне реально, покури третий аргумент define.
TRUE это тип boolean значение 1,
FALSE это тип boolean значение 0,
NULL это тип null.

-~{}~ 03.07.07 10:21:

PHP:
define('MYTRUE',(bool) 1,TRUE);
Вот так можно создать ПОЛНУЮ идентичность TRUE.
 

Андрейка

Senior pomidor developer
WP
а первое предложение не тебе было)

PHP:
define(523, 'php version');

var_dump(constant('523'));
var_dump(constant(523));
давайте философфствовать на тему - являецца ли число 523 константой?
 

WP

^_^
И еще, Андрейка, поменьше дешевого сарказма, он граничит с глупостью, ввиду отсутствия знаний.

-~{}~ 03.07.07 10:27:

> а первое предложение не тебе было)
Мне это не мешает, как и crocodile2u.
> давайте философфствовать на тему - являецца ли число 523 константой?
Не является синтаксически, т.к. константа как и переменная не может начинаться с цифры. Тем не менее можно объявить такую константу, и она успешно попадет в хеш, равно как и в $GLOBALS можно записать элемент с ключем начинающимся на цифру.
 

Андрейка

Senior pomidor developer
WP
т.е. не все, на что constant возвращает какое-то значение (в т.ч. !=null) есть константа.. так?
 

WP

^_^
Кстать я думаю что define в этом случае должно ругаться.

Андрейка
Если ты хочешь определение действительной константы через constant - пожалуйста.
Строка аргумента в ответ на который constant() возвращает значение без Warning, и которая начинается не с цифры, является названием действительной константы.

-~{}~ 03.07.07 10:40:

> так?
Софистика сегодня не в моде.

-~{}~ 03.07.07 10:41:

> (в т.ч. !=null)
Чем тебе не угодил этот тип?

-~{}~ 03.07.07 10:44:

Кстати я отправлю багрепорт на эту тему. define должна орать благим матом если передают название начинающееся с цифры.1
 

Андрейка

Senior pomidor developer
WP
Строка аргумента в ответ на который constant() возвращает значение без Warning, и которая начинается не с цифры, является названием действительной константы.
зафиксировали... дальше
PHP:
define('try', 'lol', true);
теперь try это полноправная константа? ну с буквы она точно начинается

Софистика сегодня не в моде.
та я ваще нимодный (( и сарказм у мну дешевый ((( это ты привык там по глОмурным дискотэкам в розовом шарфике с сергеем зверевым катаццо

Чем тебе не угодил этот тип?
это уже тип? это ж константа еще недавно была
 

WP

^_^
Дело пахнет тяжелыми наркотиками.
> это уже тип? это ж константа еще недавно была
Есть константа NULL и тип переменной null.
> теперь try это полноправная константа? ну с буквы она точно начинается
Совершенно верно.
> та я ваще нимодный (( и сарказм у мну дешевый ((( это ты привык там по глОмурным дискотэкам в розовом шарфике с сергеем зверевым катаццо
Прям нечего и добавить.
 

Crazy

Developer
Re: чем являются false/true/null

Автор оригинала: zerkms
возник тут идеологический спор: чем же являются false/true/null - константами или ключевыми словами
Это литералы. Как и 503 или "Foobar".
 

Андрейка

Senior pomidor developer
WP
> теперь try это полноправная константа? ну с буквы она точно начинается
Совершенно верно.

так почему ж когда я в скрипте после такого define пишу echo try оно мне parse error выдает вместо значения константы?
 

WP

^_^
Андрейка
Потому что это ключевое слово, и парсер, увы, не настолько умный чтобы отличать его.
 

Андрейка

Senior pomidor developer
WP
ну а почему тогда true не ключевое слово (что прямо указывается в документации), а именно константа? неужели потому, что оно parse error не выдает?
 

WP

^_^
Потому что оно не используется как атрибут к блоку. Сходу назову ключевые слова: if/function/try/catch/final... Они используются как атрибуты к блокам, а true/false/... нет.
 

Андрейка

Senior pomidor developer
WP
а все, что не используеццо как аттрибут к блоку есть константа? попробуй собрацца с мыслями и из полученных тобой данных ЛОГИЧЕСКИМ путем объяснить почему в случае $r = true присваивается именно значение константы?
 

WP

^_^
Андрейка
> а все, что не используеццо как аттрибут к блоку есть константа?
Да, строки [A-Za-z_][0-9A-Za-z_]* могут быть константами за исключением списка ключевых слов используемых в атрибутах к блокам.

Думаю собраться с мыслями нужно таки тебе, а не мне, и четко сформулировать вопрос. Данных я пока что увы не получил новых.
Потому что интерпретатор парсит правое выражение как T_CONSTANT, ищет и находит TRUE.
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_constants.c?view=markup

Код:
...
	/* true/false constants */
	{
		zend_constant c;

		Z_TYPE(c.value) = IS_BOOL;
		c.flags = CONST_PERSISTENT | CONST_CT_SUBST;
		c.module_number = 0;

		c.name.s = zend_strndup(ZEND_STRL("TRUE"));
		c.name_len = sizeof("TRUE");
		Z_LVAL(c.value) = 1;
		Z_TYPE(c.value) = IS_BOOL;
		zend_register_constant(&c TSRMLS_CC);

		c.name.s = zend_strndup(ZEND_STRL("FALSE"));
		c.name_len = sizeof("FALSE");
		Z_LVAL(c.value) = 0;
		Z_TYPE(c.value) = IS_BOOL;
		zend_register_constant(&c TSRMLS_CC);

		c.name.s = zend_strndup(ZEND_STRL("NULL"));
		c.name_len = sizeof("NULL");
		Z_TYPE(c.value) = IS_NULL;
		zend_register_constant(&c TSRMLS_CC);
так же смотрим http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?view=markup после объявлений ( за %%) и видим, что ключевым словом, ни true ни false не являются, увы.. хотя лично я тоже предпочитаю вариант в нижнем регистре :), уж простите, смотрится более привлекательно :D.
 

WP

^_^
Что и требовалось доказать.
mishco
Спасибо за поиск нужного кусочка.
 
Сверху