- PHP 手册
- 函数参考
- 变量与类型相关扩展
- 反射
- ReflectionNamedType
ReflectionNamedType::getName
(PHP 7 >= 7.1.0, PHP 8)
ReflectionNamedType::getName — 以字符串形式获取类型的名称
说明
public ReflectionNamedType::getName(): string参数
此函数没有参数。
返回值
返回被反射的类型的名称。
参见
- ReflectionType::__toString() - To string
User Contributed Notes 1 note
up down 0 e3jeremy at gmail dot com ¶3 years ago
Method "getName" is available when you access getType from getParameters from class reports information of a method(ReflectionMethod).
No need to instantiate the ReflectionNamedType.
Below is my custom method on resolving method dependencies, getName is a big help.
<?php
class A
{
public function my()
{
return ' My ';
}
}
class B
{
public function __construct(A $a)
{
$this->a = $a;
}
public function hello($string)
{
return 'Hello' . $this->a->my() . $string . '.';
}
}
class C
{
public function print($instance, $method)
{
$params = ['World'];
echo call_user_func_array(array($instance, $method), array_merge($this->resolveMethodDependencies($instance, $method), $params));
}
public function instantiate($class)
{
if(method_exists($class, '__construct')) $instance = new $class(...$this->resolveMethodDependencies($class, '__construct'));
else $instance = new $class;
return $instance;
}
protected function resolveMethodDependencies($class, $method)
{
$params = [];
$reflection = new \ReflectionMethod($class, $method);
foreach ($reflection->getParameters() as $param) {
if($type = $param->getType()) {
if(!$type || !$this->instatiatable ($type)) continue;
// This is the right way to get the class name in string.
$className = $type->getName();
// This will throw error.
// $className = $param->getType();
// Alos this one will do the trick.
// $className = (string) $param->getType();
if(method_exists($className, '__construct')) {
$params[] = new $className(...$this->resolveMethodDependencies($className, '__construct'));
continue;
}
$params[] = new $className;
}
}
return $params;
}
protected function instatiatable ($type)
{
// Add conditon if something is leftout.
// This is to ensure that the type is existing class.
return $type != 'Closure' && !is_callable($type) && class_exists($type);
}
}
$class = new C;
$class->print(
$class->instantiate('B'), 'hello'
);
Output:
Hello My World.
add a note
官方地址:https://www.php.net/manual/en/reflectionnamedtype.getname.php