PHP基础(魔术方法)

__construct():构造函数,方法名与类名相同也为构造函数。

<?php 

    class Magic
    {
        public $name = '';
        function __construct()
        {
            $this->name = '__construct';
            echo $this->name;
        }
    }
    $magic = new Magic();//输出    __construct
?>

__desctruct():析构函数,所有对象引用被删除或者对象被销毁后执行,即使在exit()/die()后也会执行。

<?php 

    class Magic
    {
        public $name = '';
        function __construct()
        {
            $this->name = '__construct';
            echo $this->name;
            exit();
        }
        function __destruct()
        {
            $this->name = '__destruct';
            echo $this->name;
        }
    }
    $magic = new Magic();//输出    __construct__destruct
?>

__call() && __callStatic():当调用对象中某种不存在的方法时,__call()或__clallStatic()被调用。__callStatic()为静态。

<?php 

    class Magic
    {
        public $name = '';
        function __call($method,$params)
        {
            $this->name = '__call---'.$method.'---';
            echo $this->name;
            var_dump($params);
        }
        static function __callStatic($method,$params)
        {
            $name = '__callStatic---'.$method.'---';
            echo $name;
            var_dump($params);
        }
    }
    $magic = new Magic();
    $magic->magic(1,2,3);         //输出    __call---magic---array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
    Magic::magicStatic(4,5,6);    //输出    __callStatic---magicStatic---array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) }
?>

__get():访问不存在的成员时调用。

__set():设置不存在的成员时调用。

<?php 

    class Magic
    {
        public $name = '';
        function __get($value)
        {
            return 666;
        }
        function __set($key,$value)
        {
            echo $key;
            echo $value;
        }
    }
    $magic         = new Magic();
    $magic->a     = 1;                 //输出    a1
    $b             = $magic->a + 1;
    echo $b;                          //输出    667
?>

__isset():

__unset():

__sleep():当序列化类时首先检查类中是否包含__sleep(),按照__sleep()返回需要序列化变量名称进行序列化。

__wakeup():反序列化时首先检查是否包含__wakeup(),用于反序列化初始操作。

<?php 

    class Magic
    {
        public $name = 'Jerry';
        public $email = 'Jerry@J.com';
        function __sleep()
        {
            return ['name'];
        }
        function __wakeup()
        {
            echo "---反序列化初始:";
        }
    }
    $magic         = new Magic();
    $seria = serialize($magic);
    echo $seria;                    //输出    O:5:"Magic":1:{s:4:"name";s:5:"Jerry";}
    var_dump(unserialize($seria));    //输出    ---反序列化初始:object(Magic)#2 (2) { ["name"]=> string(5) "Jerry" ["email"]=> string(11) "Jerry@J.com" }
?>

__toString():快速字符串获取,在直接输出对象时被调用

<?php 

    class Magic
    {
        public $name = 'Jerry';
        public $email = 'Jerry@J.com';
        function __toString()
        {
            return $this->name;
        }
    }
    $magic         = new Magic();
    echo $magic;                    //输出    Jerry
?>

__clone():当执行对象clone时会被执行。

<?php 

    class Magic
    {
        function __clone()
        {
            echo "Magic对象被Clone";
        }
    }
    $magic         = new Magic();
    $magicClone = clone $magic;            //输出    Magic对象被Clone
?>

 

posted @ 2018-01-15 22:49  LiuLiwei  阅读(195)  评论(0编辑  收藏  举报