Речь идет не о инструкциях (достаточно документов), а о том, как все работает.
Система электромонтажа Symfony 4 позволяет нам автоматически вводить сервисы, просто печатая
use App\Util\Rot13Transformer;
class TwitterClient
{
public function __construct(Rot13Transformer $transformer)
{
$this->transformer = $transformer;
}
}
Чтобы глубже понять PHP, я осмотрел исходный код Symfony-bundle, но не смог найти место, где происходит «волшебство».
Как Symfony может запретить PHP протестовать против того, чтобы в конструктор было передано недостаточно аргументов (или любой функции, использующей автопроводку)?
Они используют Refection
Как Symfony может запретить PHP протестовать против того, чтобы в конструктор было передано недостаточно аргументов
Reflection позволяет проверить определение других «вещей» в 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)
Вы можете видеть это Вот
Тогда вы просто используете is_a()
или что посмотреть, если объект «ввода» имеет bar
как один из его предков. И как вы можете видеть в этом упрощенном примере, если бы у нас был объект $ bar, мы бы знали, что он идеально подходит в качестве входных данных для нашего конструктора, потому что он возвращает true.
Должен отметить, что SO, вероятно, не то место, где можно об этом спрашивать, но я мог бы использовать его в одном из своих многочисленных проектов, поэтому я не возражал против выяснения этого. Также я никогда не использовал симфонию …
Отдельное спасибо за этот последний вопрос о последнем разборе подсказки типа:
PHP Reflection — Получить тип параметра метода в виде строки
Тем не менее, я бы вычислил Regx примерно через 10 секунд, метод экспорта не так уж и много.
Это объем документации по нему
http://php.net/manual/en/reflectionparameter.export.php
В прямом смысле
public static string ReflectionParameter::export ( string $function , string $parameter [, bool $return ] )