Exécuter une fonction si c'en est une

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 579 fois - Téléchargée 27 fois

Contenu du snippet

Un de mes amis m'a demandé de lui faire ce bout de code tout court mais qui peut servir.

Le principe: on donne un string en paramètre. Si c'est un "bête" string, il est affiché, s'il correspond à une fonction alors la fonction sera exécutée et le résultat retourné. Il en avait besoin pour stocker des fonctions perso dans une base de données...

L'exemple que je donne ici donne:
$name = "bonjour les amis"; -> myfunc($name): bonjour les amis
$string = "fctperso('bonjour les amis')"; -> myfunc($string): Vous avez écrit bonjour les amis
$fct1 = "strrev('bonjour les amis')"; -> myfunc($fct1): sima sel ruojnob
$fct2 = "pow(2, 8)"; -> myfunc($fct1): 256

Source / Exemple :


<?php  

function myfunc($param){

	// on sépare le nom des paramètres
	preg_match_all("(.[^\(]*)", $param, $sep);

	// s'il n'y a pas de paramètres ou de (), c'est que ce n'est pas une fonction
	// on affiche simplement $param
	if (count($sep[0]) == 1) echo $param;

	// si c'est une fonction (prédéfinie ou perso, c'est égal)...
	else{

		// on récupère les paramètres
		// ici je ne gère pas le cas où un paramètre
		// est du type "bonjour l'ami" bikoz -> ' <-
		$sup = array('\'','"'); // on vire les quotes
		$fct = substr($sep[0][1],1,-1);
		$arg = str_replace($sup,'',$fct);
		$arg = split(",",$arg);
				
		// et on exécute la fonction
		return call_user_func_array($sep[0][0],$arg);
	}

}

// fonction perso
function fctperso($param) { 
   	if ($param == 'a') 
      		return 'Vous avez écrit "a"'; 
   	else  
      		return 'Vous avez écrit '.$param; 
	} 

// une chaine de caractères
$name    = "bonjour les amis";  
// une fonction perso
$string  = "fctperso('bonjour les amis')";  
// une fonction prédéfinie
$fct1    = "strrev('bonjour les amis')";
// une autre fonction prédéfinie avec plusieurs paramètres
$fct2    = "pow(2, 8)";

// le résultat: 
echo myfunc($name).'<br />'.myfunc($string).'<br />'.myfunc($fct1).'<br />'.myfunc($fct2);

?>

Conclusion :


Voilà... et le premier qui me sort le même code en 2 lignes, je le frappe ;)

A voir également

Ajouter un commentaire

Commentaires

malik7934
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
2 -
Hehe, en reflechissant, j'ai quand meme compris ce qui coincait avec eval...
<?php
$fct1 = "bonjour les amis";
eval( "\$fct1 = $fct1;" );
echo $fct1;
?>
ca, ca va donner une erreur (parse error, unexpected T_STRING). Bien sur $fct1 = "'bonjour les amis'" est la solution mais dans le cas present, celui qui m'a demande la fct ne peux pas changer le contenu de la base de donnees...
GiUsTiNo
Messages postés
129
Date d'inscription
lundi 26 avril 2004
Statut
Membre
Dernière intervention
30 juin 2012
-
le plus facile est de mettre directement le code php dans la fonction eval() pour pas chipoter avec les slash/guillemets... Personnelement, j'ai utilisé cette technique, mes pages étant en base de données, je les récupérais avec eval() (si code php il y avait => avec le html, cela retourne une erreur, bien sur :p)

Bonne continuation
malik7934
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
2 -
J'ai testé tes deux propositions. La deuxième retourne une erreur, mais la première va:

$fct1 = "strrev('bonjour les amis')";
eval( "\$fct1 = $fct1;" );
echo $fct1;

cela donne bien "sima sel ruojnob"... well... je crois bien que je l'ai dans l'os!

Ben voilà, touché coulé le malik7934!
cs_Elektordi
Messages postés
187
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 janvier 2008
-
Oui, j'ai déjà utilisé eval...

Et si tu enlevait les guillemets:

eval( "\$fct1 = $fct1;" );
ou
eval( "\$fct1 = ".$fct1.";" );

Quand au $name, c'est car ds ta fonction tu as rajouté "if (count($sep[0]) == 1) echo $param;", mais bon ca peut s'arranger tout en utilisant eval!
malik7934
Messages postés
1162
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
2 -
Nah, pas d'accord, primo eval($name) par exemple va te retourner une erreur, ensuite si je me fie à l'exemple sur php.net:

<?php

$name = "bonjour les amis";
eval( "\$name = "$name";" );
echo $name;
echo '
';

$string = "fctperso('bonjour les amis')";
eval( "\$tring = "$string";" );
echo $string;
echo '
';

$fct1 = "strrev('bonjour les amis')";
eval( "\$fct1 = "$fct1";" );
echo $fct1;
echo '
';
echo '
';

$fct2 = "pow(2, 8)";
eval( "\$fct2 = "$fct2";" );
echo $fct2;
echo '
';

?>
va me donner
bonjour les amis
fctperso('bonjour les amis')
strrev('bonjour les amis')
pow(2, 8)

et non pas le résultat des fonctions.
Hehe... j'avais d'ailleurs commencé par essayer avec eval... t'as essayé ce que tu disais avant de poster? Peut-être que je ne sais pas employer eval de la bonne manière...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.