PHP create_function Instance variable - Невозможно вызвать анонимную функцию: продолжение - PullRequest
1 голос
/ 29 октября 2011

Это в некоторой степени продолжение предыдущего вопроса, но я разобрал вопрос, и теперь случаи «работает» и «не работает» сужаются гораздо точнее.

Моя цель: У меня есть класс MyClass, который имеет переменную экземпляра myFunction. После создания объекта MyClass (создание экземпляра) конструктор присваивает переменной экземпляра myFunction с результатом вызова create_function (где код и аргументы получены из вызова db).

Как только этот объект типа MyClass создан (и сохранен как переменная экземпляра другого класса в другом месте), я хочу иметь возможность вызывать myFunction (анонимная функция переменной экземпляра) из «где угодно», где у меня есть MyClass объект.


Экспериментальные случаи - ниже приведен мой очень упрощенный тестовый код, чтобы проиллюстрировать, что работает, а что нет (то есть, когда ожидаемая функциональность нарушается)

class MyClass extends AnotherClass {

     public $myFunction;

     function __construct() {

         $functionCode = 'echo "NyanNyanNyan";';

         $this->myFunction();

         /*Now the following code works as expected if put in here for testing*/
         $anonFunc = $this->myFunction;
         $anonFunc();   //This call works just fine (echos to page)!   

         /*And if i make this call, it works too! */
         self::TestCallAnon();       

     }

     public function TestCallAnon() {

          $anonFunc2 = $this->myFunction;
          $anonFunc2();
     }

}

Однако, если я сделаю следующее (в другом файле, произойдет ошибка, говоря undefined function () в ... в журнале ошибок Apache.

//I'm using Yii framework, and this is getting the user 
//objects instance variable 'myClass'. 

$object = Yii::app()->user->myClass; 

$object->TestCallAnon(); // **FAILS**

или

$func = $object->myFunction;
$func(); // ** ALSO FAILS **

Кроме того, несколько вариантов вызовов на call_user_func и call_user_func_array не работают.

Если кто-нибудь сможет предложить какую-то идею или помощь, это было бы здорово :).

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Вы не можете передавать ссылки на функции в PHP, как, например, в JavaScript.

call_user_func имеет ограниченную функциональность.Вы можете использовать его так:

class MyClass {
    function func() {}
    static function func() {}
}
function myfunc() {}

$i = new MyClass();

call_user_func("myfunc", $args);
call_user_func(array($i, "func"), $args);
call_user_func(array(MyClass, "staticFunc"), $args);
0 голосов
/ 31 октября 2011

Я решил эту проблему с помощью обходного пути, который в любом случае оказался лучшим выбором.

В итоге я получил статический класс, в котором был метод для случайного возврата одного из возможных идентификаторов, а затем другой метод, который принял этот идентификатор для построения анонимной функции в каждом классе.

Чуть менее элегантно, чем хотелось бы, но в итоге все работает хорошо.

Спасибо всем за ваши усилия.

...