web-dev-qa-db-fra.com

Comment puis-je résoudre "La méthode non statique xxx: xxx () ne doit pas être appelée de manière statique dans PHP 5.4?)?"

Utilise actuellement une grande plate-forme en PHP.

Le serveur sur lequel il est hébergé a récemment été mis à niveau vers PHP 5.4.

Depuis, j'ai reçu de nombreux messages d'erreur tels que:

[Sam 26 mai 19:04:41 2012] [erreur] PHP Normes strictes: La méthode non statique Config :: getData () ne doit pas être appelée de manière statique, en supposant que $ this provient d'un contexte incompatible dans /xxx/Config.inc.php à la ligne 35

La méthode d'exemple est définie comme suit (notez le manque de mot clé 'statique'):

function &getData() {
            $configData =& Registry::get('configData', true, null);

    if ($configData === null) {
        // Load configuration data only once per request, implicitly
        // sets config data by ref in the registry.
        $configData = Config::reloadData();
    }

    return $configData;
}

Cela n'a pas posé de problème auparavant, et je suppose que les messages d'erreur (qui provoquent le blocage de l'application) peuvent être liés à la mise à niveau récente vers PHP 5.4.

Existe-t-il un paramètre PHP que je puisse modifier pour "ignorer" le manque de mot clé statique?

30
kaese

Vous pouvez soit supprimer E_STRICT De error_reporting(), soit vous pouvez simplement rendre votre méthode statique, si vous devez l'appeler de manière statique. Autant que je sache, il n’existe aucun moyen (strict) d’avoir une méthode pouvant être invoquée à la fois en tant que méthode statique et non statique. En outre, ce qui est plus ennuyeux, vous ne pouvez pas avoir deux méthodes portant le même nom, l’une statique et l’autre non statique.

42
lanzz

Désactiver le message d'alerte n'est pas un moyen de résoudre le problème. Malgré le PHP noyau continue de fonctionner, il fait des suppositions et des actions dangereuses.

Ne jamais ignorer l'erreur où PHP devrait faire l'hypothèse de quelque chose !!!!

Si la classe organisée en singleton, vous pouvez toujours utiliser la fonction getInstance () puis utiliser getData ()

Likse:

$classObj = MyClass::getInstance();
$classObj->getData();

Si la classe n’est pas un singleton, utilisez

 $classObj = new MyClass();
 $classObj->getData();
29
volkinc

Je ne vous suggère pas de cacher les erreurs de votre projet. Intead, vous devriez transformer votre méthode en statique ou essayer de créer une nouvelle instance de l'objet:

$var = new YourClass();
$var->method();

Vous pouvez également utiliser la nouvelle méthode pour faire la même chose depuis PHP 5.4:

(new YourClass)->method();

J'espère que ça t'aide!

10
Bruno Campos