我想知道PHP中是否有某种方法可以复制Python属性/密钥访问的一些魔力。
我使用Steve Lacey编写的名为Minimongo的Mongo ORM类,在其中使用__getattr__
和__getitem__
重新路由密钥和属性风格的访问并保留'文档面向蒙古的本质。 val = doc.foo
和val = doc['foo']
等同。
我想知道PHP中是否存在类似的接口,允许更改从其继承的类处理对象访问的方式。我仔细查看了STL,找不到一个装满西装的人。这对于设置默认值非常有用。感谢。
答案 0 :(得分: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
Consistency Milord,就像你问的那样。
答案 1 :(得分:2)
你应该看一下PHP的魔术方法:http://php.net/manual/en/language.oop5.magic.php
__get()
,__set()
和__call()
可以做你想做的事。