这不是关于指示(文档就足够了),而是关于事情如何运作的问题。
Symfony 4's autowiring system允许我们通过简单的输入
来自动注入服务use App\Util\Rot13Transformer;
class TwitterClient
{
public function __construct(Rot13Transformer $transformer)
{
$this->transformer = $transformer;
}
}
为了更深入地了解PHP,我已经浏览了symfony-bundle源代码,但找不到“魔法”发生的地方。
Symfony如何阻止PHP抗议没有足够的参数提供给构造函数(或任何使用自动装配的函数)?
答案 0 :(得分:3)
他们使用Refection
Symfony如何阻止PHP抗议没有足够的参数提供给构造函数
反射允许您检查其他事物的定义"用PHP。其中包括类的方法,以及这些方法的参数。
<?php
class bar
{
//just a placeholder class
};
$bar = new bar(); //instance of bar
//class to inspect
class foo
{
public function __construct( bar $bar)
{
//do something fancy with $bar
}
}
//get the Reflection of the constructor from foo
$Method = new ReflectionMethod('foo', '__construct');
//get the parameters ( I call them arguments)
$Args = $Method->getParameters();
//get the first argument
$Arg = reset($Args);
//export the argument definition
$export = ReflectionParameter::export(
array(
$Arg->getDeclaringClass()->name,
$Arg->getDeclaringFunction()->name
),
$Arg->name,
true
);
//parse it for the typehint
$type = preg_replace('/.*?(\w+)\s+\$'.$Arg->name.'.*/', '\\1', $export);
echo "\nType: $type\n\n";
var_dump(is_a($bar, $type));
输出:
Type: bar
bool(true)
你可以看到它here
然后您只需使用is_a()
或其他任何内容来查看&#34;输入&#34;对象有bar
作为其祖先之一。正如你在这个简化的例子中看到的那样,如果我们有对象$ bar,我们就会知道它作为构造函数的输入非常好,因为它返回true。
我应该注意到问题可能不是正确的地方,但我可以在我的许多项目中使用它,所以我不介意搞清楚。我也没用过Symphony ...... 特别感谢解决类型提示的最后一点SO问题:
PHP Reflection - Get Method Parameter Type As String
那就是说我会在大约10秒内找出Regx,导出方法没那么多。
这是文件的范围
http://php.net/manual/en/reflectionparameter.export.php
字面上
public static string ReflectionParameter::export ( string $function , string $parameter [, bool $return ] )
答案 1 :(得分:1)
正如其他人所说,他们使用Reflection。如果您想了解Symfony的具体操作,请从autowire()
方法here开始