PHP approach to python magic __getattr __ ()

I was wondering if there is any way in PHP to duplicate some of the magical possibilities of accessing Python attributes / keys.

I use the Mongo ORM class, written by Steve Lacey , called Minimongo , in which it uses __getattr__ and __getitem__ to redirect the key and assign an access attribute and preserve the "document-oriented" character of Mongo. val = doc.foo and val = doc['foo'] become equivalent.

I was wondering if there is a similar interface in PHP that will allow you to change the way an object is accessed for a class that inherits from it. I looked at the STL and could not find the one that filled the suit. It would be very helpful to configure the default settings. Thanks.

+4
source share
2 answers

See __ get () and __set () and ArrayAccess .

With the former you can make non-public members available, as in $obj->foo , with the latter you can access them like $obj['foo'] .

You can trick them, as you wish, internally.

Personally, I suggest that you store these magically accessible properties in one member of the class array, so you won’t get the spaghetti code.

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, just as you requested.

+9
source

You should take a look at the PHP magic methods: http://php.net/manual/en/language.oop5.magic.php

__get() , __set() and __call() can do what you want.

+2
source

Source: https://habr.com/ru/post/1389358/


All Articles