Я использую функцию 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
объект с этой переменной экземпляра, я просто не могу использовать синтаксис для его вызова!
Просто обновил вышеупомянутое с недавно обнаруженными "Твистами"Спасибо, ребята!