PHP вынік create_function захоўваецца ў зменнай асобніка, і называецца $ object-> FUNC ()?

Я выкарыстоўваю ПГПС create_function ($ Арг, $ код) функцыі дынамічна загружаць вызначэнне функцыі з базы дадзеных.

Так я спрабую рэалізаваць яго наступным чынам:

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.


<�Моцны> Цікавы Update на 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

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).

Хто-небудзь ёсць якія-небудзь ідэі, чаму гэта можа быць справа? У абодвух выпадках $ гадзін гэта праілюстраваць 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-> туРипсЫоп гэта проста радок, якая пазначае імя рэгулярнай глабальнай функцыі, што не павінны неабходна. : -?
дададзена аўтар deceze, крыніца
Паспрабуйце call_user_func_array (масіў ($ гэта, туРипсЫоп), $ Арг)
дададзена аўтар Levi Morrison, крыніца
Значэнне $ this-> MYFUNCTION можа быць рэгулярным і глабальным, але для доступу да яго па-ранейшаму неабходна выкарыстоўваць сінтаксіс масіва, я лічу.
дададзена аўтар Levi Morrison, крыніца
Я атрымліваю памылку «call_user_func_array() чакае параметр 1, каб быць сапраўдным зваротным выклікам, функцыя" "не знойдзена або недапушчальнае імя функцыі.» пры спробе вышэй. Калі я var_dump ($ this-> туРипсЫоп) Я атрымліваю "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: OK, убачыў яго і спытаць: <�я> чаму </я> вы агаляючы ўласцівасці замест метаду?!? Чаму не функцыя findRelatedPosts ($ пост, $ мяжа) {...} ?
дададзена аўтар Jon, крыніца
@csjohn: Але зрабіць гэта неадкладна вырашыць вашу праблему!
дададзена аўтар Jon, крыніца
Я паспрабаваў гэты сінтаксіс, але сам выклік яшчэ не звольніць. Калі я var_dump ($) метаду ў гэтым выпадку, я атрымліваю «lambda_xx», але калі я называю $ метаду (arg1, arg2), то памылку. Ці з'яўляецца $ метад у дадзеным выпадку на ўвазе канкрэтна да метаду $ аб'екта .. ці мне трэба нешта накшталт $ аб'екта -?> $ Метад (таксама спрабаваў і не атрымалася). Заўвага: Раблю гэтыя выклікі функцыі Анон у цыкле, але сам метад $ канкрэтызуецца да цыклу.
дададзена аўтар csjohn, крыніца
Я дадаў рэальны код, які адносіцца да дадзенага пытання ў вышэй згаданым пытанні. Дзякуй!
дададзена аўтар csjohn, крыніца
У гэты момант ім проста спрабуе прымусіць яго працаваць. Пасля таго, як я атрымліваю прайшоў бар'ер Напішу адкрыты метад, каб абгарнуць дынамічны пераменны асобнік ананімнага метад і выклікаць падобныя.
дададзена аўтар csjohn, крыніца
Я таксама так думаў, я спрабаваў атачыўшы яго. У гэтым выпадку выклік сапраўды атрымлівае "в" функцыі-абалонкі, але калі справа даходзіць да лініі на самай справе выклікаць ананімную функцыю, гэта памылкі ў той жа манеры. Я абнавіў свой пытанне вышэй (Да ніжняй часткі) з некаторай новай інфармацыяй і дзівацтвамі па маёй праблеме.
дададзена аўтар csjohn, крыніца