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