Результат 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..);