>  기사  >  백엔드 개발  >  PHP의 매직 메소드 정의 및 사용

PHP의 매직 메소드 정의 및 사용

墨辰丷
墨辰丷원래의
2018-06-11 09:40:391643검색

이 글에서는 주로 PHP의 매직 메소드 정의와 사용법을 소개합니다. 매직 메소드는 특정 상황에서 실행되며 모두 이중 밑줄로 시작됩니다. 참고하시면 됩니다

Magic 메소드는 PHP 객체지향의 독특한 기능입니다. 특정 상황에서 트리거되며 모두 이중 밑줄로 시작합니다. 패턴 메소드를 사용하면 PHP 객체 지향에서 오버로딩을 쉽게 구현할 수 있습니다(오버로딩은 클래스 속성과 메소드를 동적으로 생성하는 것을 의미합니다). 많은 매직 메소드가 쌍으로 나타납니다. 다음은 PHP의 현재 패턴 메소드를 모두 나열합니다.

1.__construct, __destruct

__constuct는 객체를 생성할 때 호출됩니다.
__destruct는 객체가 명시적으로 삭제되거나 스크립트가 종료될 때 호출됩니다.

2.__get, __set

__set 또는 존재하지 않습니다. 속성을 할당할 때 호출됩니다.
__get은 액세스할 수 없거나 존재하지 않는 속성을 읽을 때 호출됩니다.

3.__isset, __unset

__isset은 isset() 또는 empty()가 호출될 때 호출됩니다. 액세스할 수 없거나 존재하지 않는 속성
__unset은 액세스할 수 없거나 존재하지 않는 속성을 설정 해제할 때 호출됩니다

4.__call, __callStatic

__call은 액세스할 수 없거나 존재하지 않는 정적 메서드가 호출될 때 호출됩니다.
__callStatic은 액세스할 수 없거나 존재하지 않는 정적 메서드가 호출됩니다. Call

5.__sleep, __wakeup

__sleep은 직렬화가 사용될 때 호출되며, 대형 객체의 모든 데이터를 저장할 필요가 없을 때 유용합니다.
__wakeup은 직렬화 해제 시 호출됩니다. 사용되며 일부 객체 초기화 작업을 수행하는 데 사용할 수 있습니다.

6.__clone

객체의 복제 동작을 조정하기 위해 객체가 복제될 때 호출됩니다.

7.__toString

클래스가 복제될 때 호출됩니다. 문자열로 변환

8.__invoke

객체가 기능적으로 호출될 때 호출됩니다.

9.__set_state

이 정적 메서드는 클래스를 내보내기 위해 var_export()가 호출될 때 호출됩니다. __set_state의 반환 값을 var_export의 반환 값으로 사용합니다.

10.__debuginfo

는 객체를 인쇄하기 위해 var_dump()를 호출할 때 호출됩니다. (모든 속성을 인쇄하고 싶지 않을 때) PHP5.6 버전에 적용 가능

PHP 매직 메소드 사용 예는 다음과 같습니다.

<?php
 
class Magic
{
  public $var = &#39;test&#39;;
 
  //构造函数,在创建对象的时候调用
  public function __construct()
  {
    echo &#39;__construct called&#39;.PHP_EOL;
  }
 
  //某个对象的引用都被删除、对象被销毁、调用exit()后、脚本关闭时被调用
  public function __destruct()
  {
    echo &#39;__destruct called&#39;.PHP_EOL;
  }
 
  //当给不可访问或不存在属性赋值时被调用
  public function __set($name, $value)
  {
    echo $name.&#39;-&#39;.$value;
    echo &#39;__set called&#39;.PHP_EOL;
  }
 
  //读取不可访问或不存在属性时被调用
  public function __get($name)
  {
    echo $name;
    echo &#39;__get called&#39;.PHP_EOL;
  }
 
