2014-09-05 5 views
0

익명 함수를 매개 변수로 사용하는 몇 가지 메서드가있는 클래스가 있습니다. 내가 좋아하는 것 콜백 익명 함수의 클래스 인스턴스에 액세스

class MyClass { 
    public function myMethod($param, $func) { 
      echo $param; 
      user_call_func($func); 
    } 


    public function sayHello() { 
     echo "Hello from MyClass"; 
    } 
} 

이 같은 일을 할 수 있도록 : 클래스는 다음과 같습니다

$obj = new MyClass; 
$obj->myMethod("Hi", function($obj) { 
    echo "I'm in this anonymous function"; 
    // let's use a method from myClass 
    $obj->sayHello(); 
}); 

그래서, 내 익명 함수에서, 내가 매개 변수로 $ OBJ를 통과 이후에 익명 함수 내에서 해당 메서드에 액세스 할 수 있어야합니다. 이 경우에는 우리가 볼 수 있습니다

I'm in this anonymous function 
Hello from MyClass 

어떻게해야합니까?

감사

답변

4

사용 use 구조 : 당신은 당신이 PHP를 사용하지 않는 경우, 전달 될 use$this을 허용하지 않기 때문에 다른 변수에 $this를 캡처 할 수있어

$self = $this; 
$obj->myMethod("Hi", function($obj) use($self) { 
    echo "I'm in this anonymous function"; 
    // let's use a method from myClass 
    $obj->sayHello(); 
}); 

> = 5.4. documentation의 관련 인용문 :

클로저는 부모 범위에서 변수를 상속 할 수도 있습니다. 이러한 변수는 use 언어 구조로 전달되어야합니다. 상위 범위의 변수를 상속하는 것은 전역 변수 변수를 사용하는 것과 동일하지 않습니다. 전역 변수는 전역 범위에 있으며 어떤 함수가 실행 중인지 상관없이 입니다. 클로저의 부모 범위는 클로저가 선언 된 함수입니다 ( 필연적으로이 함수가 호출 된 함수가 아님).

업데이트

또한이 간단한 스크립트에서 입증 된 바와 같이 당신이, 당신은 익명 함수가 실행되면 현재하고있는 클래스의 가시성을 유지할 것을 알고하는 것이 도움이 될 수 있습니다

:

class Test 
{ 
    public function testMe() 
    { 
     $self = $this; 
     $tester = function() use($self) { 
      $self->iAmPrivate(); 
     }; 

     $tester(); 
    } 

    private function iAmPrivate() 
    { 
     echo 'I can see my own private parts!'; 
    } 
} 

$test = new Test; 
$test->testMe(); 

출력 :

난 내 자신의 개인 부분을 볼 수 있습니다!

+0

답장을 보내 주셔서 감사합니다. 수업을 공개적으로 사용할 수있게 만들고 가능한 한 수업 외부에서해야 할 일을 줄이기 위해 노력하고 싶다면 어떻게해야할까요? 수업에서 '사용'사례를 처리 할 수 ​​있습니까? – mast

+0

당신의 코멘트를 정말로 이해할 수 있을지 모르겠다. 클래스 내부에이 기능을 넣었는지 묻는다면'$ self' 객체에 private/protected 메소드를 호출 할 수 있을까? –

관련 문제