【问题标题】:How to get the type hints of native PHP class constructors如何获取原生 PHP 类构造函数的类型提示
【发布时间】:2018-08-31 03:46:41
【问题描述】:

当使用 ReflectionParameter 类循环遍历原生 PHP 类 __construct() 参数时,我注意到文档中参数的类型提示与我使用该类所得到的不匹配方法。

例如DateTime 对象:

$reflector = new ReflectionClass('DateTime');
$constructor = $reflector->getConstructor();

if ($constructorParams = $constructor->getParameters()) {
    foreach ($constructorParams as $i => $param) {
        var_dump($param->getClass());
    }
}

这个输出:

null
null

但是according to the docs的类描述是:

public DateTime::__construct ([ string $time = "now" [, DateTimeZone $timezone = NULL ]] )

$timezone 参数不应该有DateTimeZone 的类型提示吗?或者参数实际上没有类型提示,而是文档只是告诉您应该传递什么?

此外,在输出名称时它们也不同:var_dump($param->name) 输出:

time
object

但是,如果我要对 PDO 进行反思,则名称的 var 转储会像文档中一样正确输出:

dsn
username
passwd
options

【问题讨论】:

  • 是的,我会说参数没有类型提示,文档只是告诉你应该传入什么。我想类型检查只是在内部完成。鉴于您可以在没有任何错误或警告的情况下执行 new DateTime(null)new DateTime(2018) 之类的操作,似乎就是这样。
  • 这是有道理的。我希望参数名称与文档中的变量匹配,$time 可以,但$timezone 显示为object。 PDO 对象虽然显示准确。检查 ArrayObject 之类的内容也显示几乎 100% 准确,除了 $flags 实际上是 ar_flags
  • 根据this page,听起来PHP认为这是一个错误。
  • 好消息!谢谢。
  • 已修复错误 bugs.php.net/bug.php?id=76131(date_create 的 arginfo 不匹配)。

标签: php oop reflection


【解决方案1】:

我一直fixed尝试使用相同的或按照下面的代码,

 $reflector = new ReflectionClass('DateTime');
    $constructor = $reflector->getConstructor();

    if ($constructorParams = $constructor->getParameters()) {
        foreach ($constructorParams as $i => $param) {
            $name = $param->getClass() ? $param->getClass()->name : $param->name;

            var_dump($name);
        }
    }

    $reflector = new ReflectionClass('ArrayObject');
    $constructor = $reflector->getConstructor();

    if ($constructorParams = $constructor->getParameters()) {
        foreach ($constructorParams as $i => $param) {
            $name = $param->getClass() ? $param->getClass()->name : $param->name;

            var_dump($name);
        }
    }

更多详情可以参考FixdateTimearrayObject

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2022-12-20
    • 2017-05-28
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多