• 技术文章 >后端开发 >PHP问题

    php数组中对象如何访问

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-09-28 11:17:11原创1238

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

    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 = ['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

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

    <?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);

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

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

    <?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']);

    如何遍历对象

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

    <?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);
    }

    以上就是php数组中对象如何访问的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 数组 对象 访问
    上一篇:php能生成动态页面内容吗 下一篇:php能继承多个父类吗
    PHP编程就业班

    相关文章推荐

    • php如何遍历二维数组• php数组是如何初始化• php如何给数组赋值• php如何把数组保存到redis中

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网