Rumah  >  Artikel  >  pembangunan bahagian belakang  >  php数组中对象如何访问

php数组中对象如何访问

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼asal
2019-09-28 11:17:113284semak imbas

php数组中对象如何访问

如果在未做任何处理的情况下, 以数组的方式访问对象,会抛给你一个大大的错误。

Fatal error: Uncaught Error: Cannot use object of type Test as array

当然如果你对类进行一些改造的话,还是可以像数组一样访问。

如何访问受保护的对象属性

在正式改造之前,先看另一个问题。当我们试图访问一个受保护的属性的时候,也会抛出一个大大的错误。

Fatal error: Uncaught Error: Cannot access private property Test::$container

是不是受保护属性就不能获取?当然不是,如果我们想要获取受保护的属性,我们可以借助魔术方法__get。

相关推荐:《php数组

DEMO1

获取私有属性

<?php
class Test 
{
    private $container = [];
    public function __construct()
    {
        $this->container = [&#39;one&#39;=>1, &#39;two&#39;=>2, &#39;three&#39;=>3];
    }
    
    public function __get($name)
    {
        return property_exists($this, $name) ? $this->$name : null;
    }
}
$test = new Test();
var_dump($test->container);

DEMO2

获取私有属性下对应键名的键值。

<?php
class Test 
{
    private $container = [];
    
    public function __construct()
    {
        $this->container = [&#39;one&#39;=>1, &#39;two&#39;=>2, &#39;three&#39;=>3];
    }
    
    public function __get($name)
    {
        return array_key_exists($name, $this->container) ? $this->container[$name] : null;
    }
    
}
$test = new Test();
var_dump($test->one);

如何以数组的方式访问对象

我们需要借助预定义接口中的ArrayAccess接口来实现。接口中有4个抽象方法,需要我们实现。

<?php
class Test implements ArrayAccess
{
    private $container = [];
    public function __construct()
    {
        $this->container = [&#39;one&#39;=>1, &#39;two&#39;=>2, &#39;three&#39;=>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[&#39;one&#39;]);

如何遍历对象

其实对象在不做任何处理的情况下,也可以被遍历,但是只能遍历可见属性,也就是定义为public的属性。我们可以借助另一个预定义接口IteratorAggregate,来实现更为可控的对象遍历。

<?php
class Test implements IteratorAggregate
{
    private $container = [];
    public function __construct()
    {
        $this->container = [&#39;one&#39;=>1, &#39;two&#39;=>2, &#39;three&#39;=>3];
    }
    
    public function getIterator() {
        return new ArrayIterator($this->container);
    }
    
}
$test = new Test();
foreach ($test as $k => $v) {
    var_dump($k, $v);
}

Atas ialah kandungan terperinci php数组中对象如何访问. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:php能生成动态页面内容吗Artikel seterusnya:php能继承多个父类吗