>  기사  >  백엔드 개발  >  PHP의 매직 메소드인 __get(), __set(), __call(), __callStatic() 및 정적 사용법에 대한 자세한 설명

PHP의 매직 메소드인 __get(), __set(), __call(), __callStatic() 및 정적 사용법에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-03 11:43:443191검색

php5 이후에 저는 꽤 흥미로운 몇 가지 마법의 방법을 구현했습니다. 이전에는 프로세스 지향 프로그래밍 방법을 사용해 왔고 최근에는 oop에 대한 연구를 거의 하지 않았는데 꽤 흥미로웠습니다.

마법의 방법들 중 많은 것들이 단지 게으름을 위한 것 같아요. 제가 처음 PHP를 썼을 때, 블로그를 할 때 lifetype이라는 외국 오픈 소스 프레임워크를 사용했던 기억이 납니다. , 그러나 모든 개체는 프레임워크에서 구현되고 모든 데이터는 개체로 캡슐화됩니다.

그래서 DB에서 여러 가지를 선택한 후 루프에서 하나씩 객체로 캡슐화해야 하며 각 필드도 getField() 및 getField() 메서드를 구현해야 합니다. 작성하기가 정말 약간 번거롭습니다. , 반복적인 작업처럼 느껴집니다.

그런 다음 get(), set(), call(), callStatic()이라는 마법 메서드가 탄생하면서 이 문제가 완전히 해결되었습니다.

get() 및 set()은 클래스의 속성용이고, call()은 메서드용이며, callStatic()은 정적 클래스 메서드용입니다.

1. Get() 및 set() 매직 메서드:

객체를 인스턴스화한 후 클래스에 존재하지 않거나 액세스 권한이 없는 속성을 호출하면 PHP는 다음과 같이 get() 메서드를 호출합니다. 이런 방식으로 많은 코드를 절약하고 구조를 더 명확하게 만들 수 있을 뿐만 아니라 외부에서 클래스의 전용 멤버에 액세스할 수 있는 방법도 제공합니다.

예:

<?php
class testGet
{
  private $name = &#39;test&#39;;
}
$test = new testGet();
$test->name;

위 코드를 실행하면 오류가 보고됩니다. PHP 치명적인 오류: /Library/WebServer/Documents/workspace/learn/call의 개인 속성 testGet::$name에 액세스할 수 없습니다. / a.php 7행

하지만 get() 메소드를 통해 접근할 수 있도록 수정해보겠습니다

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
}
$test = new testGet();
echo $test->name . PHP_EOL;

이렇게 코드를 변경한 후 다시 접근하면 문제가 없을 것입니다.

참고: 속성이 정적으로 정의된 경우 get()을 통해 액세스할 때 오류도 보고됩니다. 그 이유는 정적 멤버가 클래스 자체에 속하고 인스턴스화로 인해 변경되지 않으므로 직접 테스트할 수 있기 때문입니다.

set() 메서드를 사용하면 클래스 속성의 동적 생성을 금지할 수 있어 후속 개발자나 프로그램 유지관리자가 불필요한 문제를 피할 수 있습니다.

funciton set($property) {

//$property는 속성의 이름을 받습니다

}

솔직히 oop의 디자인에는 많은 디자이너들이 직접 참여하게 됩니다. 문서가 없으면 후발자가 코드를 읽는 것은 여전히 ​​매우 어려울 것입니다. 물론 후발자의 수준과 관련이 많습니다.

다음은 get과 set을 함께 사용하는 예입니다.

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
  
  public function set($property, $value) {
    if ( isset($this->$property) )
      $this->$property = $value;
    else
      return NULL;
  }
}
$test = new testGet();
$test->name = &#39;my test name&#39;;
echo $test->name . PHP_EOL;

function set($property, $value) {

//$property

에서 받은 속성의 이름//The $value가 받은 속성 이름

}

의 값입니다. 2. call() 및 callStatic() 메서드:

객체가 존재하지 않는 클래스의 메서드를 호출하는 경우 또는 액세스 권한이 없으면 call() 메소드가 자동으로 호출됩니다.

전에 동료가 나에게 왜 TP 프레임워크에는 사용할 수 없지만 상위 계층에서는 호출할 수 있는 하위 수준 메서드가 많이 있는지 물었던 것이 기억납니다. 실제로 작동하는 것은 call() 메서드입니다.

이 방법을 모르면 확실히 혼란스럽고 문제를 찾기 어려울 것입니다.

<?php
abstract class Obj 
{
        private $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public function call($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return $this->objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return $this->objData[strtolower($matches[1])] = $args[0];
            }   
        }   
}
class User extends Obj
{
        
}
$user = new User();
$user->setName(&#39;test&#39;);
echo $user->getName();

User 클래스는 아무 작업도 수행하지 않지만 상속된 클래스의 call() 메서드를 통해 모든 작업(getName 및 setName)을 수행합니다.

함수 호출($methodName, $args) {

//$methodName

에서 호출한 메서드 이름//$argsarray

}

에서 전달한 매개변수 call()은 정적 클래스의 정적 메서드를 제공하는 callStatic() 메서드에 해당합니다.

예:

<?php
    abstract class Obj 
    {
        private static $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public static function callStatic($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return self::$objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return self::$objData[strtolower($matches[1])] = $args[0];
            }   
        }   
    }
    class User extends Obj 
    {
    
    }
    User::setName(&#39;test&#39;);
    echo User::getName() . PHP_EOL;

3. 지연된 정적 바인딩: 정적 개체

위 내용은 PHP의 매직 메소드인 __get(), __set(), __call(), __callStatic() 및 정적 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.