Laravel 中 实例对象属性按数组方式访问的秘密

阅读数: 570 2018年07月04日

Laravel 是 PHP 的经典案例、知识宝库、实践案例。

在 Laravel 会发现一些很巧妙,且不常见的 PHP 高级用法,因为没用过,也不知道,看起来确实很神秘。

在 Laravel Model 中,查出的数据,即可用对象属性方式访问,还能用数组方式访问。


查看 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php 代码发现:

Model.php 实现了 __get() 魔术方法,并实现了 ArrayAccess 接口。

马上查阅下PHP手册,只有针对 ArrayAccess::offsetExists、ArrayAccess::offsetGet、ArrayAccess::offsetSet、ArrayAccess::offsetUnset 的介绍,其实类只要实现这些方法即可。


立刻做个实验:

$name;
   }

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

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

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

   public function offsetUnset($offset) {
      // TODO: Implement offsetUnset() method.
   }

}


$obj = new obj();
echo $obj['name'];


打印结果:

D:\web\test>php class.php
peter


在 Laravel 里面大量使用了这种方法,让代码使用起来非常方便,但如果不知道原理,也会带来困扰。

phpriji.cn | 网站地图 | 沪ICP备17015433号-1