>  기사  >  백엔드 개발  >  php_php 기술의 일반적인 매직 메소드 요약

php_php 기술의 일반적인 매직 메소드 요약

WBOY
WBOY원래의
2016-05-16 19:58:31989검색

이 글은 PHP에서 흔히 사용되는 매직 메소드를 자세하게 정리, 요약하고 참고할 수 있도록 공유합니다

1. PHP는 "__"로 시작하는 모든 메소드를 매직 메소드로 처리하므로 사용자 정의 메소드는 "__"로 시작할 수 없습니다.
PHP에서 제공하는 오버로딩은 속성이나 메소드를 동적으로 생성하는 것을 의미합니다. 오버로딩은 마법의 방법을 통해 달성됩니다. 이러한 매직 메서드의 매개 변수는 전달할 수 없습니다. __get(), __set(), __isset(), __unset()은 클래스 속성 오버로드를 구현합니다.
2. 클래스에서 액세스할 수 없는 속성에 액세스할 때 __get() 메서드가 호출됩니다.
3. 클래스에서 액세스할 수 없는 속성에 액세스할 때 상황에 따라 __get(), __set(), __isset(), __unset()이 호출됩니다. 속성에 액세스할 때는 isset() 또는 empty() 함수를 사용합니다. unset() 함수를 사용하면 __isset() 메서드가 호출됩니다.
4. 이 네 가지 메소드는 static 키워드를 사용하여 정의할 수 없습니다. php5.3.0 이후에는 이 네 가지 메소드를 정의하기 위해 정적 메소드를 사용하는 경우 경고 수준 경고가 발생합니다.
5. 액세스할 수 없는 속성이란 무엇입니까? (1) 클래스에 없는 속성, (2) 클래스 외부에서 프라이빗 변수에 액세스합니다. 메서드 오버로드는 __call()과 __callstatic()을 통해 구현됩니다. 둘 사이의 차이점은 컨텍스트가 정적 메서드인지 여부입니다. 후자는 액세스할 수 없는 정적 메서드가 호출될 때 호출됩니다. __callstatic()이 php5.3.0에 추가되었습니다.
6. __sleep() 및 __wakeup()
serialize()가 직렬화되면 먼저 __sleep() 함수가 있는지 확인합니다. 함수가 있으면 먼저 __sleep()을 호출하고 모든 변수 이름이 포함된 배열을 반환합니다. 직렬화되고 알림 수준 오류가 발생합니다.
__wakeup() 메서드는 __sleep()과 반대이며 unserialize()가 호출될 때 호출됩니다
7. __toString(), 이를 문자열로 변환하는 방법을 클래스에서 결정하도록 합니다. php5.2.0 이전에는 이 메서드가 echo 또는 print 메서드와 결합되어야만 효과적이었습니다. php5.2.0 이후에는 printf(와 결합할 수 있습니다. ) 수정이 가능하지만 수정 시 %d 등의 비문자 수식자는 사용할 수 없습니다.
8. __invoke(), 함수를 호출하여 객체를 호출하려고 하면 이 함수가 트리거됩니다. php5.3 이후에만 적용됩니다.
9. __set_state() 정적 메서드. 이 정적 메서드는 var_export()가 호출될 때만 호출됩니다. php5.1.0 이후에 적용됩니다. 유일한 매개변수는 배열을 받는 것입니다.
10. __construct() 및 __destruct(), 생성자와 소멸자 생성자는 주로 클래스 초기화에 사용됩니다. 객체에 대한 모든 참조가 삭제된 후 또는 객체가 명시적으로 소멸될 때 소멸자는 실행됩니다. 소멸자에서는 예외가 발생하는 것이 허용되지 않습니다. 그렇지 않으면 모든 http 헤더가 전송되면 스크립트 끝에서 소멸자가 호출됩니다. 11. __clone(), 객체 복사, 이 메서드는 직접 호출할 수 없으며, clone 키워드를 통해 명시적으로 호출해야 합니다

코드:

//实例化对象时,会调用对象的__construct方法
$obj = new Object();
//给对象不存在的属性赋值时,会调用对象的__set方法
$obj->title = "hello";
//使用对象不存在的属性时,会调用对象的__get方法
echo $obj->title;
//调用对象不存在的方法时,会调用对象的__call方法
$obj->test("hello",123,567);
//调用不存在的类静态方法时,会调用类的__callStatic方法
Object::staticMethod("static","not found method");
//直接输出对象时,会调用对象的__toString方法
echo $obj;
//将一个对象当作函数一样使用时,会调用对象的__invoke方法
echo $obj("test");
//克隆对象时,会调用对象的__clone方法
$obj2 = clone $obj;
//判断对象属性是否存在时,会调用对象的__isset方法
var_dump(isset($obj->aaa));
//销毁对象属性时,会调用对象的__unset方法
unset($obj->aaa);
 
 
class Object{
 
  protected $array = array();
 
  function __construct()
  {
    echo __METHOD__."你正在实例化对象<br>";
  }
 
  function __set($name, $value)
  {
    $this->array[$name]=$value;
  }
 
  function __get($name)
  {
    return $this->array[$name];
  }
 
  function __call($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic function\n";
  }
 
  static function __callStatic($name, $arguments)
  {
    var_dump($name,$arguments);
    return "magic static function";
  }
 
  function __toString()
  {
    return __CLASS__.'<br>';
  }
 
  function __invoke($arguments)
  {
    var_dump($arguments);
    return __METHOD__.'<br>';
  }
 
  function __clone()
  {
    echo __METHOD__."你正在克隆对象<br>";
  }
 
  function __isset($name)
  {
    echo __METHOD__."你想判断有没有属性".$name."<br>";
    return 1;
  }
 
  function __unset($name)
  {
    echo __METHOD__."你想删除属性".$name."<br>";
  }
 
 
  function __destruct()
  {
    echo __METHOD__."你正在注销对象<br>";
  }
 
 
 
}

위 내용은 PHP의 일반적인 마법 방법에 대한 내용입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.

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