Почему я могу определить функцию PHP с непечатаемым символом?

У меня всегда было впечатление, что все функции php должны начинаться с [a-zA-Z].

Например, это будет работать:

function a1() {
  return "Something, because I'm written properly.";
}

... в то время как это не будет:

function 1a() {
  return "Nothing, because you'll encounter an error before this function ever runs.";
}

Однако символ, отображаемый в результате rawurldecode('%E2%80%A9'), когда отображающий его документ имеет объявленный тип содержимого UTF8, также может использоваться для определения функции.

В текстовом редакторе, который не отображает скрытые символы, в конечном итоге выглядит так, что функция была определена как function () {, которую затем можно выполнить, вызвав (что кажется не более чем) ();

Я не могу вставить исходный код, и он по-прежнему отображается правильно, поэтому вот несколько скриншотов. Первый — это снимок экрана того, что было отображено в моем браузере, а второй — это снимок экрана фактического исходного кода, отображаемого в моем текстовом редакторе (TextWrangler) с включенным параметром Отображать скрытые символы:

Браузер:


введите здесь описание изображения


Исходный код:


введите здесь описание изображения

Мой вопрос: это сделано намеренно? Должен ли я иметь возможность определять функции/переменные с непечатаемыми символами и при этом обеспечивать их безупречную работу? И если да, то задокументировано ли это где-нибудь?

Я не мог найти никакой информации об этом, но я (очевидно) не знаю всего.

Спасибо!


person jerdiggity    schedule 01.11.2013    source источник
comment
comment
@AlmaDo Я не думаю, что это дубликат, так как я не вижу прямого ответа на этот вопрос.   -  person eis    schedule 01.11.2013
comment
Тогда вам лучше прочитать это снова. Без обид, но я думаю, что нет более четкого и общего ответа, чем этот (потому что это включает в себя общий случай и все ограничения)   -  person Alma Do    schedule 01.11.2013
comment
@AlmaDo этот ответ объясняет, что разрешено, а что нет. Это не объясняет, намеренно это или нет, о чем здесь спрашивали.   -  person eis    schedule 01.11.2013


Ответы (1)


Из руководства:

Имена функций подчиняются тем же правилам, что и другие метки в PHP. Допустимое имя функции начинается с буквы или знака подчеркивания, за которым следует любое количество букв, цифр или знаков подчеркивания. В качестве регулярного выражения это будет выглядеть так: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*.

Как объяснено в другом ответе, связанном регулярное выражение применяется побайтно, что позволяет использовать «множество странных имен Unicode».

Выполнение этого таким образом имеет некоторые побочные эффекты, которые вы видели. Однако я не могу представить, что это было первоначальным намерением людей, стоящих за PHP, это было бы просто прямым следствием того, как они его реализовали.

person eis    schedule 01.11.2013
comment
Я действительно предлагаю вам перечитать пост NikiC. (Подсказка: «Обратите внимание, что это регулярное выражение применяется побайтно, без учета кодировки. Вот почему оно также также допускает множество странных имен Unicode' - как цитата оттуда) - person Alma Do; 01.11.2013
comment
@AlmaDo Я сделал. Это хорошо объясняет, каковы текущие правила, но на самом деле не объясняет, является ли поведение преднамеренным или нет. - person eis; 01.11.2013
comment
Я не знаю, как это прокомментировать. Если это определено в самом PHP, тогда да, это сделано намеренно. И этот пост разъясняет, что это разрешено в PHP, а также показывает, почему я не знаю, как это объяснить, если вам это непонятно. Что ж, у нас у всех есть свое мнение, так что вы вольны думать, как хотите. - person Alma Do; 01.11.2013
comment
Каждая ошибка реализации в PHP также будет определена в самом PHP. Регулярное выражение предназначено так, как оно задокументировано, но сравнение байтов без учета набора символов может быть просто ошибкой реализации. Но ладно, тогда мы просто не согласимся. - person eis; 01.11.2013