php的ArrayAccess(数组式访问接口)

本文中的php版本:PHP Version 7.2.5


php中内置了6个常用的预定义接口,实现某些特定的能力。其中最常用的就是 ArrayAccess 了,像ThinkPHP、yii2、Laravel 等这种流行的php框架,框架的底层代码中都用到了 ArrayAccess。ArrayAccess接口 又被称为 数组式访问接口。

ArrayAccess 是个啥东西?

根据php的官方文档所述,它 提供 像 访问数组一样 访问对象 的能力 的接口。


ArrayAccess接口提供了4个方法,分别是:

ArrayAccess {
/* Methods */
abstract public boolean offsetExists ( mixed $offset )
abstract public mixed offsetGet ( mixed $offset )
abstract public void offsetSet ( mixed $offset , mixed $value )
abstract public void offsetUnset ( mixed $offset )
}

我们需要自己实现该接口中的4个方法,即可以访问数组的方式,去进行访问对象。让对象中的属性 也可以支持 以数组的方式 进行访问。

有什么用呢?

上面说的很明白啦,提供 像访问数组一样 访问对象的能力。用上了它,可以让一个类即可以支持对象引用,也支持数组引用。

上个demo

未实现ArrayAccess接口

<?php

class Develop
{
    public $elements;

    public function __construct()
    {
        $this->elements = ["language" => "php", "price" => 99];
    }
}

$develop = new Develop();

var_dump($develop['language']); //报错 Fatal error: xxx 不能以访问数组的形式 去访问对象。如果要实现这种访问方式,需要实现ArrayAccess接口中的方法。


实现ArrayAccess接口

<?php 

class Develop2 implements ArrayAccess
{
    public $elements;

    public function __construct()
    {
        $this->elements = ["language" => "php", "price" => 99];
    }

    public function offsetExists($offset)
    {
        // TODO: Implement offsetExists() method.
        return isset($this->elements[$offset]);
    }

    public function offsetGet($offset)
    {
        // TODO: Implement offsetGet() method.
        return $this->elements[$offset];
    }

    public function offsetSet($offset, $value)
    {
        // TODO: Implement offsetSet() method.
        $this->elements[$offset] = $value;
    }

    public function offsetUnset($offset)
    {
        // TODO: Implement offsetUnset() method.
        unset($this->elements[$offset]);
    }
}

$develop2 = new Develop2();
$develop2['desc'] = "世界上最好的编程语言"; //自动调用offsetSet

if(isset($develop2['desc'])) {        //自动调用offsetExists
    var_dump($develop2['language']);  //自动调用offsetGet
    unset($develop2['language']);     //自动调用offsetUnset
    var_dump($develop2['language']);  //输出:null
}

var_dump($develop2['desc']);  //输出:世界上最好的编程语言


这就是为什么在有的php框架中,某一个变量明明是一个对象类型的,但是你却可以 以访问数组的形式去访问对象,原因就是框架底层实现了ArrayAccess接口。



清醒时做事,糊涂时读书,大怒时睡觉,独处时思考



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复12人评论7,777人参与