Офис НП 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 9855  Прочтений 9855 Прочтений
Обновлено: 31-08-2015 15:41 Обновлено: 31 августа 2015 15:41:19  printer
На одном форуме поднялся как–то срач вопрос, точнее изначально это было утверждение одного из пользователей: "isset и empty в PHP — это... функции!". Шта?!. Но в мануале же ясно сказано, что это языковые конструкции. ЯЗЫКОВЫЕ КОНСТРУКЦИИ, КАРЛ!. Пруф → empty() унд isset(). Читаем:
Цитата [ Отметить все ]
Замечание: Поскольку это языковая конструкция, а не функция, она не может вызываться при помощи переменных функций.
Однако для спорившего гражданина мануал от разрабов PHP не являлся доказательством. В качестве аргумента (единственного, Карл!) данный гражданин привел мне код этих "функций" из исходников:

Код: C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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
1
2
$array = get_defined_functions();
   echo var_dump($array);


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

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

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

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