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


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

Строгие стандарты: Объявление WC_Gateway_BACS::process_payment() должен быть совместим с WC_Payment_Gateway::process_payment() в D:\my\path\to\htdocs\wordpress\plugins\woocommerce\classes\gateways\bacs\class-wc-gateway-bacs.php на линии...

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

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

Author: 7ochem, 2013-06-21

5 answers

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

function process_payment() {}

В то время как WC_Gateway_BACS определяет его как

function process_payment( $order_id ) { ...

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

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

function process_payment() {}

До

function process_payment($order_id) {}

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

 19
Author: VolkerK, 2013-06-21 11:47:23

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

В PHP 5 доступен новый уровень ошибок E_STRICT. До PHP 5.4.0 E_STRICT не был >включен в E_ALL, поэтому вам придется явно включить этот уровень ошибок в >PHP содержат предложения, которые могут помочь обеспечить наилучшую совместимость и пересылку > совместимость вашего кода. Эти сообщения могут включать такие вещи, как вызов нестатических >методы статически, определяя свойства в совместимом определении класса, в то время как они определены в >используемой характеристике, и до PHP 5.3 некоторые устаревшие функции выдавали бы ошибки E_STRICT>, такие как назначение объектов по ссылке при создании экземпляра.

Вы получаете эту ошибку, потому что Объявление wc_gateway_bacs::process_payment() отличается от объявления wc_payment_gateway::process_payment() (может быть разное количество параметров и т. Д.). Если wc_payment_gateway не имеет метода process_payment, проверьте, что это родительский класс:)

Кроме того, если вы хотите отключить СТРОГИЕ ошибки, добавьте ^ E_STRICT в конфигурацию отчетов об ошибках, например:

error_reporting(E_ALL ^ E_STRICT);
 12
Author: paranoid, 2013-06-21 11:41:51

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

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
Author: Sajjad Shirazy, 2014-12-06 07:59:55

Вот лучший ответ - https://stackoverflow.com/a/9243127/2165415

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

 1
Author: T.Todua, 2017-05-23 11:53:47

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

.

Пример

Менеджер:

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

    return null;
}

Менеджер меню расширяет менеджер:

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

    return null;
}

Этот пример приведет к ошибке:

Строгие стандарты: Объявление MenuManager::getatposition() должно быть совместимо с Менеджер::Получить позицию ($позиция)

Потому что у нас нет одинаковых аргументов для функции, так что давайте обманем это и добавим аргументы, даже если мы их не используем!

Менеджер:

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

Менеджер меню расширяет менеджер:

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, так что именно так я обходил его, пока он не был должным образом реализован.

 1
Author: Psychokiller1888, 2016-11-24 21:51:54