我喜欢这个课程
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
没有用)
答案 0 :(得分:4)
class Engine { }
class Make { }
class Model { }
class Car {
public function __construct(array $a, $b, Engine $engine, Make $make, Model $model)
{
// stuff
}
}
$rc = new ReflectionClass('Car');
$ctor = $rc->getConstructor();
foreach( $ctor->getParameters() as $rp ) {
$cn = $rp->getClass();
if ( $cn instanceof ReflectionClass ) {
$cn = $cn->getName();
}
echo $cn, ' ', $rp->getName(), "\n";
}
打印
a
b
Engine engine
Make make
Model model
答案 1 :(得分:1)
ReflectionMethod :: getPrototype方法怎么样?如果不够好,您可以使用ZF:http://docs.gnulife.cn/ZF/ZendFramework-1.0.4/documentation/api/core/Zend_Server/Reflection/Zend_Server_Reflection_Parameter.html(此类中有“类型”字段)