>  기사  >  백엔드 개발  >  PHP의 매직 메소드 예제에 대한 자세한 설명

PHP의 매직 메소드 예제에 대한 자세한 설명

怪我咯
怪我咯원래의
2017-05-03 18:07:001677검색

매직메소드란?

PHP에서는 일련의 매직 메소드가 제공됩니다. 이러한 매직 메소드는 프로그래밍에 많은 편의를 제공합니다. PHP에서는 두 개의 밑줄 __로 시작하는 메소드를 매직 메소드라고 합니다. 매직 메서드는 명시적으로 호출할 필요가 없지만 특정 조건에 의해 트리거됩니다. 이 장에서는 PHP에서 제공하는 매직 메소드에 대해 간략하게 소개합니다.

PHP의 매직 메소드는 다음과 같습니다:

__wakeup()
函数 说明
__construct() 类的构造函数
__destruct() 类的析构函数
__call() 在对象中调用一个不可访问方法时调用
__callStatic() 用静态方式中调用一个不可访问方法时调用
__get() 获得一个类的成员变量时调用
__set() 设置一个类的成员变量时调用
__isset() 当对不可访问属性调用isset()或empty()时调用
__unset() 当对不可访问属性调用unset()时被调用。
__sleep() 执行serialize()时,先会调用这个函数
__wakeup() 执行unserialize()时,先会调用这个函数
__toString() 类被当成字符串时的回应方法
__invoke() 调用函数的方式调用一个对象时的回应方法
__set_state() 调用var_export()导出类时,此静态方法会被调用。
__clone() 当对象复制完成时调用
함수
설명
__construct() 클래스 생성자
__destruct() 클래스 소멸자
__call() 객체에서 액세스할 수 없는 메소드가 호출될 때 호출됩니다.
__callStatic() 정적 모드에서 액세스할 수 없는 메소드를 호출할 때 호출됨
__get() 클래스의 멤버 변수를 얻을 때 호출됨
__set() 클래스의 멤버 변수 설정 시 호출
__isset() 액세스할 수 없는 속성에 대해 isset() 또는 empty()가 호출될 때 호출됩니다.
__unset() 설정 해제 시 호출( )은 액세스할 수 없는 속성에 대해 호출됩니다.
__sleep() serialize() 실행 시 이 함수가 먼저 호출됩니다
unserialize()를 실행할 때 이 함수가 먼저 호출됩니다
__toString() 클래스가 문자열로 처리될 때의 응답 방법
__invoke () 함수를 호출하여 객체를 호출할 때의 응답 방법 td>
__set_state() 이 정적 메서드는 클래스를 내보내기 위해 var_export()를 호출할 때 호출됩니다.
__clone() 객체 복사가 완료되면 호출

PHP의 매직 메소드 예제에 대한 자세한 설명위 표의 "__"는 "_"이 아닌 두 개의 밑줄입니다.

이러한 매직 메서드의 실제 적용을 별도로 살펴보겠습니다

__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(), __isset() 및 __unset()

이 두 함수는 클래스의 멤버 변수를 가져오거나 설정할 때 호출됩니다. 예를 들어, 실행 시 객체 자체의 멤버 변수

<?php
class MethodTest
{
    private $data = array();

    public function __set($name, $value){
        $this->data[$name] = $value;
    }

    public function __get($name){
        if(array_key_exists($name, $this->data))
            return $this->data[$name];
        return NULL;
    }

    public function __isset($name){
        return isset($this->data[$name]);
    }

    public function __unset($name){
        unset($this->data[$name]);
    }
}
?>

__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()

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

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

$class = new TestClass();
echo $class;
?>

객체를 출력하려면 echo $obj;를 사용하세요. 이 메서드는 문자열만 반환할 수 있으며 이 메서드에서는 예외가 발생할 수 없습니다. 그렇지 않으면 치명적인 오류가 발생합니다.

__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의 마법 상수 예제에 대한 자세한 설명

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

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