PHP 5.4.0 이전 버전에서 익명 함수로 "$this" 사용
PHP 매뉴얼에 기재되어 있습니다.
사용할 수 없습니다.
$this
PHP 5.4.0 이전의 익명 함수에서
[ Anonymous functions ]페이지에 표시됩니다.하지만 나는 그것을 작동시킬 수 있다는 것을 알았다.$this
변수에 전달하고 변수에 전달한다.use
명령어를 입력합니다.
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
이게 좋은 방법인가요?
더 좋은 방법은 없을까?$this
PHP 5.3을 사용한 익명 함수 내부를 확인합니다.
보호된 메서드 또는 개인 메서드를 호출하려고 하면 실패합니다.이 방법을 사용하면 외부로부터의 호출로 간주되기 때문입니다.제가 알기로는 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(); // outputs "Hello world"
또한 실행 시 익명 함수(클로저 리바인딩)에 대해 $이 가리키는 것을 변경할 수 있습니다.
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(); // outputs "Bye world"
사실상 익명함수에는 bindTo() 메서드가 있습니다.첫 번째 파라미터는 이것이 가리키는 $를 지정하기 위해 사용할 수 있으며 두 번째 파라미터는 표시 수준을 제어합니다.두 번째 매개 변수를 생략하면 가시성이 "외부"에서 호출하는 것과 같습니다. 예를 들어 공용 속성만 액세스할 수 있습니다.또한 bindTo가 작동하는 방식을 기록해 두십시오. 원래 함수는 수정되지 않고 새 함수를 반환합니다.
항상 PHP에 의존하여 객체를 참조로 전달하지 마십시오. 참조 자체를 할당할 때 원래 포인터가 수정된 대부분의 OO 언어와는 동작이 다릅니다.
예:
$CI = $this;
$callback = function () use ($CI) {
$CI->public_method();
};
다음 항목이어야 합니다.
$CI = $this;
$callback = function () use (&$CI) {
$CI->public_method();
};
주의: 참조 "&"와 $CI는 최종 호출이 완료된 후에 할당해야 합니다.그렇지 않으면 PHP에서 참조에 액세스하는 것과 원래 클래스에 액세스하는 것이 항상 동일하지는 않습니다.
http://php.net/manual/en/language.references.pass.php
그것이 정상적인 방법이다.
B.T.W.를 제거하려고 합니다.&
물체가 어떤 식으로든 참조를 통과하기 때문에 이 없이도 작동해야 합니다.
그냥 지나가시는 게 맞는 방법인 것 같아요.PHP 5를 사용하는 경우에는&
앞에 있는 기호$this
그것은 항상 참조에 의해 통과되기 때문에.
이거 괜찮네요.이것도 할 수 있을 것 같아요.
$CI = $this;
... 객체와 관련된 할당은 전체 객체가 아니라 항상 참조를 복사하기 때문입니다.
언급URL : https://stackoverflow.com/questions/8391099/using-this-in-an-anonymous-function-in-php-pre-5-4-0
'programing' 카테고리의 다른 글
Maven Update Project는 이클립스에서 무엇을 합니까? (0) | 2022.11.23 |
---|---|
MySql: Tinyint (2)와 Tinyint (1)의 차이점은 무엇입니까? (0) | 2022.11.23 |
MYSQL에서 outfile "access denied"로 변환 - 그러나 내 사용자는 "ALL"로 액세스할 수 있습니다.그리고 폴더는 CHMOD 777 입니다. (0) | 2022.11.23 |
JavaScript가 비활성화되어 있는지 여부를 검출하는 방법 (0) | 2022.11.23 |
Laravel JSON Where Clauses with MariaDB 10.2.16 LongText 열을 사용할 수 있습니까? (0) | 2022.11.23 |