【问题标题】:PHP: Strict Standards: Declaration of [...] should be compatible with that of [...] in [...]PHP:严格标准:[...] 的声明应与 [...] 中的 [...] 的声明兼容
【发布时间】:2012-08-15 00:05:34
【问题描述】:

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

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

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

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

如何在不抑制E_STRICT 的情况下快速解决这些错误?

【问题讨论】:

  • @tazotodua - 实际上,我认为 thatthis 的副本,不仅(或根本没有)因为这被问了一年更早,但是因为这是一个一般性问题,它具有寻找签名以解决任何形式的一般性问题的一般技术。 “可能重复”只是一种特殊情况。

标签: php oop reflection


【解决方案1】:

您可以使用命令行反射功能找出预期的签名:

$ php --rc PDO

【讨论】:

  • 这太好了,谢谢!我一回家就试试这个。我唯一担心的是,有时我在共享主机上开发并且 shell 访问不可用,而且我并不总是在我的工作计算机上安装 PHP。
  • 我终于可以通过 SSH 连接到我的服务器并进行尝试。输出当然比我的解决方案更全面,并且格式正确。而且,这让我意识到我在做一些愚蠢的事情。 “我在输出中没有看到类似的 标记”的原因是因为 <...> 被解释为 HTML 标记,呵呵。
【解决方案2】:

我发现了一篇非常有用的文章,它建议使用 PHP 的 ReflectionClass 来内省父类的期望,这里是:PHP – Reflection Class – Determine Parent Method Signature

我在 Stack Overflow 上找不到提供此提示的答案,因此我决定使用文章的示例代码(我自己的扩展版本)提交这个自我回答的问题。

使用这个 sn-p 来了解更多关于你想要扩展的类:

<?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 ]"

我没有在我的输出中看到类似的&lt;optional&gt; 标记(逐字使用作者的代码),无论是因为我使用的是不同版本的 PHP(PHP 5.3.13)还是与底层 PDO 库有关。怀疑我的问题可能与可选参数有关,我寻找了另一种方法来使用 getNumberOf*Parameters 方法找出它们(事实上我的怀疑被证明是正确的)。


如果想输出更多信息,当然有plenty of other useful reflection methods。例如,通过ReflectionMethod::isPrivateReflectionMethod::isProtected 等的方法可访问性。最后,请注意ReflectionMethod 类扩展了ReflectionFunctionAbstract,因此请务必检查父类的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多