web-dev-qa-db-ja.com

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

Woocommerce 2.0(Wordpress)をPHP 5.4にインストールしたばかりです。

厳格な標準:WC_Gateway_BACS :: process_payment()の宣言は、D:\ my\path\to\htdocs\wordpress\plugins\woocommerce\classes\gateways \のWC_Payment_Gateway :: process_payment()と互換性がある必要がありますbacs\class-wc-gateway-bacs.php on line ...

ファイルを確認すると、_WC_Payment_Gateway_にはメソッドprocess_payment()がありません。これを解決する方法を知る必要があります(error_reporting()を設定することではありません)。

Strict Standards in PHPまさに?
どのような条件でエラーが発生しますか?

19
egig

WC_Payment_Gatewayabstract-wc-payment-gateway.phpで定義され、メソッドを宣言します

function process_payment() {}

WC_Gateway_BACSは次のように定義します

function process_payment( $order_id ) { ...

(おそらく、WC_Payment_GatewayとWC_Payment_Gatewayを混同した可能性がありますs)。

したがって、異なるシグニチャー(0パラメーターvs 1パラメーター)->厳密エラー。
1つのパラメーターで常に使用されるように見えるため、変更できます。

function process_payment() {}

function process_payment($order_id) {}

(*)woocommerceについて知っているのは最後の5分間だけなので、私の言葉を信じないでください。

19
VolkerK

PHP Manualからの引用)==

PHP 5では、新しいエラーレベルE_STRICTが利用可能です。PHP 5.4.0の前に、E_STRICTはE_ALLに含まれていなかったため、明示的に有効にする必要があります。 PHPでのこの種のエラーレベル<5.4.0。開発中にE_STRICTを有効にすると、いくつかの利点があります。STRICTメッセージは、コードの最適な相互運用性と前方互換性を確保するのに役立つ提案を提供します。 -static>メソッド、静的に、互換性のあるクラス定義でプロパティを定義し、使用されるトレイトで定義し、PHP 5.3の前に、廃止された一部の機能は、参照によるオブジェクトの割り当てなど、E_STRICTエラーを発行しますインスタンス化。

WC_Gateway_BACS :: process_payment()宣言がWC_Payment_Gateway :: process_payment()(同じ量のパラメーターなどではない可能性がある)と異なるため、このエラーを受け取っています。 WC_Payment_Gatewayにprocess_paymentメソッドがない場合、その親クラスを確認してください:)

また、STRICTエラーを無効にする場合は、^ E_STRICTをエラー報告設定に追加します。例:

error_reporting(E_ALL ^ E_STRICT);
12
paranoid

エラーをオフにせずにOOPフォームを保持したい場合は、次のこともできます。

class A
{
    public function foo() {
        ;
    }
}
class B extends A
{
    /*instead of : 
    public function foo($a, $b, $c) {*/
    public function foo() {
        list($a, $b, $c) = func_get_args();
        // ...

    }
}
8
Sajjad Shirazy

親クラスと子クラスで同じ関数を使用しているが、子クラスにはパラメーターが必要で、親クラスには必要ない場合、_Strict Standards_エラーが発生します。

マネージャー:

_public function getAtPosition($position)
{
    foreach ($this->getList() as $obj)
    {
        if ($obj->getPosition() == $position)
            return $obj;
    }

    return null;
}
_

MenuManagerはManagerを拡張します:

_public function getAtPosition($position, $parent)
{
    foreach ($this->getList() as $m)
    {
        if ($m->getParent() == $parent && $m->getPosition() == $position)
            return $m;
    }

    return null;
}
_

この例はエラーを生成します:

厳格な標準:MenuManager :: getAtPosition()の宣言はManager :: getAtPosition($ position)と互換性がなければなりません

関数には同じ引数がないため、使用していない場合でも、これをだまして引数を追加しましょう。

マネージャー:

_public function getAtPosition($position, $dummy = 0) // Dummy to avoid Strict standards errors
{
    foreach ($this->getList() as $obj)
    {
        if ($obj->getPosition() == $position)
            return $obj;
    }

    return null;
}
_

MenuManagerはManagerを拡張します:

_public function getAtPosition($position, $parent = 0)
{
    foreach ($this->getList() as $m)
    {
        if ($m->getParent() == $parent && $m->getPosition() == $position)
            return $m;
    }

    return null;
}
_

注意が必要なのは、getAtPosition()を_MenuManager.class.php_から使用する場合、親の宣言と一致させるために_$parent = 0_を宣言する必要があるため、実際に2つのパラメーターを送信していることです。

Managerを拡張し、getAtPosition()を含まないすべてのクラスは、Managerのメソッドを使用します。

子クラスで宣言された場合、phpは親のメソッドではなく、子クラスのメソッドを使用します。 PHPにはoverloadingがありません。そのため、適切に実装されるまでそれを回避しました。

1

より良い答えがあります- https://stackoverflow.com/a/9243127/2165415

例えば、
parentClass::customMethod($thing = false)および
childClass::customMethod($thing)
そのため、クラスのcustomMethod()を呼び出すと、子のメソッドが最初の引数のデフォルト値を定義していないため、エラーが発生する可能性があります。

1
T.Todua