2010-05-13 5 views
2

J'ai une classe comme celui-ciAppel d'une méthode avec une valeur de tableau en PHP

class someclass{ 
    public function somemethod(){} 
} 

Maintenant, j'ai un tableau:

$somearray['someclass'] = new someclass(); 
$somearray['somemethod'] = 'somemethod'; 

Comment puis-je les tirer, j'ai essayé les éléments suivants:

$somearray['someclass']->$somearray['somemethod'](); 

usign ce que je reçois l'erreur suivante:

Fatal error: Method name must be a string in ......................

Quelqu'un a une idée sur la façon de faire cela?

+1

Votre syntaxe est correcte et un er ror ne devrait pas être jeté. – webbiedave

+0

Etrange, j'ai simplifié le code ici, alors peut-être que ma faute est ailleurs. –

+0

Lorsque vous exécutez votre propre code simplifié, obtenez-vous toujours l'erreur? – erisco

Répondre

0

Je ne peux pas reproduire l'erreur avec le code fourni (Comme @webbiedave souligné la syntaxe est correcte).

Toutefois, vous pouvez convertir le nom de la méthode en une chaîne avant de l'utiliser pour vous assurer que le nom de la méthode est une chaîne. Cela garantira que même s'il s'agit d'un objet défini par l'utilisateur avec une méthode __toString(), il sera converti en sa représentation sous forme de chaîne.

$somearray['someclass']->{(string)$somearray['somemethod']}(); 
+0

J'ai essayé ceci, et j'obtiens une autre erreur: Appeler à un membre fonction() sur un non-objet –

+2

@Saif vous avez un problème ailleurs dans votre code. Cela indique que '$ somearray ['someclass']' n'est pas défini ou null. Aussi $ somearray ['somemethod'] 'n'est pas défini ou est nul. – Yacoby

+0

Oui, la faute était ailleurs. Tout va bien maintenant même sans le casting. Merci pour votre temps. –

0

Essayez $somearray['someclass']->{$somearray['somemethod']}();

+0

Quand je fais cela, je reçois: Le nom de la méthode doit être une chaîne –

+0

Avez-vous vérifié que $ somearray ['somemethod'] 'contient effectivement une chaîne? – thetaiko

+0

J'ai testé que cela fonctionne. Assurez-vous simplement que c'est une chaîne. –

1

Si elle ne veut pas travailler de cette façon (et je suis d'accord qu'il faut), vous pouvez essayer:

call_user_func(array($somearray['someclass'], $somearray['somemethod'])); 
+0

+1 Bonne méthode cela fonctionne aussi. Le code que j'ai utilisé fonctionnait aussi, j'avais une autre erreur dans mon code. Mais c'est définitivement une bonne alternative. –

0

Le code suivant a été testé et semble être voulez-vous voulez:

<?php 


class someclass{ 
    public function somemethod(){ echo 'test'; } 
} 


$somearray['someclass'] = new someclass(); 
$somearray['somemethod'] = 'somemethod'; 

$somearray['someclass']->{$somearray['somemethod']}(); 

?> 
0

Que diriez-vous ceci:

foreach (get_class_methods(get_class(new someclass()) as $method) { 
    $method();  
} 
Questions connexes