【发布时间】: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