Офис НП AMWAY в Ярославле
Офис Амвей в Ярославле
На карте Офис AMWAY в ЯрославлеПрием и выдача заказов, презентация продукции Амвей, мастер–классы, вопросы по бизнесу Amway:
Адрес: улица Валентины Терешковой, дом 1 (Вход со двора)
Телефон: +7 (920) 112-00-91
Email: matyxho@mail.ru
Сайт: https://www.amway.ru/user/lebedem
Визитка: http://yar.meweb.ru
Иерархия статей
Статьи » Собственное мнение » isset и empty - функции? Нет!
Сниппет
Возник на одном из форумов спор об этом. Попробую привести доводы сторон и обосновать свою точку зрения.
isset и empty - функции? Нет!
Опубликовал  Pisatel Добавлено  20-08-2015 09:14 20 Август 2015 09:14:26 5128  Прочтений 5128 Прочтений  0 Комментариев 0 Комментариев
Обновлено: 31-08-2015 15:41 Обновлено: 31 августа 2015 15:41:19  printer
На одном форуме поднялся как–то срач вопрос, точнее изначально это было утверждение одного из пользователей: "isset и empty в PHP — это... функции!". Шта?!. Но в мануале же ясно сказано, что это языковые конструкции. ЯЗЫКОВЫЕ КОНСТРУКЦИИ, КАРЛ!. Пруф → empty() унд isset(). Читаем:
Цитата [ Отметить все ]
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.
Однако для спорившего гражданина мануал от разрабов PHP не являлся доказательством. В качестве аргумента (единственного, Карл!) данный гражданин привел мне код этих "функций" из исходников:

Код: C
void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */

{

zend_ast *var_ast = ast->child[0];



znode var_node;

zend_op *opline = NULL;



ZEND_ASSERT(ast->kind == ZEND_AST_ISSET || ast->kind == ZEND_AST_EMPTY);



if (!zend_is_variable(var_ast) || zend_is_call(var_ast)) {

if (ast->kind == ZEND_AST_EMPTY) {

/* empty(expr) can be transformed to !expr */

zend_ast *not_ast = zend_ast_create_ex(ZEND_AST_UNARY_OP, ZEND_BOOL_NOT, var_ast);

zend_compile_expr(result, not_ast);

return;

} else {

zend_error_noreturn(E_COMPILE_ERROR,

"Cannot use isset() on the result of an expression "

"(you can use \"null !== expression\" instead)");

}

}



switch (var_ast->kind) {

case ZEND_AST_VAR:

if (zend_try_compile_cv(&var_node, var_ast) == SUCCESS) {

opline = zend_emit_op(result, ZEND_ISSET_ISEMPTY_VAR, &var_node, NULL);

opline->extended_value = ZEND_FETCH_LOCAL | ZEND_QUICK_SET;

} else {

opline = zend_compile_simple_var_no_cv(result, var_ast, BP_VAR_IS, 0);

opline->opcode = ZEND_ISSET_ISEMPTY_VAR;

}

break;

case ZEND_AST_DIM:

opline = zend_compile_dim_common(result, var_ast, BP_VAR_IS);

opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ;

break;

case ZEND_AST_PROP:

opline = zend_compile_prop_common(result, var_ast, BP_VAR_IS);

opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ;

break;

case ZEND_AST_STATIC_PROP:

opline = zend_compile_static_prop_common(result, var_ast, BP_VAR_IS, 0);

opline->opcode = ZEND_ISSET_ISEMPTY_VAR;

break;

EMPTY_SWITCH_DEFAULT_CASE()

}



result->op_type = opline->result_type = IS_TMP_VAR;

opline->extended_value |= ast->kind == ZEND_AST_ISSET ? ZEND_ISSET : ZEND_ISEMPTY;

}

/* }}} */




Хорошо, это похоже на функции... Однако:
Цитата [ Отметить все ]
Список ключевых слов

