站长资讯网
最全最丰富的资讯网站

手写PHP API框架(三)之反射介绍

上一篇《手写PHP API框架之Composer的安装使用(二)》文章中我们介绍了Composer的安装使用,这一文我们来介绍一下有关反射的概念介绍。

反射,直观理解就是根据到达地找到出发地和来源。 反射指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。

不妨先来看一个demo:

<?php   function p($msg, $var) {     echo($msg.":".print_r($var, true)).PHP_EOL.PHP_EOL; }   class Demo {     private $id;      protected $name;      public $skills = [];      public function __construct($id, $name, $skills = [])     {         $this->id = $id;         $this->name = $name;         $this->skills = $skills;     }      public function getName()     {         return $this->name;     }     public function getSkill()     {         p('skill', $this->skills);     } }   $ref = new ReflectionClass('Demo'); if ($ref->isInstantiable()) {     p('检查类是否可实例化isInstantiable', null); } $constructor = $ref->getConstructor(); p('获取构造函数getConstructor', $constructor);  $parameters = $constructor->getParameters(); foreach ($parameters as $param) {     p('获取参数getParameters', $param); }  if ($ref->hasProperty('name')) {     $attr = $ref->getProperty('name');     p('获取属性getProperty', $attr); }  $attributes = $ref->getProperties(); foreach ($attributes as $row) {     p('获取属性列表getProperties', $row->getName()); }  if ($ref->hasMethod('getSkill')) {     $method = $ref->getMethod('getSkill');     p('获取方法getMethod', $method); }  $methods = $ref->getMethods(); foreach ($methods as $row) {     p('获取方法列表getMethods', $row->getName()); }  $instance = $ref->newInstanceArgs([1, 'sai', ['php', 'js']]); p('newInstanceArgs', $instance);
登录后复制

输出:

➜  php git:(main) php reflect.php   检查类是否可实例化isInstantiable:  获取构造函数getConstructor:ReflectionMethod Object (     [name] => __construct     [class] => Demo )   获取参数getParameters:ReflectionParameter Object (     [name] => id )   获取参数getParameters:ReflectionParameter Object (     [name] => name )   获取参数getParameters:ReflectionParameter Object (     [name] => skills )   获取属性getProperty:ReflectionProperty Object (     [name] => name     [class] => Demo )   获取属性列表getProperties:id  获取属性列表getProperties:name  获取属性列表getProperties:skills  获取方法getMethod:ReflectionMethod Object (     [name] => getSkill     [class] => Demo )   获取方法列表getMethods:__construct  获取方法列表getMethods:getName  获取方法列表getMethods:getSkill  newInstanceArgs:Demo Object (     [id:Demo:private] => 1     [name:protected] => sai     [skills] => Array         (             [0] => php             [1] => js         )  )
登录后复制

demo里面就有使用了ReflectionClass类,当然ReflectionClass类不止于这些方法。

赞(0)
分享到: 更多 (0)