Результат PHP create_function сохраняется как переменная экземпляра и называется $object->func()?

Я использую PHP create_function($args, $code) функция для динамической загрузки определения функции из базы данных.

Я пытаюсь реализовать это следующим образом:

У меня есть класс MyClass который имеет переменную экземпляра myFunction, Конструктор заполняет эту переменную экземпляра результатом вызова create_function, Я надеюсь динамически создать функцию для конкретного объекта (после создания экземпляра) этого класса, который можно вызвать как $object->myFunction(arg1, arg2);

Итак, мой класс выглядит так:

class MyClass {

     public $myFunction = '';

     public function __construct() {
         $this->myFunction = //return function body from DB call.
     }


}

Затем я пытаюсь вызвать эту динамическую функцию из другого места в моей программе для экземпляра объекта "MyClass", делая что-то вроде...

$object = new MyClass();
$object->myFunction(args..); 

Однако я продолжаю получать ошибки, такие как:

MyClass and its behaviors do not have a method or closure named myFunction.

Когда я бегу var_dump($object->myFunction) Я получаю обратно "lambda_xx", что является хорошим знаком, означающим create_function по крайней мере, работает.


Интересное обновление дел "Работает против"

Оказывается, в моем "другом файле", где я делаю следующее:

   $pm = Yii::app()->user->postMatching; //This is a PostMatching object made elsewhere
    $c = $pm->findRelated;

    foreach ($posts as $post) {

        var_dump($c);

        $postIds = $c($post, $limit);

        //post to related mapping
        $specificRelatedPostIds[$post->postId] = $postIds;

    }
    exit; // exiting for testing

Это не работает, но если вместо того, чтобы тянуть объект $pm от Yii::app()->user->postMatching Я просто создаю новый:

$pm = new PostMatching();
$c = $pm->findRelated; //the anon function instance variable

$c(); // THIS WORKS NOW!

Поэтому, естественно, я var_dumped $pm а также $c как в "недавно созданном" случае, так и в случае, когда я получаю его от Yii::app()->user->postMatchingи они идентичны. Единственное, что отличается - это имя анонимной функции (как и ожидалось).

У кого-нибудь есть идеи, почему это может иметь место? В обоих случаях $pm Является экземпляром PostMatching объект с этой переменной экземпляра, я просто не могу использовать синтаксис, чтобы вызвать его!


Только что обновил вышесказанное с недавно обнаруженными "Твистами", спасибо, ребята!

3 ответа

Решение

Может быть что-то в этом роде может быть полезным:

class MyClass {

     private $myFunction = '';

     public function __construct() {
         $this->myFunction = //return function body from DB call.
     }

     public function myFunction() {
         $args = func_get_args();
         return call_user_func_array($this->myFunction, $args);
     }

}

Вы можете вызвать метод следующим образом:

call_user_func($object->myFunction, args..);

Это связано с проблемами разбора, которые есть у PHP. Эта версия должна работать:

$object = new MyClass();
$method = $object->myFunction;
$method(args..); 

Смотрите это в действии.

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