Мне было интересно, есть ли какой-то способ в PHP, чтобы дублировать некоторые из магии доступа к атрибутам / ключам Python.
Я использую класс Mongo ORM, написанный Стивом Лэйси под названием Minimongo, в котором он использует __getattr__
и __getitem__
чтобы перенаправить ключ и __getitem__
ароматизированный доступ и сохранить «ориентированный на документ» характер Монго. val = doc.foo
и val = doc['foo']
становятся эквивалентными.
Мне было интересно, существует ли подобный интерфейс в PHP, который позволит изменять способ доступа к объекту для класса, который наследует его. Я просмотрел STL и не смог найти тот, который заполнял костюм. Было бы очень полезно настроить настройки по умолчанию. Благодарю.
Посмотрите на __get () и __set () и ArrayAccess .
С первым вы можете сделать доступными непубличные члены, как в $obj->foo
, а с последним вы можете получить к ним доступ, как $obj['foo']
.
Вы можете их обмануть, как хотите, внутренне.
Лично я бы предложил вам сохранить эти магически доступные свойства в один член массива класса, поэтому вы не получите код спагетти.
РОС:
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
Согласие Милорд, точно так же, как вы просили.
Вы должны взглянуть на магические методы PHP: http://php.net/manual/en/language.oop5.magic.php
__get()
, __set()
и __call()
могут делать то, что вы хотите.