PHPDoc 或类型提示类作为方法的参数
Posted
技术标签:
【中文标题】PHPDoc 或类型提示类作为方法的参数【英文标题】:PHPDoc or type hint class as parameter to method 【发布时间】:2018-01-20 10:04:48 【问题描述】:如何指示函数/方法接受类作为参数? phpDoc 或类型提示就足够了,但似乎都不允许这样做。
这是我认为应该可行的示例......
/**
* @param $class class A reference to a class that will be used to do something
*/
function doReallyWeirdStuff(class $class)
$class::callStaticMethod();
我已经知道如何将类传递给这个函数。我如何表明您应该这样做?
【问题讨论】:
【参考方案1】:类名只是字符串,因此您必须将它们作为字符串输入提示。然后,您需要在运行时在您的方法中检查它实际上是一个类:
/**
* @param $class string A reference to a class that will be used to do something
*/
function doReallyWeirdStuff(string $class)
if (class_exists($class))
$class::callStaticMethod();
else
throw \InvalidArgumentException;
请注意,要严格遵守字符串值(如类名所要求的那样),您需要启用严格类型提示:
declare(strict_types=1);
否则,您可能会这样调用:
doReallyWeirdStuff(M_PI);
这没有多大意义。
【讨论】:
啊哈!极好的!谢谢 要传入类名,您应该使用\MyNamespace\MyClass::class
以便您的 IDE 可以重构该代码。
我会在等待期到期后尽快处理。 :)
declare(strict_types=1)
不需要启用标量类型提示。仅当您希望 PHP 在文件中不遵守确切类型时抛出错误时才需要它(默认情况下,PHP 会将另一种类型转换为提示的类型,而不是抛出错误)
您对 OP 的看法可能是正确的。只是说不准确,因为除了 OP 之外,很多人可能会遇到您的解决方案并按字面意思理解您的话。【参考方案2】:
你不能用 PHPDoc 类型提示来做到这一点,除非你传递一个实际的对象实例。
但是,您可以滥用 PHP Doc 类型提示。
string|Class $class
or
Class $class
这将产生非常复杂的结果,具体取决于您正在运行的内容。您将失去一些在没有误报/误报的情况下运行类型检查的能力。
【讨论】:
以上是关于PHPDoc 或类型提示类作为方法的参数的主要内容,如果未能解决你的问题,请参考以下文章