名前で関数のコードをプログラムで取得できますか?
お気に入り:
function blah($a, $b) { return $a*$b; }
echo getFunctionCode("blah");
出来ますか?
関数/クラスコードを再構築するためのPHPの自己記述関数はありますか?
(sourcesファイルからソースコードを正しく取得する代わりに)
Java存在します: http://Java.Sun.com/developer/technicalArticles/ALT/Reflection/
PHPの場合:
get_class_methods()
typeof
ReflectionFunction(thanks Alin Purcaru)
ReflectionFunctionを使用するという提案を拡張すると、次のようなものを使用できます。
$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);
関数の実際のコードを提供するものはありません。利用可能なものに近い唯一のものは ReflectionFunction クラスです。クラスの場合は ReflectionClass があり、クラスメンバー(定数、変数、メソッド)とその可視性が提供されますが、実際のコードはまだありません。
回避策(ソースファイルの読み取りが必要です):
ReflectionFunction :: export を使用して、関数が宣言されているファイル名と行間隔を確認し、そのファイルの内容をそれらの行で読み取ります。文字列処理を使用して、最初の{
と最後の}
の間を取得します。
注:リフレクションAPIのドキュメントは不十分です。
私たちは、さまざまなオペレーティングシステム、gnu/linux、windows、macを介してプログラムしています。このため、コードに異なるキャリッジリターンがあります。これを解決するために、Brandon Horsleyの答えを分岐し、さまざまなCRをチェックしてコードを取得する準備をしました関数の代わりにクラスのメソッド:
$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;
ありがとう、最終機能
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;
}