web-dev-qa-db-fra.com

Normes strictes: la déclaration de '' doit être compatible avec ''

Je viens d'installer woocommerce 2.0 (sur Wordpress) sur PHP 5.4, et j'ai obtenu ceci:

Normes strictes: La déclaration de WC_Gateway_BACS :: process_payment () doit être compatible avec WC_Payment_Gateway :: process_payment () dans D:\my\path\to\htdocs\wordpress\plugins\woocommerce\classes\gateways\bacs\class-wc-gateway-bacs.php en ligne ...

Je vérifie les fichiers et constate que WC_Payment_Gateway N'a pas de méthode process_payment(). J'ai besoin de savoir comment résoudre ce problème (pas en définissant error_reporting()).

Qu'est-ce que Normes strictes in PHP exactement?
Dans quel état obtenons-nous cette erreur?

19
egig

WC_Payment_Gateway est défini dans abstract-wc-payment-gateway.php et déclare une méthode

function process_payment() {}

tandis que WC_Gateway_BACS le définit comme

function process_payment( $order_id ) { ...

(peut-être que vous avez mélangé WC_Payment_Gateway et WC_Payment_Gateways).

Donc, signature différente (0 paramètre vs 1 paramètre) -> erreur stricte.
Puisqu'il semble * être toujours utilisé avec un paramètre, vous pouvez changer

function process_payment() {}

à

function process_payment($order_id) {}

(*) Gardez à l'esprit que je ne connais le woocommerce que depuis les cinq dernières minutes, alors ne prenez pas mon mot pour ça.

19
VolkerK

Citation de PHP Manual

Dans PHP 5, un nouveau niveau d'erreur E_STRICT est disponible. Avant PHP 5.4.0 E_STRICT n'était pas> inclus dans E_ALL, vous devez donc activer explicitement ce type de niveau d'erreur dans> PHP <5.4.0. L'activation d'E_STRICT pendant le développement présente certains avantages. Messages STRICT> fournissent des suggestions qui peuvent aider à assurer la meilleure interopérabilité et compatibilité> de votre code. Ces messages peuvent inclure des choses comme appeler non -statique> méthodes statiquement, définissant des propriétés dans une définition de classe compatible alors qu'elles sont définies dans> un trait utilisé, et avant PHP 5.3 certaines fonctionnalités obsolètes émettraient des erreurs E_STRICT> telles que l'attribution d'objets par référence lors instanciation.

Vous recevez cette erreur car WC_Gateway_BACS :: process_payment () la déclaration est différente de WC_Payment_Gateway :: process_payment () (il ne s'agit peut-être pas de la même quantité de paramètres, etc.). Si WC_Payment_Gateway n'a pas de méthode process_payment, vérifiez sa classe parent :)

De plus, si vous souhaitez désactiver les erreurs STRICT, ajoutez ^ E_STRICT à votre configuration de rapport d'erreurs, par exemple:

error_reporting(E_ALL ^ E_STRICT);
12
paranoid

si vous souhaitez conserver le formulaire OOP sans désactiver aucune erreur, vous pouvez également:

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

    }
}
8
Sajjad Shirazy

Lorsque vous utilisez la même fonction dans une classe parent et une classe enfant, mais que la classe enfant a besoin de paramètres tandis que la classe parent ne l'est pas, vous obtiendrez l'erreur Strict Standards.

Exemple

Directeur:

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

    return null;
}

MenuManager étend Manager:

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

    return null;
}

Cet exemple va générer une erreur:

Normes strictes: la déclaration de MenuManager :: getAtPosition () doit être compatible avec Manager :: getAtPosition ($ position)

Parce que nous n'avons pas les mêmes arguments à la fonction, nous allons donc tromper cela et ajouter des arguments, même si nous ne les utilisons pas!

Directeur:

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 étend Manager:

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

    return null;
}

Une seule chose à faire attention est que lorsque vous utilisez getAtPosition() à partir de MenuManager.class.php, Assurez-vous que vous envoyez réellement 2 paramètres, car nous devons déclarer $parent = 0 Afin de faire correspondre le parent déclaration.

Chaque classe étendant Manager et ne contenant pas getAtPosition() utilisera la méthode de Manager.

S'il est déclaré dans une classe enfant, php utilisera la méthode de la classe enfant au lieu de celle du parent. Il n'y a pas de overloading en PHP, c'est ainsi que j'ai travaillé autour de lui jusqu'à ce qu'il soit correctement implémenté.

1
Psychokiller1888

Voici une meilleure réponse - https://stackoverflow.com/a/9243127/2165415

par exemple,
parentClass::customMethod($thing = false) et
childClass::customMethod($thing)
donc, lorsque vous appelez customMethod() pour la classe, cela peut déclencher l'erreur, car la méthode de l'enfant n'a pas défini de valeur par défaut pour le premier argument.

1
T.Todua