我使用E_STRICT
开发。在扩展课程时,我有时会遇到以下致命错误......
严格标准:[...]声明应与[...]
中[...]的声明兼容
...由于子方法签名与其各自的父方法签名不完全匹配。
有时,只是该类的文档不准确或不及时更新(我在PHP的PDO库中遇到过这种情况)。或者,可能很少或没有文档。在任何一种情况下,下载和阅读库的C源代码都会像猜测一样令人沮丧。
在不压制E_STRICT
的情况下,可以做些什么来快速解决这些错误?
答案 0 :(得分:5)
您可以使用命令行反射功能找出预期的签名:
$ php --rc PDO
答案 1 :(得分:2)
我发现了一篇非常有用的文章,建议使用PHP的ReflectionClass
来反省父类所期望的内容,在这里:PHP – Reflection Class – Determine Parent Method Signature。
我在Stack Overflow上找不到这个提示的答案,所以我决定用(我自己的扩展版本)文章的示例代码提交这个自我回答的问题。
使用此代码段了解有关您尝试扩展的课程的详情:
<?php
$className = 'PDO'; // the class you're trying to extend
echo "<pre>\n";
echo "CLASS : $className\n\n========\n\n";
$refClass = new ReflectionClass($className);
foreach ($refClass->getMethods() as $refMethod) {
echo "METHOD : " . $refMethod->getName(). "\n\n";
echo "getNumberOfParameters() : " . $refMethod->getNumberOfParameters() . "\n";
echo "getNumberOfRequiredParameters() : " . $refMethod->getNumberOfRequiredParameters() . "\n";
echo "\n";
foreach ($refMethod->getParameters() as $refParameter) {
echo $refParameter . "\n";
}
echo "\n--------\n\n";
}
echo "</pre>\n";
?>
这为PHP的PDO
类输出,例如:
CLASS : PDO
========
METHOD : __construct
getNumberOfParameters() : 4
getNumberOfRequiredParameters() : 3
Parameter #0 [ $dsn ]
Parameter #1 [ $username ]
Parameter #2 [ $passwd ]
Parameter #3 [ $options ]
--------
METHOD : prepare
getNumberOfParameters() : 2
getNumberOfRequiredParameters() : 1
Parameter #0 [ $statment ]
Parameter #1 [ $options ]
--------
METHOD : beginTransaction
getNumberOfParameters() : 0
getNumberOfRequiredParameters() : 0
[...]
请注意,在链接文章中,人们会看到如下条目:
string(37) "Parameter #1 [ <optional> $cache_cb ]"
我的输出中没有看到类似的<optional>
标记(使用作者的代码逐字),不管是因为我使用的是不同版本的PHP(PHP 5.3.13),还是基于PDO的基础知识库。怀疑我的问题可能与可选参数有关,我寻找另一种方法来使用getNumberOf*Parameters
方法找出它们(事实上我的怀疑证明是正确的)。
当然,如果想要输出更多信息,则有plenty of other useful reflection methods。例如,通过ReflectionMethod::isPrivate
,ReflectionMethod::isProtected
等方法可访问性。最后,请注意类ReflectionMethod
扩展ReflectionFunctionAbstract
,因此请务必查看父类的方法。< / p>