реконструировать / получить код функции php - PullRequest
52 голосов
/ 11 августа 2011

Могу ли я программно получить код функции по его имени?

Как:

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

возможно ли это?

Существуют ли какие-либо описательные функции php для восстановления кода функции / класса?
(имеется в виду вместо получения исходного кода прямо из исходного файла)

В Java существует: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

В PHP:
get_class_methods ()
typeof
ReflectionFunction (спасибо Алин Пуркару)

Ответы [ 3 ]

70 голосов
/ 11 августа 2011

Расширяя предложение использовать функцию 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);
17 голосов
/ 11 августа 2011

Там нет ничего, что даст вам фактический код функции. Единственное, что близко к этому - класс ReflectionFunction . Для классов у вас есть ReflectionClass , который дает вам члены класса (константы, переменные и методы) и их видимость, но по-прежнему нет фактического кода.


Обходной путь (он включает чтение исходного файла):
Используйте ReflectionFunction :: export , чтобы узнать имя файла и интервал между строками, в которых объявлена ​​функция, а затем прочитайте содержимое этого файла в этих строках. Используйте обработку строк, чтобы получить то, что находится между первым { и последним }.

Примечание: API Reflection плохо документирован.

2 голосов
/ 14 мая 2018

Мы программируем через разные операционные системы, gnu / linux, windows, mac ... Из-за этого у нас в коде разные возвраты каретки, чтобы решить эту проблему, я раздвоил ответ Брэндона Хорсли и подготовился к проверке разных 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...