* @return array
*/
protected static function getMethodParam($className, $methodsName = '__construct')
{
// 通过反射获得该类
$class = new ReflectionClass($className);
$paramArr = []; // 记录参数,和参数类型
// 判断该类是否有构造函数
if ($class->hasMethod($methodsName)) {
// 获得构造函数
$construct = $class->getMethod($methodsName);
// 判断构造函数是否有参数
$params = $construct->getParameters();
if (count($params) > 0) {
// 判断参数类型
foreach ($params as $key => $param) {
if ($paramClass = $param->getClass()) {
// 获得参数类型名称
$paramClassName = $paramClass->getName();
// 获得参数类型
$args = self::getMethodParam($paramClassName);
$paramArr[] = (new ReflectionClass($paramClass->getName()))->newInstanceArgs($args);
}
}
}
}
return $paramArr;
}
}
class A {
protected $cObj;
/**
* 用于测试多级依赖注入 B依赖A,A依赖C
* @param C $c [description]
*/
public function __construct(C $c) {
$this->cObj = $c;
}
public function aa() {
echo 'this is A->test';
}
public function aac() {
$this->cObj->cc();
}
}
class B {
protected $aObj;
/**
* 测试构造函数依赖注入
* @param A $a [使用引来注入A]
*/
public function __construct(A $a) {
$this->aObj = $a;
}
/**
* [测试方法调用依赖注入]
* @param C $c [依赖注入C]
* @param string $b [这个是自己手动填写的参数]
* @return [type] [description]
*/
public function bb(C $c, $b) {
$c->cc();
echo "\r\n";
echo 'params:' . $b;
}
/**
* 验证依赖注入是否成功
* @return [type] [description]
*/
public function bbb() {
$this->aObj->aac();
}
}
class C {
public function cc() {
echo 'this is C->cc';
}
}
$bObj = Reflect::getInstance('B');
echo $bObj->bbb(); // 输出:this is C->cc , 说明依赖注入成功。
Reflect::make('B', 'bb', ['this is param b']);
var_dump($bObj);
php反射依赖注入
猜你喜欢
转载自blog.csdn.net/zf766045962/article/details/81026654
今日推荐
周排行