php反射API

php反射

  • PHP 5提供了一个完整的反射API,可以对类、接口、函数、方法和扩展进行反向工程
  • 找到一个对象出发地和来源的一个过程,通俗来讲就是可以根据这个对象,知道它所属的类,拥有哪些方法。

PHP类

 <?php
 class person{
     public $name;
     public $age;
     public $sex;
 
     public function say()
     {
         echo $this->name.$this->age;
     }
 
     public function set($name,$value)
     {
         $this->$name = $value;
     }
 
     public function getSex()
     {
         echo $this->sex;
     }
 }
 
 $stu = new person();
 $stu->name = 'test';
 $stu->age = 28;
 $stu->sex = 'girl';
 $stu->say();
 var_dump($stu);

php反射类

//获得对象的属性列表
$reflect = new ReflectionObject($stu);
$props = $reflect->getProperties();
foreach ($props as $key_p => $value_p) {
    var_dump($value_p->getName());
}
//获得对象的方法列表
$method = $reflect->getMethods();
foreach ($method as $key_m => $value_m) {
    var_dump($value_m->getName());
}

laravel依赖注入使用的反射

class User 
{
    protected $log;

    public function __construct(FileLog $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
        // 登录成功,记录登录日志
        echo 'login success...';
        $this->log->write();
    }

}

function make($concrete){

    $reflector = new ReflectionClass($concrete);
    $constructor = $reflector->getConstructor();
    // 为什么这样写的? 主要是递归。比如创建FileLog不需要传入参数。
    if(is_null($constructor)) {
        return $reflector->newInstance();
    }else {
        // 构造函数依赖的参数
        $dependencies = $constructor->getParameters();
        // 根据参数返回实例,如FileLog
        $instances = getDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

}

function getDependencies($paramters) {
    $dependencies = [];
    foreach ($paramters as $paramter) {
        $dependencies[] = make($paramter->getClass()->name);
    }
    return $dependencies;
}

$user = make('User');
$user->login();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章