本文中的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接口。
清醒时做事,糊涂时读书,大怒时睡觉,独处时思考
声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。