Что я хотел бы для этого класса
class Car {
public function __construct(Engine $engine, Make $make, Model $model)
{
// stuff
}
}
Получите массив с типами, необходимыми для построения этого автомобиля (Engine, Make, Model
) в том порядке, в котором они необходимы для конструктора. Я использую это для создания инъекций зависимостей, которые я делаю.
Обновление:
Я сделал эти уроки, чтобы выполнить задачу, но я чувствую, что есть еще лучший способ:
<?php
class Engine{}
class Make{}
class Model{}
class Car {
public function __construct(Engine $engine, Make $make, Model $model,
$foo,
$cats = 'dogs',
Engine $anotherEngine = NULL)
{
// stuff
}
}
class ServiceParameter extends ReflectionParameter
{
public $type = NULL;
public function __construct()
{
$args = func_get_args();
call_user_func_array(array('parent', '__construct'), $args);
$str = parent::__toString();
$str = explode(" ", $str);
$str = $str[4];
if(substr($str, 0, 1) != '$')
$this->type = $str;
}
}
class ServiceMethod extends ReflectionMethod
{
private $_parameter_cache = NULL;
private function _wrapParameter(&$item, $key)
{
$item = new ServiceParameter(array($item->getDeclaringClass()->name,
$item->getDeclaringFunction()->name),
$item->name);
}
public function getParameters()
{
if(is_array($this->_parameter_cache))
return $this->_parameter_cache;
else
{
$rms = parent::getParameters();
array_walk($rms, array($this, '_wrapParameter'));
$params = $rms;
$this->_parameter_cache = $params;
return $params;
}
}
}
$c = new ServiceMethod("Car", "__construct");
$args = $c->getParameters();
foreach($args as $arg)
{
echo "Parameter Name: {$arg->name}\n";
echo "GetName: {$arg->getName()}\n";
echo "Type: {$arg->type}\n";
echo "\n\n";
}
Какие выходы:
Parameter Name: engine
GetName: engine
Type: Engine
Parameter Name: make
GetName: make
Type: Make
Parameter Name: model
GetName: model
Type: Model
Parameter Name: foo
GetName: foo
Type:
Parameter Name: cats
GetName: cats
Type:
Parameter Name: anotherEngine
GetName: anotherEngine
Type: Engine
Я знаю, что есть некоторые избыточные вещи ($params = $rms
), но это результат поспешного изменения кода, чтобы заставить его работать. Мне хочется построить совершенно новый ServiceParameter
, когда у нас уже есть экземпляр ReflectionParameter
- пустая трата времени. Есть ли что-нибудь вокруг этого ($item = (ServiceParameter)$item
не работает)