Строгие стандарты: Декларация "должна быть совместима с"

Я только что установил woocommerce 2.0 (на Wordpress) на PHP 5.4, и я получил это:

Строгие стандарты: Декларация WC_Gateway_BACS:: process_payment() должен быть совместим с WC_Payment_Gateway:: process_payment() в D:\My\путь\к\HTDOCS\WordPress\Plugins\WooCommerce\Classes\шлюзами\BACS\класс-туалет-шлюз-bacs.php on line...

Я проверяю файлы и обнаружил, что WC_Payment_Gateway не имеет метода process_payment(). Мне нужно знать, как это разрешить (не установив error_reporting()).

Что такое Строгие стандарты в PHP?
В каком состоянии мы получаем эту ошибку?

Ответ 1

WC_Payment_Gateway определяется в abstract-wc-payment-gateway.php и объявляет метод

function process_payment() {}

while WC_Gateway_BACS определяет его как

function process_payment( $order_id ) { ...

(возможно, вы перепутали WC_Payment_Gateway и WC_Payment_Gateway s).

Таким образом, различная сигнатура (0 параметров против 1 параметра) → строгая ошибка.
Поскольку кажется, что * используется всегда с одним параметром, вы можете изменить

function process_payment() {}

к

function process_payment($order_id) {}

(*) Имейте в виду, что я знаю woocommerce только с последних пяти минут, поэтому не верьте мне на слово.

Ответ 2

Цитата из руководства PHP

В PHP 5 доступен новый уровень ошибки E_STRICT. До PHP 5.4.0 E_STRICT не был > включен в E_ALL, поэтому вам нужно было бы явно включить этот уровень ошибок в > PHP < 5.4.0. Включение 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);

Ответ 3

Если вы хотите сохранить форму ООП без выключения какой-либо ошибки, вы также можете:

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();
        // ...

    }
}

Ответ 4

Если вы используете одну и ту же функцию в родительском классе и дочернем классе, но для дочернего класса требуются параметры, а родительский - нет, вы получите ошибку Strict Standards.

Пример

Менеджер:

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

    return null;
}

MenuManager расширяет диспетчер:

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

    return null;
}

В этом примере будет создана ошибка:

Строгие стандарты: декларация MenuManager:: getAtPosition() должна быть совместимым с менеджером:: 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 расширяет диспетчер:

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 убедитесь, что вы действительно отправляете 2 параметра, так как мы должны объявить $parent = 0, чтобы соответствовать объявлению родителя.

Каждый класс, расширяющийся Manager и не содержащий getAtPosition(), будет использовать метод из Manager.

Если объявлено в дочернем классе, php будет использовать этот метод из дочернего класса вместо родительского. В PHP нет overloading, так вот как я работал вокруг него, пока он не будет правильно реализован.

Ответ 5

Вот лучший ответ - fooobar.com/info/74162/...

например,
parentClass::customMethod($thing = false) и
childClass::customMethod($thing)
поэтому, когда вы вызываете customMethod() для класса, это может вызвать ошибку, поскольку дочерний метод не определил значение по умолчанию для первого аргумента.