📜  函数 ReflectionType::__toString() 已弃用 static::$kernel->boot() (1)

📅  最后修改于: 2023-12-03 15:07:08.691000             🧑  作者: Mango

函数 ReflectionType::__toString() 已弃用 static::$kernel->boot()

简介

在 PHP 7.4 之前,ReflectionType 可以用来获取参数或返回值的类型提示。而在最新的 PHP 8.0 中,该功能被移除并使得调用 ReflectionType::__toString() 函数时会得到以下错误信息:函数 ReflectionType::__toString() 已弃用 static::$kernel->boot()

详细解释

在 PHP 7.4 之前,ReflectionType 是一种使用反射机制获取函数的参数和返回类型提示的方法。这个过程是通过在函数中使用参数类型提示或在函数定义前使用返回类型提示来完成的。例如:

function foo(string $bar): int {
    return (int) $bar;
}

$reflectionFunction = new ReflectionFunction('foo');

echo $reflectionFunction->getReturnType();  // 输出:int
echo $reflectionFunction->getParameters()[0]->getType(); // 输出:string

可以看到,在 PHP 7.4 之前,我们可以使用 ReflectionType 类来确定函数参数和返回值类型提示。但是,在 PHP 8.0 中,ReflectionType 类已被移除,并且在调用 ReflectionType::__toString() 函数时会抛出“已弃用 static::$kernel->boot()”的错误消息。

静态方法 boot() 是 Symfony 框架中的方法,用于启动 Symfony 内核。因此,调用 ReflectionType 类的 parseString() 方法或 __toString() 方法时,可能会触发此错误的出现。

解决方案

网上有一些建议使用 class_exists('ReflectionNamedType') 来判断 ReflectionType 是否可用。但是,这种方法可能会导致误判,因为 ReflectionNamedType 不总是可用的。另外,这种方法也无法解决在调用 ReflectionType::__toString() 时出现的错误信息。

因此,强烈建议 PHP 8.0 以下版本的用户使用 ReflectionType 类来获取参数和返回值类型提示。而对于 PHP 8.0 及以上的版本,可以采用其他方法来获取类型提示,如使用格式化字符串或使用注释,例如:

function foo(string $bar): int {
    return (int) $bar;
}

echo sprintf('%s', gettype('foo')); // 输出:string

或者:

function foo(/* string */ $bar): int {
    return (int) $bar;
}
总结

ReflectionType 类被移除后,无法再使用该类来获取参数和返回值类型提示。而在调用 ReflectionType::__toString() 函数时可能会出现“已弃用 static::$kernel->boot()”的错误信息。因此,在 PHP 8.0 及以上的版本中,建议使用其他方法来获取类型提示,如使用格式化字符串或使用注释。