У этих слов есть специальное значение в PHP. Некоторые из них представляют собой вещи, которые выглядят как функции, некоторые похожи на константы и так далее, но они ими не являются в действительности. Они - конструкции языка. Вы не можете использовать следующие слова как константы, имена классов, функции или имена методов. Использование их как имен переменных в общем допускается, однако может привести к путанице.
Пруф → тынц!. Ищем... Сцуко, и empty, и isset на месте! Нужное нам на данном этапе: "... выглядят как функции... но они ими не являются в действительности". Не являются, Карл! Ну вот как этому гражданину доказать?! Слушать он ничего не хочет: функции, и все тут, хоть ты апстену йопнись! Далее мне был приведен еще "факт", вот он: http://php.net/manual/ru/function.empty.php && http://php.net/manual/ru/function.isset.php. Нужное я пометил. То есть, по логике этого гражданина, ключевое слово в ссылке мана является весомым доказательством его версии. Что ж, коли так... Привожу ему контрдовод: http://php.net/manual/ru/function.echo.php. Шта?! echo тоже функция?! Неубедительно, согласитесь.

Еще один аргумент (забегая вперед скажу, что он не возымел действия на гражданина, как, впрочем, и все остальные) — мы можем банально проверить все объявленные функции, воспользовавшись информационной функцией PHP get_defined_functions(). Выглядеть это может примерно таГ:

Код: PHP
    $array = get_defined_functions();

echo var_dump($array);




И шо? Зуб даю: глаза поломаете, но не найдете в массиве ни isset, ни empty... Из всего вышеизложенного, на мой взгляд, следует только одна истина:

Ни isset(), ни empty() не являются функциями. Это — языковые конструкции языка программирования PHP. Аминь. ©

В качестве консенсуса одним из пользователей (неплохо шарящим в пыхе, надо отметить) была предложена следующая формулировка:
Цитата [ Отметить все ]
Языковые конструкции пхп это просто зарезервированные функции
. Пожалуй, это ближе к истине, однако лишь отчасти, имхо. Никто не ставит под сомнение факт того, что эти языковые конструкции ведут себя как функции, речь шла и идет лишь о формулировке, о терминологии.

Ну что ж, вот мы и подошли к вилке–twix: попробуй обе палочки и реши, на чьей стороне ты. Доводы "за" и "против" я привел. Удачи!
Понравилась статья?
Метки для данной статьи
Похожие статьи
Поделиться:   
Комментарии
Нет комментариев.
Добавить комментарий
Имя:

Проверочный код:
Последние активные темы форума
  Темы Просмотров Ответов Последние сообщения
folder Плагин Email рассылки Mail To All by Pisatel
CMS PHP Fusion
13257 33 promask
27. апреля 2019
folder Вопрос по переделке bb-кода
PHP, MySQL
3331 5 Pisatel
26. мая 2017
folder Вопросы по Ajax форме обратной связи
CMS PHP Fusion
13801 48 Ditrin
19. февраля 2017
folder BBCode YouTube Video Colorbox mod
CMS PHP Fusion
7707 2 Pisatel
10. декабря 2016
folder Как лучше создать собственную страницу?
CMS PHP Fusion
7056 17 Pisatel
11. мая 2016
folder Небольшие вопросы по скриптам магазина и катало...
PHP, MySQL
52716 80 Pisatel
11. января 2016
folder BBCode Code mod
CMS PHP Fusion
4027 0 Pisatel
31. августа 2015
folder Ajax Like Dislike Article Panel
CMS PHP Fusion
8159 16 Pisatel
07. июля 2015
folder Хлебные крошки / BreadCrumbs SEO Panel
CMS PHP Fusion
9199 17 Pisatel
04. июля 2015
folder Abbr Description BBCode
CMS PHP Fusion
3042 0 Pisatel
15. июня 2015
folder Подозрительный трафик и прочие страшилки
Всякая хрень
5705 2 Ditrin
23. апреля 2015
folder Мод Newsletter - рассылка писем пользователям с...
CMS PHP Fusion
7728 13 Pisatel
10. апреля 2015
folder Мод отправки писем PHPMailer для PHP-Fusion
CMS PHP Fusion
41279 113 Ditrin
06. апреля 2015
folder Появление неизвестного файла subscriptions.php
CMS PHP Fusion
3720 2 Pisatel
06. апреля 2015
folder Autoban on IP
CMS PHP Fusion
13635 13 Pisatel
03. апреля 2015