Intereting Posts
Как назначить содержимое файла переменной в PHP рассчитать рабочее время между двумя датами в PHP как конвертировать несколько html-файлов с помощью Dompdf? PHP 7, Symfony 3: Fatal error 1 абстрактный метод и поэтому должен быть объявлен абстрактным или реализовать остальные методы Regex для захвата всего перед первой необязательной строкой Преобразование кода PHP в C ++ Codeigniter переключается на вторичную базу данных, если первичный файл Ассоциативный массив, значения суммы одного и того же ключа Библиотека PHP, которая генерирует текст ASCII Art Установить набор символов с помощью MySQLi Есть ли что-то в PHP, эквивалентное LINQ в C #? Как динамически генерировать ключ клиента openvpn с помощью php и передавать переменные команде shell? sqlsrv_num_rows Не возвращает никакой ценности Статические переменные PHP в двойных кавычках Как указать родительское поле запроса из подзапроса в mySQL?

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

Я только что установил 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?
В каком состоянии мы получаем эту ошибку?

Solutions Collecting From Web of "Строгие стандарты: Декларация «должна быть совместима с»"

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