Строгие стандарты: Декларация "должна быть совместима с"
Я только что установил 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()
для класса, это может вызвать ошибку, поскольку дочерний метод не определил значение по умолчанию для первого аргумента.