Результат PHP create_function зберігається як змінна екземпляра і викликається як $ object-> func ()?

Я використовую PHP функцію create_function ($ args, $ code) , щоб динамічно завантажити визначення функції з бази даних.

Спосіб, яким я намагаюся його реалізувати, полягає в наступному:

I have a class MyClass which has an instance variable myFunction. The constructor populates that instance variable with the result of a call to create_function. I'm hoping to dynamically create a function for the specific object (once instantiated) of this class, that can be called as $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.

When I run var_dump($object->myFunction) I get back "lambda_xx", which is a good sign meaning create_function is at least working.


Цілеспрямоване оновлення на роботах і не працює випадках

Виявляється, у моєму "іншому файлі", де я роблю наступне:

   $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

This doesn't work, but if instead of pulling the object $pm from Yii::app()->user->postMatching I just create a new one:

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

$c();//THIS WORKS NOW!

So naturally I var_dumped $pm and $c in both the "newly created" case and the case where I get it from Yii::app()->user->postMatching, and they are identical. The only thing that is different is the name of the anonymous function (as expected).

Хто-небудь має ідею, чому це може бути справа? В обох випадках $ pm IS є екземпляром об'єкта PostMatching з цією змінною екземпляра, я просто не можу використовувати синтаксис, щоб викликати це!


Просто оновлено вищенаведене з нещодавно виявленими "Твістами", спасибі, хлопці!

2

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

}
2
додано
Бездоганно дійсно.
додано Автор deceze, джерело
@Levi Оскільки $ this-> myFunction - це просто рядок, що позначає назву звичайної глобальної функції, не повинно бути необхідним. : -?
додано Автор deceze, джерело
Спробуйте call_user_func_array (масив ($ this, myFunction), $ args)
додано Автор Levi Morrison, джерело
Значення $ this-> myFunction може бути регулярним та глобальним, але для його доступу ви все одно повинні використовувати синтаксис масиву, я вважаю.
додано Автор Levi Morrison, джерело
Я отримую помилку "call_user_func_array() очікує, що параметр 1 є дійсним зворотним дзвінком, функцією" "не знайдено або недійсне ім'я функції". при спробі вище. Якщо я var_dump ($ this-> myFunction), я отримую "lambda_xx", тому його не так, як його порожній .... спантеличен
додано Автор csjohn, джерело
@deceze Я просто оновив нижню частину питання вище - виявив якусь нову дивну поведінку. (І.Е., якщо я створюю новий об'єкт у тому самому блоці і називаю це чудово ... але інакше)
додано Автор csjohn, джерело

Ви можете викликати цей спосіб таким чином:

call_user_func($object->myFunction, args..);
2
додано

Це пов'язано з проблемами синтаксичного аналізу, які має PHP. Ця версія повинна працювати:

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

See it in action.

2
додано
@ csjohn: Це не можливо, якщо робочий приклад не інший, ніж ваш. У такому випадку, будь ласка, надішліть свій дійсний код.
додано Автор Jon, джерело
@ csjohn: Добре, це побачило і треба запитати: чому ви виставляєте властивість замість методу?!? Чому не функція findRelatedPosts ($ post, $ limit) {...} ?
додано Автор Jon, джерело
@ Csjohn: Але це зробить, відразу вирішить вашу проблему!
додано Автор Jon, джерело
Я спробував цей синтаксис, але сам виклик все одно не спрацьовує. Якщо я var_dump (метод $) у цьому випадку, я отримую "lambda_xx", але якщо я зателефонув методу $ (arg1, arg2) це помилки. Чи є метод $ у цьому випадку, що конкретно стосується методу $ object? .. чи мені потрібен щось на зразок $ object -> $ method (також спробував і не спромігся). Примітка. Я виконую цими дзвінками функцію anon в циклі, але самий метод $ індексується перед циклом.
додано Автор csjohn, джерело
Я додаю справжній код, що стосується цієї проблеми, у питанні вище. Дякую!
додано Автор csjohn, джерело
На цьому етапі я просто намагаюся це отримати роботу. Як тільки я пройду бар'єр, я напишу публічний метод, щоб обернути анонімний метод змінної динамічної екземпляри і викликати так.
додано Автор csjohn, джерело
Я так теж подумав, що я спробував його обернути. У цьому випадку дзвінок "входить" у функцію обгортки, але коли він потрапляє в лінію, щоб фактично викликати анонімну функцію, то помилки аналогічно. Я оновив своє вищезазначене питання (внизу), дещо нову інформацію та примхи про мою проблему.
додано Автор csjohn, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php