PHP create_function результат хранится как переменная экземпляра и называется $ object-> func ()? - PullRequest
2 голосов
/ 28 октября 2011

Я использую функцию PHPs 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 по крайней мере работает.


Интересное обновление в Works противНе работает случаи

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

   $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 ]

2 голосов
/ 28 октября 2011

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

call_user_func($object->myFunction, args..);
2 голосов
/ 28 октября 2011

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

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);
     }

}
2 голосов
/ 28 октября 2011

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

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

См. В действии .

...