>  기사  >  백엔드 개발  >  PHP의 매직 메소드는 무엇입니까? PHP 매직 메소드 사용 요약(코드)

PHP의 매직 메소드는 무엇입니까? PHP 매직 메소드 사용 요약(코드)

不言
不言원래의
2018-07-24 17:00:334995검색

PHP에서 매직 메소드의 정의는 두 개의 밑줄 __로 시작하는 메소드를 매직 메소드라고 합니다. PHP에서 이러한 매직 메소드의 역할은 매우 중요합니다. 이러한 매직 메소드의 예를 살펴보겠습니다.

마법의 메소드:

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用

__construct() 및 __destruct()

생성자와 소멸자는 친숙해야 하며 객체가 생성되고 소멸될 때 호출됩니다. 예를 들어, 파일을 열고, 객체가 생성될 때 열고, 객체가 죽을 때 닫아야 합니다

<?php
class FileRead
{
 protected $handle = NULL;
 
 function __construct(){
  $this->handle = fopen(...);
 }
 
 function __destruct(){
  fclose($this->handle);
 }
}
?>

이 두 메서드는 상속될 때 확장될 수 있습니다. 예:

<?php
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }
 
 function __destruct(){
  parent::__destruct();
 }
}
?>

__call() 및 __callStatic()

이 두 메서드는 개체에서 액세스할 수 없는 메서드가 호출될 때 호출되며, 후자는 정적 메서드입니다. 이 두 메서드는 변수 메서드(변수 함수) 호출에 사용될 수 있습니다.

