3

私はで開発しE_STRICTます。クラスを拡張すると、次の致命的なエラーが発生することがあります...

厳格な基準:[...]の宣言は[...]の[...]の宣言と互換性がある必要があります

...子メソッドのシグネチャがそれぞれの親メソッドのシグネチャと正確に一致していないため。

時々、それは単にクラスのドキュメントが正確でないか最新ではないということです(私はPHPのPDOライブラリでこれに遭遇しました)。または、ドキュメントがほとんどまたはまったくない場合があります。どちらの場合も、ライブラリのCソースコードをダウンロードして読み取ることは、当て推量と同じくらいイライラする可能性があります。

抑制せずに、これらのエラーをすばやく処理するために何ができるE_STRICTでしょうか。

4

2 に答える 2

5

コマンドラインリフレクション機能を使用して、予想される署名を見つけることができます。

$ php --rc PDO
于 2012-08-15T01:44:26.310 に答える
2

ReflectionClassPHPを使用して親クラスが期待するものを内省することを提案する非常に有用な記事を見つけました。ここでは、 PHP –リフレクションクラス–親メソッドのシグネチャを決定します。

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";

?>

PDOこれは、たとえばPHPのクラスの場合に出力されます。

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(そして実際に私の疑いは正しいことが証明されました)。


もちろん、より多くの情報を出力したい場合は、他にも便利なリフレクション方法がたくさんあります。たとえば、、などを介したメソッドのアクセシビリティReflectionMethod::isPrivateReflectionMethod::isProtected最後に、クラスReflectionMethodが拡張ReflectionFunctionAbstractされることに注意してください。親クラスのメソッドも確認してください。

于 2012-08-15T00:05:34.310 に答える