gpt4 book ai didi

php - Symfony 的 Autowiring 在幕后是如何工作的?

转载 作者:行者123 更新时间:2023-12-04 00:05:33 25 4
gpt4 key购买 nike

这不是关于说明(文档就足够了),而是关于事情如何运作的问题。

Symfony 4's autowiring system允许我们通过简单的输入提示来自动注入(inject)服务

use App\Util\Rot13Transformer;

class TwitterClient
{
public function __construct(Rot13Transformer $transformer)
{
$this->transformer = $transformer;
}
}

为了更深入地了解 PHP,我查看了 symfony-bundle 源代码,但找不到“魔法”发生的地方。

Symfony 如何防止 PHP 抗议没有足够的参数提供给构造函数(或任何使用 Autowiring 的函数)?

最佳答案

他们使用反射

How can Symfony prevent PHP from protesting that not enough arguments were fed to the constructor

反射允许您检查 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() 或其他任何东西来查看“输入”对象是否具有 bar 作为其祖先之一。正如你在这个简化的例子中看到的,如果我们有对象 $bar,我们会知道它作为构造函数的输入非常好,因为它返回 true。

我应该注意 SO 可能不是问这个问题的正确地方,但我可以在我的许多项目之一中使用它,所以我不介意弄清楚它。而且我从来没有用过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 ] )

关于php - Symfony 的 Autowiring 在幕后是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47619285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com