我试图使用PHP反射动态加载的自动根据参数的类型,它是在控制器方法模型类文件。 下面是一个例子控制器的方法。
<?php
class ExampleController
{
public function PostMaterial(SteelSlugModel $model)
{
//etc...
}
}
这是我到目前为止所。
//Target the first parameter, as an example
$param = new ReflectionParameter(array('ExampleController', 'PostMaterial'), 0);
//Echo the type of the parameter
echo $param->getClass()->name;
这工作,并且输出将是“SteelSlugModel”,符合市场预期。 然而,该模型的类文件可能还没有加载,并且使用的getClass()要求类中定义的可能性 - 为什么我做这部分是自动加载一个控制器动作可能需要的任何模型。
有没有办法让参数类型的名称,而不必首先加载类文件?
我认为,唯一的办法就是export
和处理结果字符串:
$refParam = new ReflectionParameter(array('Foo', 'Bar'), 0);
$export = ReflectionParameter::export(
array(
$refParam->getDeclaringClass()->name,
$refParam->getDeclaringFunction()->name
),
$refParam->name,
true
);
$type = preg_replace('/.*?(\w+)\s+\$'.$refParam->name.'.*/', '\\1', $export);
echo $type;
我认为这是你在找什么:
class MyClass {
function __construct(AnotherClass $requiredParameter, YetAnotherClass $optionalParameter = null) {
}
}
$reflector = new ReflectionClass("MyClass");
foreach ($reflector->getConstructor()->getParameters() as $param) {
// param name
$param->name;
// param type hint (or null, if not specified).
$param->getClass()->name;
// finds out if the param is required or optional
$param->isOptional();
}
你可以使用Zend框架2。
$method_reflection = new \Zend\Code\Reflection\MethodReflection( 'class', 'method' );
foreach( $method_reflection->getParameters() as $reflection_parameter )
{
$type = $reflection_parameter->getType();
}
getType
方法可以自PHP 7.0被使用。
class Foo {}
class Bar {}
class MyClass
{
public function baz(Foo $foo, Bar $bar) {}
}
$class = new ReflectionClass('MyClass');
$method = $class->getMethod('baz');
$params = $method->getParameters();
var_dump(
'Foo' === (string) $params[0]->getType()
);
我有类似的问题,检查上反射参数的getClass时未装载的类时。 我做了一个包装函数从范例中得到的类名netcoder制造。 问题是,netcoder代码没有工作,如果它是一个数组或不是类 - >功能($测试){}它将返回到字符串方法的反射参数。
下面我将如何解决它,使用尝试捕捉IM,因为我的代码需要在某些时候类的方式。 所以,如果我下一次提出要求,获得一流的作品和犯规抛出异常。
/**
* Because it could be that reflection parameter ->getClass() will try to load an class that isnt included yet
* It could thrown an Exception, the way to find out what the class name is by parsing the reflection parameter
* God knows why they didn't add getClassName() on reflection parameter.
* @param ReflectionParameter $reflectionParameter
* @return string Class Name
*/
public function ResolveParameterClassName(ReflectionParameter $reflectionParameter)
{
$className = null;
try
{
// first try it on the normal way if the class is loaded then everything should go ok
$className = $reflectionParameter->getClass()->name;
}
// if the class isnt loaded it throws an exception and try to resolve it the ugly way
catch (Exception $exception)
{
if ($reflectionParameter->isArray())
{
return null;
}
$reflectionString = $reflectionParameter->__toString();
$searchPattern = '/^Parameter \#' . $reflectionParameter->getPosition() . ' \[ \<required\> ([A-Za-z]+) \$' . $reflectionParameter->getName() . ' \]$/';
$matchResult = preg_match($searchPattern, $reflectionString, $matches);
if (!$matchResult)
{
return null;
}
$className = array_pop($matches);
}
return $className;
}
这是一个更好的正则表达式比从一个这个问题的答案 。 当参数是可选的,它仍然工作。
preg_match('~>\s+([a-z]+)\s+~', (string)$ReflectionParameter, $result);
$type = $result[1];