Я только что установил 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 on line …
Я проверяю файлы и обнаружил, что у WC_Payment_Gateway
нет метода process_payment()
. Мне нужно знать, как это разрешить (не устанавливая error_reporting()
).
Что такое строгие стандарты в PHP?
В каком состоянии мы получаем эту ошибку?
WC_Payment_Gateway
определяется в abstract-wc-payment-gateway.php
и объявляет метод
function process_payment() {}
в то время как 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 только с прошлых пяти минут, так что не верьте мне на слово.
Ответить с цитированием
В 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);
если вы хотите сохранить форму ООП без выключения какой-либо ошибки, вы также можете:
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(); // ... } }
Вот лучший ответ – https://stackoverflow.com/a/9243127/2165415
например,
parentClass::customMethod($thing = false)
и
childClass::customMethod($thing)
поэтому, когда вы вызываете customMethod()
для класса, это может вызвать ошибку, потому что метод child не определил значение по умолчанию для первого аргумента.
Когда вы используете одну и ту же функцию в родительском классе и дочернем классе, но для дочернего класса требуются параметры, а родительский – нет, вы получите ошибку 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 () должна быть совместима с 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 расширяет Менеджер:
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
, так что я работал вокруг него, пока он не будет правильно реализован.