Exécuter une fonction si c'en est une

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

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.