보호 된 메서드 나 개인 메서드를 호출하려고하면 실패합니다. 그렇게 사용하는 것은 외부에서 호출하는 것으로 간주되기 때문입니다. 내가 아는 한 5.3에서는이 문제를 해결할 수있는 방법이 없지만 PHP 5.4가 나오면 예상대로 작동합니다.
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$helloPrinter();
더 나아가 익명 함수 (클로저 리 바인딩)에 대해 런타임시 $ this가 가리키는 것을 변경할 수 있습니다.
class Hello {
private $message = "Hello world\n";
public function createClosure() {
return function() {
echo $this->message;
};
}
}
class Bye {
private $message = "Bye world\n";
}
$hello = new Hello();
$helloPrinter = $hello->createClosure();
$bye = new Bye();
$byePrinter = $helloPrinter->bindTo($bye, $bye);
$byePrinter();
사실상 익명 함수는 bindTo () 메서드를 갖게 되는데, 첫 번째 매개 변수는 $ this가 가리키는 것을 지정하는 데 사용할 수 있고 두 번째 매개 변수는 가시성 수준이 무엇이어야하는지 제어 합니다 . 두 번째 매개 변수를 생략하면 가시성은 "외부"에서 호출하는 것과 같습니다. 공용 속성에만 액세스 할 수 있습니다. 또한 bindTo가 작동하는 방식을 기록하십시오. 원래 함수를 수정하지 않고 새 함수를 반환합니다 .