PHP 8.3.0 RC 6 available for testing

ReflectionNamedType::getName

(PHP 7 >= 7.1.0, PHP 8)

ReflectionNamedType::getName以字符串形式获取类型的名称

说明

public ReflectionNamedType::getName(): string

参数

此函数没有参数。

返回值

返回被反射的类型的名称。

参见

add a note

User Contributed Notes 2 notes

up
0
baptiste at pillot dot fr
2 months ago
Possible values for type names are:

- The name of a class, interface, or trait,
- The name of any built-in type (php 8.2): array, bool, callable, float, int, null, object, string, false, iterable, mixed, never, true, void,
- The name of any relative class type: parent, self, static.
up
-1
e3jeremy at gmail dot com
5 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.
To Top