为什么我可以使用非打印字符定义PHP函数?

时间:2013-11-01 07:02:50

标签: php non-printing-characters

我一直认为所有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.";
}

然而,当显示它的文档具有声明的内容类型UTF8时,由rawurldecode('%E2%80%A9')显示的字符也可用于定义函数。

在不显示隐藏字符的文本编辑器中,它最终看起来该函数已被定义为function () {,然后可以通过调用(看起来不多于();来执行该函数

我无法粘贴源代码并让它仍然正常显示,所以这里有一些截图。第一个是我浏览器中显示内容的屏幕截图,第二个是我的文本编辑器(TextWrangler)中显示的实际源代码的屏幕截图,其中显示隐藏字符已打开:

浏览器:


enter image description here


源代码:


enter image description here

我的问题:这是故意的吗?我是否应该能够使用非打印字符定义函数/变量,并且仍然能够完美地工作?如果是这样,它是否在某处记录?

我找不到任何关于它的信息,但我(显然)并不知道一切。

谢谢!

1 个答案:

答案 0 :(得分:1)

来自manual

  

函数名称遵循与PHP中其他标签相同的规则。一个有效的   函数名称以字母或下划线开头,后跟任何字符   字母,数字或下划线的数量。作为正则表达式,   它将如此表达:[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *。

正如other answer linked中所解释的那样,正则表达式是每字节字节应用的,允许“许多奇怪的Unicode名称”。

这样做有一些像你见过的副作用。但是,我无法想象这是PHP背后的人的最初意图,它只是他们实现它的方式的直接结果。