2011-10-28 2 views
1

이것은 이전 질문에 대한 후속 조치입니다. 그러나 질문을 추출하고 "works"대 "does not work"사례를 사용했습니다 훨씬 더 정확하게 좁혀졌다.PHP create_function 인스턴스 변수 - 익명 함수를 호출 할 수 없습니다 : 후속 조치

내 목표 : 나는 myFunction 변수 인스턴스가있는 클래스 MyClass 있습니다. MyClass 객체를 만들 때 (인스턴스 생성) 생성자는 인스턴스 변수 myFunctioncreate_function (여기서 코드와 arg는 db 호출에서 온 것입니다)에 대한 호출 결과를 할당합니다. 유형 MyClass의 객체가 생성 (다른 곳에서 다른 클래스의 인스턴스 변수로 저장) 내가 "어디서나"나는 MyClass 개체가 그에서 myFunction (인스턴스 변수 익명 함수)를 호출 할 수 있도록하려는되면

.


실험 케이스 - 아래하지 않는 것을 대 어떤 작품 설명하기 위해 내 매우 단순화 된 테스트 코드가 (즉, 경우에 예상되는 기능 나누기) 그러나

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

} 

, 내가 할 경우 아파치 오류 로그 내에서 ... 다음 (다른 파일에, 그것은 오류가 말하는 정의되지 않은 기능().

//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_funccall_user_func_array 호출의 몇 가지 변화가 작동하지 않습니다.

누구나 통찰력이나 도움이된다면 큰 도움이 될 것입니다. :).

미리 감사드립니다.

답변

0

나는 어쨌든 더 나은 선택되고 결국 해결 방법을 통해이 문제를 해결 끝났다.

결국에는 가능한 식별자 중 하나를 무작위로 반환하는 메서드가있는 정적 클래스를 얻은 다음 해당 식별자를 사용하여 각 클래스에 익명 함수를 작성하는 다른 메서드를 반환했습니다.

내가 원하는 것보다 약간 덜 우아하지만 제대로 작동합니다.

귀하의 노력에 감사드립니다.

1

예를 들어 자바 스크립트 에서처럼 PHP에서 함수를 참조 할 수 없습니다.

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

의견을 보내 주셔서 감사합니다. 나는 실제로 'call_user_func (array ($ object, $ funcName), array())'를 행운으로 시도했다. 'behaviors는 메소드 또는 클로저라는 이름이 없습니다. "라는 오류가 발생합니다. $ funcName이 비어 있다는 의미입니다. 하지만 위의 줄에 $ funcName을 표시하면 "lambda_3"이 표시됩니다. – csjohn

+0

'call_user_func'에서 얻을 수있는 PHP 오류와 비슷하지 않습니다. – Halcyon