2012-01-04 97 views
4

我想知道是否有某種方式在PHP中複製一些Python屬性/鍵訪問的魔力。python的魔術PHP方法__getattr __()

我用Steve Lacey寫的蒙戈ORM類稱爲Minimongo,他利用__getattr____getitem__重新路由密鑰和屬性風味的訪問和保存蒙戈的「面向文檔的」性質。 val = doc.fooval = doc['foo']等價。

我想知道在PHP中是否有類似的接口,允許改變如何處理從它繼承的類的對象訪問。我瀏覽了STL,找不到一件西裝。這對設置默認值非常有用。謝謝。

+0

+1爲好問題,簡單本身,但需要優雅:-)看到我的答案;-) – Flavius 2012-01-04 22:00:01

回答

9

看看__get() and __set()ArrayAccess

與前者可以讓非公開成員accessbile,如$obj->foo,與後者,你可以訪問他們像$obj['foo']

無論你喜歡,你都可以在內部硬連線。

就我個人而言,我建議您將這些神奇的訪問屬性保存到類的單個數組成員中,這樣您就不會得到意大利麪代碼。

POC:

1 <?php 
2 class Magic implements ArrayAccess { 
3 
4  protected $items = array(); 
5 
6  public function offsetExists($key) { 
7   return isset($this->items[$key]); 
8  } 
9  public function offsetGet($key) { 
10   return $this->items[$key]; 
11  } 
12  public function offsetSet($key, $value) { 
13   $this->items[$key] = $value; 
14  } 
15  public function offsetUnset($key) { 
16   unset($this->items[$key]); 
17  } 
18 
19  //do not modify below, this makes sure we have a consistent 
20  //implementation only by using ArrayAccess-specific methods 
21  public function __get($key) { 
22   return $this->offsetGet($key); 
23  } 
24  public function __set($key, $value) { 
25   $this->offsetSet($key, $value); 
26  } 
27  public function __isset($key) { 
28   return $this->offsetExists($key); 
29  } 
30  public function __unset($key) { 
31   $this->offsetUnset($key); 
32  } 
33 } 
34 
35 //demonstrate the rountrip of magic 
36 $foo = new Magic; 
37 $foo['bar'] = 42; 
38 echo $foo->bar, PHP_EOL;//output 42 
39 $foo->bar++; 
40 echo $foo['bar'];//output 43 
41 

一致性老爺,完全按照自己的要求。

+0

這工作完美。基本上我想要做的是創建一個類,可以從調用stdClass到json_decode並允許這種訪問,但默認情況下返回false,如果一個鍵不存在。無模式數據明確要求這樣做。它真的解除了現在在我的PHP中有這種失敗安全的負擔......我喜歡Python。 – DeaconDesperado 2012-01-05 13:36:01