2013-11-01 48 views
1

我一直覺得所有的php函數都必須以[a-zA-Z]開頭。爲什麼我可以用非打印字符定義PHP函數?

舉例來說,這會工作:

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)內:

瀏覽器:


enter image description here


源代碼:


enter image description here

我的問題:這是故意的嗎?我應該能夠用非打印字符來定義函數/變量,並且仍然能夠完美地工作嗎?如果是這樣,是否記錄在某處?

我找不到任何有關它的信息,但我(顯然)不知道所有的東西。

謝謝!

+1

[PHP變量,方法,類等名稱中的有效字符是什麼?](http://stackoverflow.com/questions/17973357/what-are-the-valid-characters-in-php -variable-method-class-etc-names) –

+1

@AlmaDo我不認爲它是重複的,因爲我看不到這個問題的直接答案 – eis

+0

然後你最好再讀一遍。沒有冒犯,但沒有比這更明確和普遍的答案,我認爲(因爲這包括常見情況和所有限制) –

回答

1

manual

函數名遵循相同的規則,如PHP等標籤。一個有效的 函數名稱以字母或下劃線開頭,後面跟着任意數字的字母,數字或下劃線。作爲一個正則表達式,它將如下表示:[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *。

正如在other answer linked中所解釋的,正則表達式應用於byte-per-byte,允許「許多奇怪的Unicode名稱」。

這樣做有一些副作用,如你見過。但是,我無法想象這是PHP背後人們的初衷,這只是他們實施它的方式的直接結果。

+0

那麼...爲什麼不可打印的字符工作? – deceze

+0

我真的建議你重新閱讀NikiC的帖子。 (提示:'_注意這個正則表達式應用於每字節字節,而不考慮編碼。這就是爲什麼它也[也允許許多奇怪的Unicode名稱](http://stackoverflow.com/questions/3417180/exotic-names- for-methods-constants-variables-and-fields-bug-or-feature)_' - 作爲引用從那裏) –

+0

@AlmaDo我做到了。它很好地解釋了目前的規則是什麼,但它並不能真正解釋行爲是否意圖*。 – eis

相關問題