看看__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
一致性老爺,完全按照自己的要求。
+1爲好問題,簡單本身,但需要優雅:-)看到我的答案;-) – Flavius 2012-01-04 22:00:01