Problème avec eval() et fonction return

Mammouth du PHP | 531 Messages

30 janv. 2011, 16:34

Bonjour,

J'essaye de faire un système de hooks qui permettrait de modifier le comportement d'une fonction.
Je ne vais pas rentrer dans les détails, je pense que mon code parlera de lui même et n'est pas difficile à comprendre.

En gros, je voudrais injecter du code dans ma fonction displayStaticContent() via la fonction pluginFunc()
Cela marche plus ou moins à moitié, car si l'on regarde ma fonction pluginFunc() elle devrait normalement faire un echo pour finalement stopper l’exécution de la fonction displayStaticContent() grâce a un return.

Pour le echo, pas de problème,e mais la fonction continue de s’exécuter jusqu'au bout malgré le return.
Si par contre je place le return avant le echo, plus rien ne se passe, le return stoppe bien displayStaticContent().

Y'a t'il quelquechose qui m'échappe ?
Je n'ai vraiment aucune piste...
<?php

function addHook($name, $func){
	global $hooks;
	$hooks[$name] = $func;
}
function callHook($name){
	global $hooks;
	if(isset($hooks[$name])) return ' ?>'.call_user_func($hooks[$name]).'<?php ';
}

function displayStaticContent(){
	global $static;
	eval(callHook('displayStaticContent'));
	echo $static['content'];
}

$hooks = array();
$static = array('id' => '1', 'name' => 'Test', 'content' => '<p>Hello.</p>');

addHook('displayStaticContent', 'pluginFunc');
function pluginFunc(){
	$return = "<?php echo '<h2>'.\$static['name'].'</h2>'; return; ?>";
	return $return;
}
?>

<?php displayStaticContent(); ?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 janv. 2011, 17:06

salut,


hum, je pense que le return met fin à eval et pas à la fonction qui utilise eval !

j'ai essayé
<?php
function pluginFunc(){
        $return = "<?php echo '<h2>'.\$static['name'].'</h2>'; 
		if (false) {
			echo 'if <br />';
		}
		else {
			return;
		}
		echo 'testagee';?>";
        return $return;
} ?>
qui tend à aller dans ce sens, mais j'ai pas trouvé de réponse exact !

edit : y a aussi ce sujet (entre autre) qui parle des hook.

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 531 Messages

30 janv. 2011, 17:37

Merci pour le lien.
En effet le return mais fin à eval().
Tu m'a mis sur une piste, il suffit de contourner en faisant un test sur eval() :
function displayStaticContent(){
	global $static;
	if(eval(callHook('displayStaticContent'))){
		echo $static['content'];
	}
}
function pluginFunc(){
	$return = "<?php echo '<h2>'.\$static['name'].'</h2>'; return false; ?>";
	return $return;
}