Un petit coup de gueule envers un développeur de PHP fénéant...

Un beau matin, un problème arrive... En effet, TinyMCE (éditeur WYSIWYG en javascript) génère du code html et j'ai voulu modifier un peu ma class de conversion html2xhtml. Celle ci possède une fonction principale Convert(&$content) qui se charge de convertir le contenu HTML par référence à la variable $content.

Il devenait assez laborieux de remplir cette fonction de cette façon :

abstract class html2xhtml {
	public static function Convert(&$content) {
		self::lf_only($content);
		
		self::element_p($content);
		self::element_a($content);
		self::element_img($content);
		// and more...
	}

	public static function element_p(&$content) {
		// $content uses reference to the original $content
		// code conversion here...
	}
	
	// and more...
}

J'ai donc tenté un petit mélange de get_class_methods() et de call_user_func() pour automatiser la tâche...

abstract class html2xhtml {
	public static function Convert(&$content) {
		self::lf_only($content);
		
		$methods = get_class_methods('html2xhtml');
		foreach ($methods as $m)
			if (preg_match('/^element_/', $m))
				call_user_func(array('html2xhtml', $m), $content);
	}

	// same methods with $content passed by reference
}

Par la suite, après plusieurs heures de travail passées à autre chose, je m'aperçois que la conversion ne se fait plus ! Je relis/debuggue/modifies de fond en combles tout ce que j'ai fait depuis et pendant plusieures heures mais... rien ! Arrive enfin le moment où je m'intéresse davantage à call_user_func().

En effet, habituellement, lorsque l'on précise dans la définition de la fonction que l'on veut passer une variable par référence, il suffit de le déclarer dans le prototype de la fonction. Mais dans le cas de call_user_func, il faut préciser manuellement que l'on souhaite passer par référence (call_user_func(array('html2xhtml', $m), &$content);) ! Je regrette de ne pas avoir lu le petit bout de la doc qui aurai pu m'éviter tout cela...

Note: Notez que les paramètres pour call_user_func() ne sont pas passés par référence. http://fr3.php.net/manual/fr/function.call-user-func.php