2011-04-05 6 views
4

PHP5.3에서 객체 컨텍스트 내에서 클로저를 실행하는 방법이 있습니까?

class Test { 
    public $name='John'; 

    function greet(){ 
     eval('echo "Hello, ".$this->name;'); 

     call_user_func(function(){ 
      echo "Goodbye, ".$this->name; 
     }); 
    } 
} 
$c = new Test; 
$c->greet(); 

eval()은 정상적으로 작동하지만 call_user_func는 $ this에 액세스 할 수 없습니다. (객체 컨텍스트가 아닌 경우 $ this 사용). 지금 당장 "$ this"를 인수로 전달 하겠지만, 필요한 것은 아닙니다.

+0

불행히도 call_user_func (배열 ($이 함수() {...})); 작동하지 않을 것이다. 이것은 이상적인 구문 일 것이다. – romaninsh

답변

6

$this에 대한 액세스는 PHP 5.3.6부터 람다 또는 클로저에서 가능하지 않습니다. $this을 임시 변수에 할당하고 use (공개 API 만 사용할 수 있음)을 사용하거나 원하는 속성을 전달/사용해야합니다. 이 사이트의 다른 곳에서 모두 표시되므로 다시 말씀하지 않겠습니다.

$this에 액세스 PHP.next 위해 비록 트렁크 가능 : http://codepad.viper-7.com/PpBXa2

+0

신난다, 고마워! – romaninsh

+0

어떻게 신속하게 질문에 대답 할 수 있었습니까? 라이브 질문 피드가 있습니까? – romaninsh

+0

@roman 나는이 질문에 꽤 늦게 대답했다. 그렇지 않습니까? 라이브 피드가 있는지 모릅니다. 나는 F5를 자주 누른다 :) – Gordon

0

것에 대해 :

$obj = $this; 
call_user_func(function() use ($obj) { 
    echo "Goodbye, " . $obj->name; 
}); 

그것은으로 개체를 전달할 아마 더 우아 : 실제 폐쇄를 들어

class Test { 
    public $name='John'; 

    function greet(){ 
     eval('echo "Hello, ".$this->name;'); 

     call_user_func(function($obj){ 
      echo "Goodbye, ".$obj->name; 
     }, $this); 
    } 
} 
$c = new Test; 
$c->greet(); 
+0

나는 그것이 OP가 그가하고 있다고 말했다. – Jon

+0

그게 내가 지금 사용하고있는 것이지만 컨텍스트를 정확히 설정하지는 않습니다. – romaninsh

+0

죄송합니다. 게시물을 더 잘 읽었어야합니다 ... –

0
call_user_func(function($name){ 
      echo "Goodbye, ".$name; 
     }, $this->Name); 
4

,이 할 수있는 유일한 방법에 관한 것입니다 매개 변수는 다른 답변에서 제안 된대로 (그리고 아마 당신이 이미하고있는 것처럼).

+0

이 문제를 제안하려고했습니다. 일반적으로'$ that = $ this; '를 수행합니다. 적어도 JavaScript에서. – igorw

관련 문제