PHP - метод переопределения runkit
Все мои сайты имеют общий стартер, который имеет дело с URL-адресами, расположением файлов и т. д. Есть три случая, которые необходимо обработать - это каталог, файл существует, а файл не существует. Каждое приложение имеет уникальный код для каждого случая. Я решил немного повозиться с рункитом и пытаюсь унифицировать код. Каждый случай будет обрабатываться функцией, которую можно переопределить с помощью runkit.
Рассмотрим этот код:
class start {
function __construct() {
$this->options = array();
}
public function process() {
// some code here
$this->file_not_exists();
}
public function file_not_exists() {
$this->options['page'] = 222;
}
public function redefine($what, $code) {
runkit_method_redefine(get_class($this), $what, '', $code, RUNKIT_ACC_PUBLIC);
}
}
$start = new start();
$start->redefine('file_not_exists', '$this->options["page"] = 333;')
// page is now 333
Эта часть работает как задумано. Но когда я пытаюсь изменить код так, чтобы переопределенный метод вызывал пользовательскую функцию, он работал. Но, ради бога, я не могу понять, как передать $ this функции.
Переопределить метод выглядит так:
public function redefine($what, $code) {
runkit_method_redefine(get_class($this), $what, '', 'call_user_func('.$code.'(), '.$this.');', RUNKIT_ACC_PUBLIC)
}
Это не работает, независимо от того, что я пытаюсь (call_user_func_array также). Я просто не могу понять это. Для записи:
public function redefine($what, $code) {
my_user_function($this);
}
Работает.
Любая помощь приветствуется.
Обратите внимание, что это всего лишь эксперимент, и я хотел бы знать, как это сделать:)
Изменить: я получаю:
Catchable fatal error: Object of class starter could not be converted to string in blablallala\rewrite_starter2.php on line 153
2 ответа
{... удалено по необходимости...}
==== РЕДАКТИРОВАТЬ =====
[Для новой проблемы, что вам нужно, это]
<?
class start {
function __construct() {
$this->options = array();
}
public function process() {
// some code here
$this->file_not_exists();
}
public function file_not_exists() {
$this->options['page'] = 222;
}
public function redefine($what, $code) {
runkit_method_redefine(get_class($this),
$what,
'',
'call_user_func(array($this,' .$code. '),$this);',
RUNKIT_ACC_PUBLIC);
}
public function my_func($someobj)
{
print_r($someobj);
}
}
$start = new start();
$start->redefine('file_not_exists', 'my_func');
$start->process();
?>
Документация на call_user_func
Функция говорит, что первый аргумент - " вызываемый ". Таким образом, чтобы вызвать метод класса динамически, вы должны передать array($obj, 'func_name')
,