在php運行時,擴展分析程序,導出或提出關於類、方法、屬性、參數等的詳細信息,包括註釋。這種動態獲取信息以及動態調用方法的功能稱爲反射API.
<?php
/**
* @author zhuxinlei
* @date 2020-06-12
* @desc 我是類A的註釋
*/
class A
{
//我是構造函數的註釋
public function __construct(B $b)
{
$this->b = $b;
}
//我是getB的註釋
public function getB()
{
$this->b->bMethod();
}
}
class B
{
public function __construct(C $c,D $d)
{
$this->c = $c;
$this->d = $d;
}
public function bMethod()
{
echo "我是B中的方法bMethod()";
}
}
class C{
public function __construct(){
}
public function cMethod(){
echo "我是C中的方法cMethod()";
}
}
class D{
public function __construct(){
}
public function dMethod(){
echo "我是D中的方法dMethod()";
}
}
class Ioc
{
protected $instances = [];
public function __construct()
{
}
public function getInstance($abstract){
//獲取類的反射信息,也就是類的所有信息
$reflector = new ReflectionClass($abstract);
// echo $reflector->getDocComment(); 獲取類的註釋信息
//獲取反射類的構造函數信息
$constructor = $reflector->getConstructor();
//獲取反射類的構造函數的參數
$dependencies = $constructor->getParameters();
if(!$dependencies){
return new $abstract();
}
foreach ($dependencies as $dependency) {
if(!is_null($dependency->getClass())){
$p[] = $this->make($dependency->getClass()->name);
//這裏$p[0]是C的實例化對象,$p[1]是D的實例化對象
}
}
//創建一個類的新實例,給出的參數將傳遞到類的構造函數
return $reflector->newInstanceArgs($p);
}
public function make($abstract)
{
return $this->getInstance($abstract);
}
}
$ioc = new Ioc();
$a = $ioc->make('A');
$a->getB();