PHP面向对象中魔术方法使用

一:
PHP为我们提供了一系列用__开头的函数,这些函数无需自己动手调用,会在何时的时机自动调用,称这类函数为魔术函数。
如:
function __construct( ) {} 在new一个新对象时自动调用此函数。

二:
1:构造函数__construct()和析构函数_destruct()
在new新的Player对象时会调用__construct()函数。对象销毁前自动调用__destruct函数。
代码如下:

<?php
    class Player{
        public $name;
        public $age;

        function __construct( $name, $age ){
            echo "构造函数<br>";
            $this->name = $name;
            $this->age = $age;
        }

        function getName( ){
            return $this->name;
        }
        function __destruct( ){
            echo "析构函数<br>";
        }
    }

    $player_1 = new Player( "kobe", 36 );
    $name = $player_1->getName( );
    echo $name;
    echo "<br>";
    unset($player_1);
    echo "end";
?>

运行结果:
这里写图片描述

2:__get():访问类中私有属性时自动调用,传递读取属性名,返回$this->属性名。

当直接访问私有成员变量echo $player_1->name;时,会有报错信息,显示不能调用name。
这里写图片描述

使用__get可以访问私有属性。

<?php
    class Player{
        private $name;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }

        function __get( $name ){
            return $this->$name;
        }
    }

    $player_1 = new Player( "kobe", 36 );
    echo $player_1->name;
    echo "<br>";
?>

运行结果如下:
这里写图片描述

3:__set():给类的私有属性赋值时调用,传递需设置的属性名。属性值。
当设置私有成员变量$player_1->name = “james”;时,会有报错信息。
这里写图片描述

正确打开方式是:

<?php
    class Player{
        private $name;
        private $age;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }

        function __set( $key, $value ){
            $this->$key = $value;
        }

        function __get( $name ){
            return $this->$name;
        }
    }

    $player_1 = new Player( "kobe", 36 );
    $player_1->name = "james";
    echo $player_1->name;
    echo "<br>";
?>

运行结果如下:
这里写图片描述

4:__isset():和 __unset():
__isset():检测对象私有属性时调用,传递检测的属性名,返回isset($this->属性名)。

__unset():使用unset函数删除对象的私有属性时调用,传递删除的属性名。方法中执行unset($this->属性名)。

unset私有成员变量时,会有报错信息。
这里写图片描述

代码如下:

<?php
    class Player{
        private $name;
        private $age;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }

        function __isset( $key ){
            return isset( $this->$key);
        }

        function __unset( $key ){
            unset( $this->$key );
        }
    }

    $player_1 = new Player( "kobe", 36 );
    if ( isset($player_1->name) )
        echo "name 成员变量存在";
    else
        echo "name 成员变量不存在";
    unset($player_1->name);
    echo "<br>";
?>

这里写图片描述

5:__toString():使用echo打印对象时调用,返回打印对象时想要显示的内容,返回必须是字符串。
echo $player_1;时会有报错信息。
这里写图片描述

代码如下:

<?php
    class Player{
        private $name;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }

        function __toString(){
            return "显示对象";
        }
    }

    $player_1 = new Player( "kobe" );
    echo $player_1;
    echo "<br>";
?>

运行结果:
这里写图片描述

6:__call():调用一个类中未定义的方法或者私有、受保护的方法时自动调用__call函数。传递被调用的函数名及参数列表。

<?php
    class Player{
        public $name;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }
        private function getName(){
            return $this->$name;
        }

        function __call( $funcName, $funcParams ){
            echo "调用的函数是$funcName, 参数列表是:";
            print_r( $funcParams );
        }
    }

    $player_1 = new Player( "kobe" );
    echo $player_1->setName( "james" );
    echo "<br>";
    echo $player_1->getName();
    echo "<br>";
?>

这里写图片描述

7:__clone():当使用clone关键字克隆一个对象时自动调用,作用是为新克隆的对象初始化赋值。

<?php
    class Player{
        public $name;
        function __construct( $name ){
            echo "构造函数<br>";
            $this->name = $name;
        }
        function __clone( ){
            $this->name = "james";
        }
    }

    $player_1 = new Player( "kobe" );
    echo $player_1->name . "<br>";
    $player_2 = clone $player_1;
    echo $player_2->name . "<br>";
    echo "<br>";
?>

运行结果如下:
这里写图片描述

8:__sleep():对象序列化时自动调用,返回一个数组,数组中的值就是可以序列化的属性。可以定义serialize()序列化时返回的数据。
不使用__sleep时,serialize()返回类中所有的成员变量数据。
这里写图片描述

使用__sleep之后的代码如下:

<?php
    class Player{
        public $name;
        public $age;
        public $sex;
        function __construct( $name, $age, $sex ){
            echo "构造函数<br>";
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;
        }
        function __sleep( ){
            return array("name", "sex");
        }
    }

    $player_1 = new Player( "kobe", 35, "male" );
    echo serialize($player_1);
?>

运行结果如下:
这里写图片描述

9:__wakeup():对象反序列化时调用,为反序列化新产生的对象进行初始化赋值。
代码如下:

<?php
    class Player{
        public $name;
        public $age;
        public $sex;
        function __construct( $name, $age, $sex ){
            echo "构造函数<br>";
            $this->name = $name;
            $this->age = $age;
            $this->sex = $sex;
        }
        function __wakeup( ){
            $this->name = "kobe";
            $this->age = 35;
            $this->sex = true;
        }
    }

    $player_1 = new Player( "kobe", 22, false );
    $temp = serialize($player_1);
    $player_2 = unserialize($temp);
    var_dump($player_2);
?>

运行结果:
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章