微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从php构造函数获取构造参数依赖

使用php ReflectionClass我可以找到我必须在类构造函数中注入哪些参数来创建新实例.

$class = new ReflectionClass($this->someClass);
$constructor = $class->getConstructor();
$parameters = $constructor->getParameters();

是否还有一种方法可以获得这些参数的依赖关系.
所以如果someClass的构造函数看起来像这样:

public function __construct(Dependency $dependency){
    $this->dependency = $dependency;
}

我可以以某种方式从构造函数获取类Dependency吗?

解决方法:

ReflectionMethod::getParameters返回ReflectionParameter对象的数组. ReflectionParameters有一个名为getClass的方法,它将返回有关param的typehint的信息.

例:

<?PHP
interface Y { }

class X
{
    public function __construct(Y $x, $y=null)
    {

    }
}

$ref = new \ReflectionClass('X');

$c = $ref->getConstructor();
foreach ($c->getParameters() as $p) {
    var_dump($p->getClass());
}

输出

class ReflectionClass#5 (1) {
  public $name =>
  string(1) "Y"
}
NULL

Silex的ControllerResolver一个很好的例子,说明如何使用它:

<?PHP
// $params is an array of ReflectionParameter instances
protected function doGetArguments(Request $request, $controller, array $parameters)
{
    foreach ($parameters as $param) {
        // check to see if there's a class and if there is, see if the app property
        // is the same type. If so, set the attribute on the request
        if ($param->getClass() && $param->getClass()->isinstance($this->app)) {
            $request->attributes->set($param->getName(), $this->app);

            break;
        }
    }

    return parent::doGetArguments($request, $controller, $parameters);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