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'),

Другие вопросы по тегам