[RESOLU] Erreur Php

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 02:43

Bonjour,

Voici une ligne qui fonctionne parfaitement chez moi (en local):

$plug = $separators[0]::getInstance(); //$separators[0] contient le nom d'une classe

Sur mon hébergement, j'ai une erreur

Parse Error unexpected t_paamayim_nekudotayim sur cette ligne qui bloque tout mon site.
J'ai donc cherché à appeler la méthode autrement, par :

$plug = forward_static_call(array($separators[0], 'getInstance'));

Cette ligne ne bloque plus le site, mais dans la page qui appelle le "module" (plug) :

Fatal error: Call to undefined function forward_static_call()

AhAh ... cette fonction n'existe que depuis php 5.3 ...

Bref ... quelqu'un a-t-il une solution pour appeler cette méthode statique de façon "dynamique" (en attendant, je n'ai qu'un plug, je peux donc mettre directement son nom, mais bon ...)

Merci
Modifié en dernier par devlop78 le 11 sept. 2010, 20:58, modifié 1 fois.

Eléphant du PHP | 55 Messages

11 sept. 2010, 10:13

Bonjour,

Comme l'indique l'erreur, ton problème vient de paamayim_nekudotayim, autrement dit l'opérateur de portée (::). L'explication de ton problème se trouve dans ton poste, la fonction forward_static_call() n'est pas définie parce que tu as une version inférieure à la 5.3. Or le référencement d'une classe en utilisant une variable n'est lui aussi possible qu'à partir de la version 5.3.

La solution, un peu lourde certes, est de passer par un switch... ou de migrer vers PHP5.3 si c'est possible.

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 20:39

Donc, si je comprends bien, ce n'est pas "automatique". Car à l'époque du procédural (petit lol), $$mavar et $mafonction() fonctionnait très bien ... j'en ai donc conclu que cela fonctionnait donc toutes les circonstances (et chez moi ça marchait !). Donc, c'est un problème d'implémentation ...

Passer à php5.3 non pas possible, c'est un hébergeur mutualisé. Ce qui est dommage car je crois que le "bon" garbage collector n'est présent que depuis php5.3.

Ce qui est asssez drôle, c'est que :

if (class_exists($separators[0],false)) {
if (method_exists($separators[0],'getInstance')) {
if (method_exists($plug,$separators[1])){
$plug->$methode($decoupage);

fonctionnent ...

On serait donc dans un problème purement lié au static ??

Ca me fait penser ... pour palier au problèmen je pourrais directement faire un new $separators[0] (sans Singleton), en vérifiant au préalable dans la classe qui possède son instance qu'il n'existe pas. Mais là ... j'avais même pas à m'en préoccuper ..

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 20:41

De toutes façons, c'est pas si mal, étant donné que tout ce code est actuellement coté Vue. Ca devrait être au Controlleur de s'occuper du chargement de la classe. C'est donc à revoir !

ViPHP
ViPHP | 5462 Messages

11 sept. 2010, 20:44

et comme ca :
$plug = call_user_func($separators[0] . '::getInstance');

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 20:49

J'ai failli te dire que j'en doutais mais :

http://php.net/manual/fr/function.call-user-func.php

$classname = "maclasse";

call_user_func(array($classname, 'dit_bonjour'));
call_user_func($classname .'::dit_bonjour'); // Depuis 5.2.3

Ca m'arrangerait effectivement car je suis un amoureux du Singleton ... Ce qui est dommage (oui et non) car j'en suis tellement satisfait que je n'ai jamais essayé les autres Desing Patterns. Mais j'ai un code si fluide, des classes qui communiquent si bien entre elles ... c'est vraiment une superbe invention :lol: :lol: :lol: (j'ai pas trouvé le smiley Love ...)

ViPHP
ViPHP | 5462 Messages

11 sept. 2010, 20:52

donc c'est ok ?

devlop78
Invité n'ayant pas de compte PHPfrance

11 sept. 2010, 20:57

Si j'ai bien compris la première réponse, j'ai trouvé l'origine du problème (fonctionnalité non implémentée dans la version 5.2).
J'essayerai ta fonction magique ^^. C'est un peu le bazarre n'empêche toutes ces fonctions d'appel de fonction (de callback comme on dirait en JS ou AS3).
Pour le moment je n'ai pas le temps de voir et je voulais surtout savoir pourquoi, car je n'aime pas avoir la sensation d'un "beug". Je suis trop habitué par Windows et j'attends mieux de Linux, Apache et PhP ^^

Je tiens au courant !

ViPHP
ViPHP | 5462 Messages

11 sept. 2010, 21:03

y'a pas de bug, c'est l'une des formes du type callback

devlop78
Invité n'ayant pas de compte PHPfrance

12 sept. 2010, 00:16

Je parlais d'un éventuel beug sur $$mavar::methode() pas sur les callback. Mais pas de beug comme montré précedemment.

devlop78
Invité n'ayant pas de compte PHPfrance

12 sept. 2010, 01:31

La fonction fonctionne Nickel sur le serveur de prod mais fait planter Apache chez moi !! Cela dit, ce n'est pas le premier à me le faire planter ... C'est qu'il est sensible !!

ViPHP
ViPHP | 5462 Messages

12 sept. 2010, 05:34

La fonction fonctionne Nickel sur le serveur de prod mais fait planter Apache chez moi !! Cela dit, ce n'est pas le premier à me le faire planter ... C'est qu'il est sensible !!
bizarre le plus souvent quand apache plante c'est un problème de mémoire au niveau de php