"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > PHP의 `__get` 및 `__set` 매직 메소드는 실제로 언제 호출됩니까?

PHP의 `__get` 및 `__set` 매직 메소드는 실제로 언제 호출됩니까?

2024년 11월 19일에 게시됨
검색:839

When are PHP's `__get` and `__set` magic methods actually invoked?

PHP 매직 메소드: 속성 오버로딩을 위한 __get 및 __set 공개

PHP에서 __get 및 __set 매직 메소드는 처리를 위한 대체 방법을 제공합니다. 전통적인 getter 및 setter를 넘어서는 속성 액세스 및 수정. 이러한 메서드를 사용하면 개발자는 요청된 속성이 명시적으로 정의되지 않은 경우 속성 액세스 동작을 가로채서 사용자 지정할 수 있습니다.

그러나 일반적인 오해는 __get 및 __set 메서드가 get 및 set 키워드를 오버로드하는 데 사용된다는 것입니다. 이는 완전히 정확하지는 않습니다.

속성 오버로딩 및 매직 메서드

__get 및 __set 메서드는 속성 오버로딩 형태로 사용될 수 있지만 일반적인 오버로드와는 다릅니다. 다른 언어로 된 메소드. PHP는 공개, 보호 및 비공개 속성 선언을 통해 속성 액세스를 명시적으로 처리합니다. 주어진 범위 내에서 속성이 선언되지 않으면 PHP는 오류를 생성합니다.

PHP가 명시적으로 선언되지 않은 속성에 액세스하려고 시도하면 마법의 메서드가 작동합니다. 이 경우 __get 및 __set 메서드는 속성 액세스를 동적으로 처리하는 방법을 제공합니다.

__get 및 __set 사용

__get 및 __set 메서드의 사용법을 설명하려면, 다음 예를 고려하십시오.

class foo {
    public $bar;  // Public property
    public function __get($name) {
        echo "Get:$name";
        return $this->$name;  // Custom behavior for accessing inaccessible properties
    }
    public function __set($name, $value) {
        echo "Set:$name to $value";
        $this->$name = $value;  // Custom behavior for setting inaccessible properties
    }
}

이 시나리오에서 __get 및 __set 메서드는 $bar 속성에 액세스하거나 수정할 때 사용자 지정 동작을 제공하도록 설계되었습니다. 예를 들어, echo $foo->bar; $foo->bar = 'test'; 동안 __get 메소드를 트리거합니다. __set 메소드가 필요합니다.

디버깅 및 일반적인 함정

그러나 원래 질문에 설명된 대로 속성이 이미 공개적으로 선언된 경우(이 예에서와 같이) , PHP 런타임은 해당 속성에 직접 액세스합니다. 따라서 __get 및 __set 메서드는 호출되지 않습니다.

이 동작은 PHP 설명서의 속성 오버로딩 섹션에서 확인됩니다. 여기서는 __set 및 __get 메서드가 액세스할 수 없는 속성에 데이터를 쓰거나 읽을 때만 호출된다는 점을 명시하고 있습니다. 공용 속성이 아닙니다.

일반적으로 매직 메서드는 적절한 getter 및 setter 함수나 직접 메서드 호출을 대체하는 것으로 간주되어서는 안 됩니다. 이는 주로 잘못된 속성 액세스를 처리하고 이러한 시나리오에서 대체 동작을 제공하는 목적으로 사용됩니다. 또한 매직 메서드는 직접적인 속성 액세스에 비해 성능 저하를 초래할 수 있다는 점에 유의하는 것이 중요합니다.

원래 질문에서 발생한 문제를 해결하기 위해 명시적인 getter 및 setter 메서드를 정의할 수 있습니다. 재산 접근 및 수정. 이 접근 방식은 더 효율적이며 속성 액세스 의미 체계를 더 효과적으로 제어할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3