19

PHP 5.4 に woocommerce 2.0 (Wordpress 上) をインストールしたところ、次のようになりました。

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

ファイルを確認したところ、WC_Payment_Gatewayメソッドがないことがわかりましたprocess_payment()。これを解決する方法を知る必要があります(設定ではありませんerror_reporting())。

PHPの厳密な標準とは正確には何ですか?
どのような状態でエラーが発生するのでしょうか?

4

5 に答える 5

14

PHPマニュアルより引用

PHP 5 では、新しいエラー レベル E_STRICT が利用可能です。PHP 5.4.0 より前では、E_STRICT は E_ALL に含まれていませんでした。開発中に E_STRICT を有効にすると、いくつかの利点があります。STRICT メッセージは、最高の相互運用性とコードの前方互換性を確保するのに役立つ提案を提供します。これらのメッセージには、静的ではないメソッドを静的に呼び出す、互換性のあるクラス定義でプロパティを定義する一方で、使用されているトレイトで定義する、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);
于 2013-06-21T11:41:51.000 に答える
8

エラーをオフにせずに 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();
        // ...

    }
}
于 2014-12-06T07:51:40.810 に答える
2

親クラスと子クラスで同じ関数を使用しているが、子クラスにはパラメーターが必要で、親クラスには必要ない場合、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()fromを使用する場合、親の宣言と一致させるためにMenuManager.class.php宣言する必要があるため、実際に 2 つのパラメーターを送信していることを確認することです。$parent = 0

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

子クラスで宣言された場合、php は親のメソッドではなく子クラスのメソッドを使用します。PHP には存在overloadingしないので、適切に実装されるまではそのように回避しました。

于 2014-01-17T19:06:21.930 に答える
1

これがより良い答えです - https://stackoverflow.com/a/9243127/2165415

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

于 2014-07-11T18:12:53.743 に答える