plugin guide functions example codex php wordpress woocommerce

php - guide - Normas estrictas: la declaración de "debería ser compatible con"



woothemes wordpress (5)

Acabo de instalar woocommerce 2.0 (en Wordpress) en PHP 5.4, y obtuve esto:

Normas estrictas : La declaración de WC_Gateway_BACS :: process_payment () debe ser compatible con WC_Payment_Gateway :: process_payment () en D: / my / path / to / htdocs / wordpress / plugins / woocommerce / classes / gateways / bacs / class-wc-gateway -bacs.php en linea ...

Reviso los archivos y encontré que WC_Payment_Gateway no tiene método process_payment() . Necesito saber cómo resolver esto (no configurando error_reporting() ).

¿Qué es exactamente los estándares estrictos en PHP?
¿En qué condiciones obtenemos ese error?


Aquí hay una mejor respuesta: https://.com/a/9243127/2165415

por ejemplo,
parentClass::customMethod($thing = false) y
childClass::customMethod($thing)
por lo tanto, cuando llama a customMethod() para la clase, puede desencadenar el error, porque el método del niño no ha definido un valor predeterminado para el primer argumento.


Cuando está utilizando la misma función en una clase primaria y en una clase secundaria, pero la clase secundaria necesita parámetros, mientras que la principal no, obtendrá el error de Strict Standards .

Ejemplo

Gerente:

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

MenuManager extiende el Administrador:

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

Este ejemplo generará un error:

Estándares estrictos: Declaración de MenuManager :: getAtPosition () debe ser compatible con Manager :: getAtPosition ($ position)

Debido a que no tenemos los mismos argumentos para la función, entonces trucemos esto y agreguemos argumentos, ¡aunque no los estemos usando!

Gerente:

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 extiende el Administrador:

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

Solo uno para tener cuidado es que al usar getAtPosition() de MenuManager.class.php , asegúrese de que en realidad está enviando 2 parámetros, ya que tenemos que declarar $parent = 0 para que coincida con la declaración de los padres.

Cada clase que extiende el Manager y que no contenga getAtPosition() usará el método del Manager .

Si se declara en una clase secundaria, php utilizará el método de la clase secundaria en lugar del de los padres. No hay overloading en PHP, por lo que es así como trabajé en eso hasta que se implementa correctamente.


Si desea mantener el formulario OOP sin desactivar ningún error, también puede:

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(); // ... } }


WC_Payment_Gateway se define en abstract-wc-payment-gateway.php y declara un método

function process_payment() {}

mientras que WC_Gateway_BACS define como

function process_payment( $order_id ) { ...

(tal vez confundiste WC_Payment_Gateway y WC_Payment_Gateway s ).

Entonces, firma diferente (0 parámetros vs 1 parámetro) -> error estricto.
Como parece que * se usa siempre con un parámetro, podría cambiar

function process_payment() {}

a

function process_payment($order_id) {}

(*) tenga en cuenta que sé de woocommerce solo desde los últimos cinco minutos, así que no confíe en mi palabra.


Cita del Manual de PHP

En PHP 5 está disponible un nuevo nivel de error E_STRICT. Antes de PHP 5.4.0, E_STRICT no se incluía en E_ALL, por lo que tendría que habilitar explícitamente este tipo de nivel de error en> PHP <5.4.0. Habilitar E_STRICT durante el desarrollo tiene algunos beneficios. Los mensajes ESTRICTOS> proporcionan sugerencias que pueden ayudar a asegurar la mejor interoperabilidad y la compatibilidad> hacia adelante de su código. Estos mensajes pueden incluir elementos tales como llamar métodos estáticos no estáticos, definir propiedades en una definición de clase compatible mientras se define en> un rasgo usado, y antes de PHP 5.3, algunas características en desuso emitirían errores E_STRICT, como asignar objetos por referencia a instanciación

Está recibiendo este error porque la declaración WC_Gateway_BACS :: process_payment () es diferente de WC_Payment_Gateway :: process_payment () (puede que no sea la misma cantidad de parámetros, etc.). Si WC_Payment_Gateway no tiene un método process_payment, verifique su clase padre :)

Además, si desea deshabilitar los errores de STRICT, agregue ^ E_STRICT a su configuración de informe de errores, por ejemplo:

error_reporting(E_ALL ^ E_STRICT);