  //调用不可访问或不存在的方法时被调用
  public function __call($name, $arguments)
  {
    echo $name . &#39;-&#39; . implode(&#39;,&#39;, $arguments);
    echo &#39;__call called&#39;.PHP_EOL;
  }
 
  //调用不可访问或不存在的静态方法时被调用
  public static function __callStatic($name, $arguments)
  {
    echo $name . &#39;-&#39; . implode(&#39;,&#39;, $arguments);
    echo &#39;__callStatic called&#39;.PHP_EOL;
  }
 
  //对不可访问或不存在的属性调用isset()或empty()时被调用
  public function __isset($name)
  {
    echo $name;
    echo &#39;__isset called&#39;.PHP_EOL;
    return true;
  }
 
  //对不可访问或不存在的属性进行unset时被调用
  public function __unset($name)
  {
    echo $name;
    echo &#39;__unset called&#39;.PHP_EOL;
  }
 
  //serialize时被调用,当你不需要保存大对象的所有数据时很有用
  public function __sleep()
  {
    echo &#39;__sleep called&#39;.PHP_EOL;
    return array(&#39;var1111111111&#39;);
  }
 
  //unserialize时被调用,可用于做些对象的初始化操作
  public function __wakeup()
  {
    echo &#39;__wakeup called&#39;.PHP_EOL;
    $this->var = &#39;test after wakeup&#39;;
  }
 
  //当一个类被转换成字符串时被调用
  public function __toString()
  {
    return &#39;__toString called&#39;.PHP_EOL;
  }
 
  //进行对象clone时被调用,用来调整对象的克隆行为
  public function __clone()
  {
    echo &#39;__clone called&#39;.PHP_EOL;
  }
 
  //当以函数方式调用对象时被调用
  public function __invoke()
  {
    echo &#39;__invoke called&#39;.PHP_EOL;
  }
 
  //当调用var_export()导出类时,此静态方法被调用。用__set_state的返回值做为var_export的返回值。
  public static function __set_state($arr)
  {
    return &#39;__set_state called&#39;.PHP_EOL;
  }
 
  //当调用var_dump()打印对象时被调用(当你不想打印所有属性)适用于PHP5.6版本
  public function __debuginfo($arr)
  {
    echo &#39;__debuginfo called&#39;.PHP_EOL;
    return array(
      &#39;var&#39; => &#39;test fro __debuginfo&#39;
    );
  }
}
 
$m = new Magic(); //__construct()被调用
$m->not_exist_property = test; //__set()被调用
echo $m->not_exist_property;//__get()被调用
$m->abc(1,2,3); //__call()被调用
echo isset($m->not_exist_property); //__isset()被调用,返回bool值
unset($m->not_exist_property); //__unset()被调用
echo $tmp = serialize($m); //__sleep()被调用
unserialize($tmp); //__wakeup()被调用
$m1 = clone $m; //__clone()被调用,对象默认是引用传递,使用clone关键词则可实现对象复制
$m(); //__invoke()
eval( &#39;$m2 = &#39; . var_export ( $m , true ) . &#39;;&#39; );var_dump($m2);
var_dump($m);
//最后__destruct()被调用
 
/*
结果:
__construct called
not_exist_property-test__set called
not_exist_property__get called
abc-1,2,3__call called
not_exist_property__isset called
1not_exist_property__unset called
__sleep called
O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called
__destruct called
__clone called
__invoke called
string(20) "__set_state called
"
class Magic#1 (1) {
 public $var =>
 string(4) "test"
}
__destruct called
__destruct called
 
 
*/

Summary: 이상 이 글의 내용은 여기까지입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.

관련 권장 사항:

PHP는 간단한 GET, POST, 쿠키, 세션 및 기타 기능을 구현합니다.

PHP를 사용하여 데이터베이스를 작동하여 테이블이 있는지 확인하는 방법

파일을 가져오는 방법 php

의 MIME 유형

위 내용은 PHP의 매직 메소드 정의 및 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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