Voici une bidouille pour retrouver l'endroit où est définie une fonction.

Mise en situation

Il arrive parfois qu'on peine à retrouver l'endroit où à été définie une fonction (moultitude de required, manque de clareté du code, défaillance de l'inspecteur Zend...).
J'ai donc pondu vite fait cette fonction, qui ne demande qu'à être optimisée.

Le code
function find_function($S_functionName) {
	$A_return	= array();
	
	// si la fonction existe pas, on lache l'affaire
	if (!function_exists($S_functionName)) {
		$A_return[]	= 'function '.$S_functionName.' does not exists';
		
	} else {
		// recupere la liste des fichiers inclus (ou required)
		$A_includedFiles	= get_included_files();
		
		// on parcours cette liste
		foreach ($A_includedFiles as $S_file) {
			// si on ne peut pas acceder au fichier, on lache l'affaire
			if (!is_readable($S_file)) {
				break;
				
			}
			
			// on récupère le contenu du fichier ligne par ligne
			$A_fileContent	= file($S_file);
			foreach ($A_fileContent as $I_line => $S_line) {
				// si on trouve la fonction, on l'enregistre
				if (preg_match('/function[[:space:]]*'.$S_functionName.'[[:space:]]*\(/', $S_line)) {
					$A_return[]	= $S_file.':'.($I_line + 1);
					
				}
				
			}
			
		}
		
	}
	return $A_return;
	
}
Utilisation
  1. Copiez cette fonction dans votre appli, de façon à ce qu'elle soit inclue automatiquement (dans le globalConf, par exemple).
  2. à l'endroit où vous utilisez la fonction "inconnue", appelez find_function('ma_function'); (pour être sûr d'être dans le bon contexte).
  3. Elle renvoi un tableau contenant les nom des fichier, et les ligne où la définition de la fonction à été trouvée.
Exemple

Avec la fonction print_rn :

ma_function();
print_rn(find_function('ma_function'));

Qui retournera :

array(1) {
  [0]=>
  string(39) "/home/toto/www/inc/tata.inc.php:490"
}
Conclusion

Voilà, pour un premier jet, c'est pas mal.
Par contre je n'ai tester qu'avec des "fonctions" bêtes et méchantes, et pas avec des méthodes de classe.
Théoriquement, ça doit également marcher, n'indiquant que le nom de la méthode :

$O_objet->maMethode();
print_rn(find_function('maMethode'));