71 votes

Reconstruire / récupérer le code source d'une fonction PHP

Puis-je obtenir par programme le code source d'une fonction par son nom ?

Comme:

 function blah($a, $b) { return $a*$b; }
echo getFunctionCode("blah");

Est-il possible?

Existe-t-il des fonctions auto-descriptives php pour reconstruire le code des fonctions/classes ? (Je veux dire au lieu d'obtenir le code source directement à partir du fichier source.)

En Java il existe :http://java.sun.com/developer/technicalArticles/ALT/Reflection/

97voto

Brandon Horsley Points 4001

En développant la suggestion d'utiliser la ReflectionFunction, vous pouvez utiliser quelque chose comme ceci :

 $func = new ReflectionFunction('myfunction');
$filename = $func->getFileName();
$start_line = $func->getStartLine() - 1; // it's actually - 1, otherwise you wont get the function() block
$end_line = $func->getEndLine();
$length = $end_line - $start_line;

$source = file($filename);
$body = implode("", array_slice($source, $start_line, $length));
print_r($body);

7voto

ZiTAL Points 690

Nous programmons via différents systèmes d'exploitation, gnu/linux, windows, mac... Pour cette raison, nous avons différents retours chariot dans le code, pour résoudre ce problème, j'ai forgé la réponse de Brandon Horsley et je me prépare à vérifier différents CR et à obtenir le code de une méthode de classe au lieu d'une fonction :

 $cn = 'class_example';
$method = 'method_example';

$func = new ReflectionMethod($cn, $method);

$f = $func->getFileName();
$start_line = $func->getStartLine() - 1;
$end_line = $func->getEndLine();
$length = $end_line - $start_line;

$source = file($f);
$source = implode('', array_slice($source, 0, count($source)));
// $source = preg_split("/(\n|\r\n|\r)/", $source);
$source = preg_split("/".PHP_EOL."/", $source);

$body = '';
for($i=$start_line; $i<$end_line; $i++)
    $body.="{$source[$i]}\n";

echo $body;

3voto

emmanuel Points 107

merci, fonction finale

 function get_function($method,$class=null){

    if (!empty($class)) $func = new ReflectionMethod($class, $method);
    else $func = new ReflectionFunction($method);

    $f = $func->getFileName();
    $start_line = $func->getStartLine() - 1;
    $end_line = $func->getEndLine();
    $length = $end_line - $start_line;

    $source = file($f);
    $source = implode('', array_slice($source, 0, count($source)));
    $source = preg_split("/".PHP_EOL."/", $source);

    $body = '';
    for($i=$start_line; $i<$end_line; $i++)
        $body.="{$source[$i]}\n";

    return $body;   
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X