PHP - метод переопределения runkit - PullRequest
0 голосов
/ 31 января 2011

все мои сайты имеют общий стартер, который имеет дело с URL-адресами, расположением файлов и т. Д. Необходимо обработать 3 случая: каталог, файл существует, а файл не существует. Каждое приложение имеет уникальный код для каждого случая. Я решил немного повозиться с рункитом и пытаюсь унифицировать код. Каждый случай будет обрабатываться функцией, которую можно переопределить с помощью 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);
}

Работает.

Любая помощь приветствуется.

Обратите внимание, что это всего лишь эксперимент, и я хотел бы знать, как это сделать:)

Edit: Я получаю:

Catchable fatal error: Object of class starter could not be converted to string in blablallala\rewrite_starter2.php on line 153

Ответы [ 2 ]

0 голосов
/ 10 сентября 2012

В документации по функции call_user_func говорится, что первый аргумент - callable '. Таким образом, чтобы вызвать метод класса динамически, вы должны передать array($obj, 'func_name').

0 голосов
/ 31 января 2011

{... удалено по необходимости ...}

==== РЕДАКТИРОВАТЬ =====

[Для новой задачи вам нужно вот что]

<?
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();

?>
...