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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章