If you access an object as an array without any processing, a big error will be thrown to you.
Fatal error: Uncaught Error: Cannot use object of type Test as array
Of course, if you make some modifications to the class, you can still access it like an array.
How to access protected object properties
Before the formal transformation, let’s look at another question. A big error will also be thrown when we try to access a protected property.
Fatal error: Uncaught Error: Cannot access private property Test::$container
Is it true that protected attributes cannot be obtained? Of course not, if we want to get a protected attribute, we can use the magic method __get.
Related recommendations: "php array"
DEMO1
Get private attributes
<?php class Test { private $container = []; public function __construct() { $this->container = ['one'=>1, 'two'=>2, 'three'=>3]; } public function __get($name) { return property_exists($this, $name) ? $this->$name : null; } } $test = new Test(); var_dump($test->container);
DEMO2
Get the key value of the corresponding key name under the private attribute.
<?php class Test { private $container = []; public function __construct() { $this->container = ['one'=>1, 'two'=>2, 'three'=>3]; } public function __get($name) { return array_key_exists($name, $this->container) ? $this->container[$name] : null; } } $test = new Test(); var_dump($test->one);
How to access objects as an array
We need to use the ArrayAccess interface in the predefined interface to achieve this. There are 4 abstract methods in the interface that we need to implement.
<?php class Test implements ArrayAccess { private $container = []; public function __construct() { $this->container = ['one'=>1, 'two'=>2, 'three'=>3]; } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetGet($offset){ return isset($this->container[$offset]) ? $this->container[$offset] : null; } public function offsetSet($offset, $value) { if(is_null($offset)){ $this->container[] = $value; }else{ $this->container[$offset] = $value; } } public function offsetUnset($offset){ unset($this->container[$offset]); } } $test = new Test(); var_dump($test['one']);
How to traverse objects
In fact, objects can also be traversed without any processing, but only visible properties can be traversed, which is defined as public properties. We can use another predefined interface IteratorAggregate to achieve more controllable object traversal.
<?php class Test implements IteratorAggregate { private $container = []; public function __construct() { $this->container = ['one'=>1, 'two'=>2, 'three'=>3]; } public function getIterator() { return new ArrayIterator($this->container); } } $test = new Test(); foreach ($test as $k => $v) { var_dump($k, $v); }
The above is the detailed content of How to access objects in php array. For more information, please follow other related articles on the PHP Chinese website!