web-dev-qa-db-ja.com

PHP関数のコードを再構築/取得

名前で関数のコードをプログラムで取得できますか?

お気に入り:

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)

62
Marek Sebera

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);
74
Brandon Horsley

関数の実際のコードを提供するものはありません。利用可能なものに近い唯一のものは ReflectionFunction クラスです。クラスの場合は ReflectionClass があり、クラスメンバー(定数、変数、メソッド)とその可視性が提供されますが、実際のコードはまだありません。


回避策(ソースファイルの読み取りが必要です):
ReflectionFunction :: export を使用して、関数が宣言されているファイル名と行間隔を確認し、そのファイルの内容をそれらの行で読み取ります。文字列処理を使用して、最初の{と最後の}の間を取得します。

注:リフレクションAPIのドキュメントは不十分です。

17
Alin Purcaru

私たちは、さまざまなオペレーティングシステム、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;
3
ZiTAL

ありがとう、最終機能

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;   
}
1
emmanuel