php面向对象中的魔术方法

  原创,转载请注明出处

  在 PHP 中以两个下划线开头的方法,__construct(), __destruct (), __call(), __callStatic(),__get(), __set(), __isset(), __unset (), __sleep(), __wakeup(), __toString(), __set_state,() __clone() __autoload()等,被称为"魔术方法"(Magic methods)。注意:这些方法在类中定义

下面举一个例子:

class Magic
{
    public $var = 'test';

    private $msg;//详细信息
    private $test ="测试私有属性";

    //构造函数,在创建对象的时候被调用
    function __construct()
    {
        echo '__construct called'.PHP_EOL;
        echo "构造函数,在创建对象的时候被调用";
    }
    //析构函数,某个对象在被删除,或者被销毁,调用exit()后,脚本关闭时被调用
    public function __destruct(){
        echo "析构函数,某个对象在被删除,或者被销毁,调用exit()后,脚本关闭时被调用";
    }
    //当给一个不可访问或者不存在的属赋值时候被调用
    public function __set($name,$value){
        echo "__set()当给一个不可访问或者不存在的属性赋值时候被调用,调用的属性为:".$name."要赋值为:".$value;
    }
    //读取不可访问或者不存在属性时被调用
    public  function __get($name){
        return $this->test = "这个是私有属性不能访问赋值后的值";
        echo "__get()读取不可访问或者不存在属性时被调用;要读取的属性为:".$name;
    }
    //调用不可访问或不存在的方法是被调用
    public function __call($name,$arguments){
        echo $name."--".implode(",",$arguments);
        $this->msg = "_call()方法,调用的方法名为:".$name."调用时候传递的参数是一个数组为".$arguments."调用不可访问或不存在的方法是被调用";
        print_r($this->msg) ;
    }
    //调用不可访问或不存在的静态方法是被调用
    static public function __callStatic($name,$arguments){
        $this->msg = "__callStatic()调用名为:".$name."调用时候传递的参数为一个数组为:".$arguments."调用不可访问或不存在的静态方法是被调用";
        print_r($this->msg);
    }
    //调用不可访问或者不存在的属性调用isset()或者empty()时被调用
    public function __isset($name){
        echo "__isset()调用不可访问或者不存在的属性调用isset()或者empty()时候被调用";
    }


}
$obj = new Magic();
$obj->not_exist_property = test; //__set()被调echo $m->not_exist_property;//__get()被调用
$obj->not_exist_property;
echo $obj->test;

__get,__set

1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用 
2. 向一个难以访问的属性赋值的时候 __set() 方法被调用 
3. 难以访问包括:(1)私有属性,(2)没有初始化的属性 
4. __isset() __unset() 也类似

__call,__callStatic

__call调用不可访问或不存在的方法时被调用
__callStatic调用不可访问或不存在的静态方法时被调用

__construct,__destruct

__constuct构建对象的时被调用;
__destruct明确销毁对象或脚本结束时被调用;

原文地址:https://www.cnblogs.com/imnzq/p/6554527.html