2010-03-25 72 views
1

我使用PHP的魔術__set__get方法來訪問類中的私有數組。該類的使用可以包括「設置」新的屬性以及使用現有的屬性。我想確保創建或要求(即$myObj->FakeProperty)的屬性名稱根據以下規則是有效的:正則表達式:RegEx用於確定有效的PHP類屬性名稱?

  1. 屬性名稱必須以字母開頭或下劃線[A-Z_]
  2. 如果它開始用下劃線,它必須跟
  3. 只要前兩個規則得到滿足的一封信中,名稱可以包含任何的[A-Z0-9 _]

我現在的正則表達式是不是做訣竅;與我的測試值,_12總是通過裂縫。

測試區:

albert12 
12Albert 
_12 
_Albert12 
_12Albert 
_____a_1 

正則表達式:

^(?=_*[A-z]+)[A-z0-9_]+$ 
+0

你希望只允許那些還允許類定義,就像'公共$標識符標識; '?還有其他方法來定義(公共)屬性,例如'$ x =新的StdClass; $ x - > {'12'} = 12; var_dump($ x);'是有效的並且正在工作。確切地說,你爲什麼要先測試它們?要麼他們出席/宣佈/定義,要麼他們不是。 – VolkerK 2010-03-25 22:38:57

回答

4

根據docs,以下將匹配任何有效的PHP標識符

/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/ 
+0

假設這將與preg_match一起使用,請不要忘記'D'修飾符。 – salathe 2010-03-25 22:54:45

+0

感謝您的參考,這是有益的..我忘記了在文檔中的那一頁。我正在調整一下,但這是我將要使用的解決方案。感謝stereofrog。 – 2010-03-26 20:20:13

3

/^[a-z_][a-z0-9_]+$/i

+0

這有效,它基本上就是我將要使用的。你和stereofrog有效地提供了相同的答案,但是我將它提供給了sf以提供官方文檔的鏈接。謝謝! – 2010-03-26 20:21:56

2

爲了完整起見,您應該意識到您可以使用名稱中的任何內容創建屬性,但稍後可能會破壞其他內容。考慮以下工作例如:

 
class Test { 
    function __construct() { 
     $this->{" `[email protected]#$%^&*()-_=+[]{},./?;:'\""} = "Don't try this in production code."; 
    } 
} 

var_dump(new Test); 
+0

不錯的一個------ – Gordon 2010-03-25 23:18:06

+0

我這樣做主要是爲了方便地訪問簡單的數據庫字段名稱。我並不關心(而且坦率地說寧願避免)真正複雜的標識符,只是簡單的標識符,比如'$ myObj-> simpleVar'。 – 2010-03-26 20:18:54

1

也許我失去了一些東西,但__get和__set當你已經試圖訪問一個語法上有效PROPERTYNAME是通過對象的公共API無法只觸發。如果你想確保你正在試圖訪問該元素的私有數組中存在,則使用array_key_exists

class Foo { 
    protected $data = array(
    'bar' => 'baz' 
    ); 
    public function __get($name) 
    { 
     if(array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 
     throw new BadMethodCallException('Invalid property'); 
    } 
} 

$obj = new Foo; 
$obj->123; // Syntax Error => __get won't be called 
$obj->foo; // valid syntax, but not in array => BadMethodCall Exception 
$obj->bar; // returns baz 
+0

我還允許以這種方式設置「新」屬性,所以我試圖在「__set」而不是「__get」中捕獲有效標識符。 – 2010-03-26 20:17:30

+0

噢,我相信你是對的,得到和設置不會讓你創建一個無效的變量,所以我可以把它留在我的情況。但指出的場景太多php也是一個問題;我寧願阻止瘋狂的屬性名稱,正則表達式也會提供幫助。謝謝你的幫助。 – 2010-03-26 20:24:39

相關問題