Офис НП 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 Pisatel Добавлено  20-08-2015 09:14 20 Август 2015 09:14:26 9418  Прочтений 9418 Прочтений
Обновлено: 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 Вопрос по переделке bb-кода
PHP, MySQL
22587 5 Pisatel
26. мая 2017
folder Вопросы по Ajax форме обратной связи
CMS PHP Fusion
70052 48 Ditrin
19. февраля 2017
folder BBCode YouTube Video Colorbox mod
CMS PHP Fusion
15537 2 Pisatel
10. декабря 2016
folder Как лучше создать собственную страницу?
CMS PHP Fusion
18131 17 Pisatel
11. мая 2016
folder Небольшие вопросы по скриптам магазина и катало...
PHP, MySQL
147698 80 Pisatel
11. января 2016
folder BBCode Code mod
CMS PHP Fusion
14641 0 Pisatel
31. августа 2015
folder Ajax Like Dislike Article Panel
CMS PHP Fusion
22844 16 Pisatel
07. июля 2015
folder Хлебные крошки / BreadCrumbs SEO Panel
CMS PHP Fusion
26588 17 Pisatel
04. июля 2015
folder Abbr Description BBCode
CMS PHP Fusion
7746 0 Pisatel
15. июня 2015
folder Плагин Email рассылки Mail To All by Pisatel
CMS PHP Fusion
37598 32 Pisatel
26. апреля 2015
folder Подозрительный трафик и прочие страшилки
Всякая хрень
11920 2 Ditrin
23. апреля 2015
folder Мод Newsletter - рассылка писем пользователям с...
CMS PHP Fusion
31228 13 Pisatel
10. апреля 2015
folder Мод отправки писем PHPMailer для PHP-Fusion
CMS PHP Fusion
131183 113 Ditrin
06. апреля 2015
folder Появление неизвестного файла subscriptions.php
CMS PHP Fusion
8927 2 Pisatel
06. апреля 2015
folder Autoban on IP
CMS PHP Fusion
23364 13 Pisatel
03. апреля 2015