Если это функция, к которой у вас есть доступ к файлу (то есть она не является частью стандартной библиотеки PHP и у вас есть права на чтение из файла), вы можете сделать что-то вроде этого:
Предположим, что мыесть такая функция, расположенная в каком-то файле.Файл должен быть включен (т. Е. Функция должна быть во внутренней таблице символов PHP):
function my_original_function($param1, $param2)
{
echo "$param1 $param2 \n";
}
Используйте класс ReflectionFunction, чтобы получить подробную информацию об этой функции и о том, где она определена: http://us2.php.net/manual/en/class.reflectionfunction.php.
$ expression = new ReflectionFunction ('my_original_function');
Далее вы можете использовать экземпляр отражения, чтобы получить путь к этому файлу, номер первой / последней строки функции ипараметры функции:
$file_path = $reflection->getFileName();
$start_line = $reflection->getStartLine();
$end_line = $reflection->getEndLine();
$params = $reflection->getParameters();
Используя их, вы можете:
- прочитать функцию из файла в строку
- переписать первую строкучтобы изменить имя функции, используя известное имя функции в качестве ссылки
- переписать первую строку, чтобы изменить значения параметров по умолчанию, используя $ params в качестве ссылки
- записать строку измененной функции в файл
- включает файл
- Вуаля!Теперь у вас есть новая доступная функция.
В зависимости от того, что вы на самом деле пытаетесь достичь, вы также можете просто использовать ReflectionFunction :: getClosure (), чтобы получитьзакрывающая копия функции, назначьте ее любой переменной и определите параметры там.См .: http://us.php.net/manual/en/functions.anonymous.php. Или вы можете создать несколько экземпляров ReflectionFunctions и вызвать ReflectionFunction :: invoke () / invokeArgs () с нужным набором параметров.См .: http://us2.php.net/manual/en/reflectionfunction.invokeargs.php или http://us2.php.net/manual/en/reflectionfunction.invoke.php