Ne istiyorum bu sınıf için
class Car {
public function __construct(Engine $engine, Make $make, Model $model)
{
// stuff
}
}
Onlar kurucu için gerekli sırayla (Engine, Make, Model
) Bu arabayı oluşturmak için gerekli tipleri vardır bir dizi olsun. Ben yapıyorum Bağımlılık Enjeksiyon-vari bir şey için bu kullanıyorum.
Update: I made these classes to accomplish the task but I feel like there is still a better way:
<?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";
}
Hangi çıkışlar:
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
Ben bazı gereksiz şeyler ($params = $rms
) olduğunu biliyorum ama bu acele ve işe almak için bir sürü etrafında kodu değişen bir sonucudur. Ben inşa gibi hissediyorum yepyeni ServiceParameter
biz zaten ReflectionParameter
örnek bir atık varsa. ($item = (ServiceParameter)$item
işe yaramadı) bu çevrede yine de var mı