<?php
class MethodTest
{
 public function __call ($name, $arguments) {
  echo "Calling object method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
 
 public static function __callStatic ($name, $arguments) {
  echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
}
 
$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>

__get(), __set(),

__get 속성은 액세스 객체의 속성이 존재하지 않거나 공개 속성이 아닌 경우 자동으로 로드됩니다. 매개변수에는 __get 메서드인 이름 값이 하나만 있습니다. 액세스 개체에

속성 이름입니다.

__set은 객체의 속성에 값을 할당하는 경우입니다. 속성이 존재하지 않거나 비공개 속성인 경우 __set 메서드가 자동으로 로드됩니다. 두 개의 매개변수가 있습니다. 매개변수 1은 액세스 개체에 있는 호출할 수 없는 속성의 이름입니다. 매개변수 2는 할당을 위해 전달되는 매개변수입니다. 이 매개변수는 모두 공개 가시성을 가지며 비정적입니다. 예를 들어 이해하기 쉽도록 작은 밤나무를 예로 들 수 있습니다.

<?php
/**
 * 清晰的认识__get() __set()
 */
class Example {
    
    //公有的属性
    public $public = &#39;pub&#39; ;
    //受保护的 - 子类中该属性可用
    protected $protected = &#39;pro&#39;;
    //私有的 - 只能此类使用此属性
    private $private = &#39;pri&#39;;
    
    //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法
    public function __get($name){
        return &#39;调用__get()方法:&#39;.$name;
    }
    
    //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法
    public function __set($name,$value){
        echo "\nname:".$name.&#39;,value:&#39;.$value."\n";
    }
}
$example = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
echo $example->public."\n";
echo $example->protected."\n";
echo $example->private."\n";
echo $example->other."\n";
echo &#39;<hr>&#39;;
$example->public = &#39;lic&#39;;   //这个赋值成功所有没有显示
$example->protected = &#39;tec&#39;;
$example->private = &#39;vat&#39;;
$example->other = &#39;er&#39;;
echo &#39;<br/>&#39;;

echo '공용 속성 인쇄:'.$example->public;

__isset() 및 __unset()

__isset()은 객체 또는 비-객체의 속성을 호출합니다. 클래스 isset() 메서드를 사용하여 속성을 호출할 때 공개 속성이 없거나 비공개인 경우 isset() 메서드가 자동으로 실행됩니다. __unset()은 객체의 속성을 호출하거나 클래스가 아닌 속성을 호출합니다. . 공개 속성이 없거나 비공개인 경우 isset() 메서드가 자동으로 실행됩니다. 비공개 속성은

자동으로 __unset() 호출을 실행하며, 호출할 수 없는 멤버 속성을 삭제할 수 있습니다. 이 메소드를 클래스에 추가하지 않으면 객체의 비공개 멤버를 삭제할 수 없습니다.

먼저 Small chestnut의 예를 들어보겠습니다.

<?php
    /**
     * 针对类中的魔术方法 __isset() 和 __unset() 的例子
     */
class Example {
    public $public;
    protected $protected;
    private $private;
    
    public function __construct(){
        $this->public = &#39;pub&#39;;
        $this->protected = &#39;pro&#39;;
        $this->private = &#39;pri&#39;;
    }
    
    public function __isset($var){
        echo &#39;这里通过__isset()方法查看属性名为 &#39;.$var."\n";
    }
    
    public function __unset($var){
        echo &#39;这里通过__unset()方法要销毁属性名为 &#39;.$var."\n";
    }
}
$exa = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
var_dump(isset($exa->public));
echo "\n";
var_dump(isset($exa->protected));
echo "\n";
var_dump(isset($exa->private));
echo "\n";
var_dump(isset($exa->noVar));
echo "\n";
echo &#39;<hr/>&#39;;

unset($exa->public);
var_dump($exa);
echo "\n";
unset($exa->protected);
echo "\n";
unset($exa->private);
echo "\n";
unset($exa->noVar);
echo "\n";

__sleep() 및 __wakeup()

serialize() 및 unserialize를 실행할 때 (), 이 두 함수가 먼저 호출됩니다. 예를 들어, 객체를 직렬화할 때 객체에 데이터베이스 링크가 있습니다. 역직렬화 중에 링크 상태를 복원하려면 이 두 함수를 재구성하여 링크를 복원할 수 있습니다. 예시는 다음과 같습니다.

<?php
class Connection
{
 protected $link;
 private $server, $username, $password, $db;
 
 public function __construct($server, $username, $password, $db)
 {
  $this->server = $server;
  $this->username = $username;
  $this->password = $password;
  $this->db = $db;
  $this->connect();
 }
 
 private function connect()
 {
  $this->link = mysql_connect($this->server, $this->username, $this->password);
  mysql_select_db($this->db, $this->link);
 }
 
 public function __sleep()
 {
  return array(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
 }
 
 public function __wakeup()
 {
  $this->connect();
 }
}
?>

__toString()

객체를 문자열로 처리할 때의 응답 방식입니다. 예를 들어, 객체


를 출력하려면 echo $obj를 사용하세요.

<?php
// Declare a simple class
class TestClass
{
 public function __toString() {
  return &#39;this is a object&#39;;
 }
}
 
$class = new TestClass();
echo $class;
?>

이 메서드는 문자열만 반환할 수 있으며 이 메서드에서는 예외가 발생할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다.

__invoke()

함수를 호출하여 객체를 호출할 때의 응답 방법입니다. 다음과 같이

<?php
class CallableClass
{
 function __invoke() {
  echo &#39;this is a object&#39;;
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

__set_state()

이 정적 메서드는 클래스를 내보내기 위해 var_export()가 호출될 때 호출됩니다.

<?php
class A
{
 public $var1;
 public $var2;
 
 public static function __set_state ($an_array) {
  $obj = new A;
  $obj->var1 = $an_array[&#39;var1&#39;];
  $obj->var2 = $an_array[&#39;var2&#39;];
  return $obj;
 }
}
 
$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
var_dump(var_export($a));
?>

__clone()객체 복사가 완료되면 호출됩니다. 예를 들어, 디자인 패턴에 대한 자세한 설명 및 PHP 구현: 싱글턴 모드 기사에서 언급된 싱글턴 모드 구현 방법에서 이 함수는 객체가 복제되는 것을 방지하는 데 사용됩니다.

<?php
public class Singleton {
 private static $_instance = NULL;
 
 // 私有构造方法
 private function __construct() {}
 
 public static function getInstance() {
  if (is_null(self::$_instance)) {
   self::$_instance = new Singleton();
  }
  return self::$_instance;
 }
 
 // 防止克隆实例
 public function __clone(){
  die(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
 }
}
?>

매직 상수

PHP의 대부분의 상수는 변경되지 않지만, 코드의 위치에 따라 변경되는 8개의 상수가 있습니다. 이 8개의 상수를 매직 상수라고 합니다.

__LINE__, 파일의 현재 줄 번호

__FILE__, 파일의 전체 경로 및 파일 이름

__DIR__, 파일이 있는 디렉터리

__FUNCTION__, 함수 이름

__CLASS__, 파일의 이름 class

__TRAIT__, Trait

의 이름

__METHOD__, 클래스의 메소드 이름

__NAMESPACE__, 현재 네임스페이스의 이름

이러한 매직 상수는 현재 환경 정보를 얻거나 로그를 기록하는 데 자주 사용됩니다.

관련 권장 사항:

PHP에서 일반적으로 사용되는 여러 매직 메서드

[php 클래스 및 개체] 매직 메서드

위 내용은 PHP의 매직 메소드는 무엇입니까? PHP 매직 메소드 사용 요약(코드)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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