PHP: Что такое языковые конструкции и зачем они нам нужны?

Я все время встречаю такие заявления, как:

  • «echo – это языковая конструкция, но print – функция и, следовательно, имеет возвращаемое значение»
  • «смерть – это языковая конструкция»

Мой вопрос в том, что это за языковые конструкции и что еще важнее, зачем они нам нужны?

Языковые конструкции жестко закодированы на языке PHP. Они не играют по обычным правилам.

Например, всякий раз, когда вы пытаетесь получить доступ к переменной, которая не существует, вы получите сообщение об ошибке. Чтобы проверить, существует ли переменная до ее доступа, вам необходимо обратиться к isset или empty :

 if (isset($foo)) 

Если isset был нормальной функцией, вы также получите предупреждение, так как вы получаете доступ к $foo чтобы передать его в функцию isset . Так как isset – это языковая конструкция, это работает без предупреждения. Вот почему документация дает четкое различие между нормальными функциями и языковыми конструкциями.

Языковые конструкции – это то, что составляет язык: такие вещи, как «если», «для», «пока», «функция» и т. Д.

В руководстве по PHP упоминаются такие вещи, как «echo», «die» или «return», чтобы было ясно, что это НЕ функции и что они не всегда ведут себя как функции.

Вы можете назвать «эхо» как «echo ()», чтобы он мог запутать новичков. Вот почему они дали четкое различие в руководстве. Сделать это абсолютно ясно всем.

Другими примерами языковых конструкций, которые могут быть ошибочно приняты за функции, являются «array ()», «list ()» и «each ()».

Не все языки могут быть функциями. Должна быть какая-то база, где-то, на которой вы реализуете эти первые функции. Элементами этой базы являются языковые конструкции (поочередно, встроенные ). Они не всегда ведут себя как «нормальные» функции.

Чтобы понять ответ на этот вопрос, вы должны понимать, как работают парсеры. Язык определяется синтаксисом, а синтаксис определяется ключевыми словами.

Языковые конструкции – это фрагменты кода, которые составляют основу языка PHP. Парсер рассматривает их непосредственно вместо функций.

Некоторые вещи просто невозможно использовать с помощью обычных функций, рассмотрим этот фрагмент:

list($el1, $el2) = array('el1', 'el2');

Что он делает, так это то, что он берет элементы из неассоциативного массива и присваивает значения переменным, определенным в конструкции list() .

Просто не может быть сделано с функциями 🙂

Более тонкий пример isset и empty . Хотя они выглядят как функции, они одна вещь, которая невозможна только с функциями – они не генерируют уведомления «переменная не определена» или «неопределенный индекс».

языковые конструкции могут быть сформированы более чем одним способом и имеют возвращаемую стоимость

print("asdf"); насколько возможно, как print "asdf"; и вернется 1.

echo("asdf"); равно echo "asdf;" но не имеет возвратной стоимости.

die("asdf"); равен exit("asdf"); и не имеет возвратной стоимости.