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