PHP:严格标准:[...]的声明应与[...] [...]的声明兼容

时间:2012-08-15 00:05:34

标签: php oop reflection

我使用E_STRICT开发。在扩展课程时,我有时会遇到以下致命错误......

  

严格标准:[...]声明应与[...]

中[...]的声明兼容

...由于子方法签名与其各自的父方法签名不完全匹配。

有时,只是该类的文档不准确或不及时更新(我在PHP的PDO库中遇到过这种情况)。或者,可能很少或没有文档。在任何一种情况下,下载和阅读库的C源代码都会像猜测一样令人沮丧。

在不压制E_STRICT的情况下,可以做些什么来快速解决这些错误?

2 个答案:

答案 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::isPrivateReflectionMethod::isProtected等方法可访问性。最后,请注意类ReflectionMethod扩展ReflectionFunctionAbstract,因此请务必查看父类的方法。< / p>