php常用的魔术方法

__construct:构造函数,一旦创建对象都就会自动调用

__call:当调用了未定义的方法时会自动触发

__set:当给类外部不可访问的属性设置值时会自动触发

__get:当获取类外部不可访问的属性时会自动触发

__isset:当对类外部不可访问的属性使用了isset()或empty()时会自动触发

__unset:当对类外部不可访问的属性使用了unset()时会自动触发

__destruct:当对象结束其生命周期时就会自动触发

 

<?php 
header("content-type:text/html;charset=UTF-8");
class Magic{
    private $testGet;       //私有测试__get魔术方法的属性
    private $testSet;       //私有测试__set魔术方法的属性
    private $testIsset;     //私有测试__isset魔术方法的属性
    private $testUnset;     //私有测试__unset魔术方法的属性
    public static $a=1;     //私有用于测试__clone魔术方法的常量

    /**
     * 测试构成方法,创建新对象时先调用此方法
     */
    public function __construct(){
        echo static::$a+2;
        echo "这是构造函数"."<br>"."<br>";
    }

    /**
     * 测试isset方法,这是当不可访问的属性被调用了isset()或者empty()方法时会触发
     */
    public function __isset($name){
        echo "对不可访问属性:".$name."调用 isset() 或 empty()"."<br>"."<br>";
    }

    /**
     * 测试unset方法,这是当不可访问的属性被调用了unset()方法时会触发
     */
    public function __unset($name){
        echo "当对不可访问属性:".$name."调用unset()"."<br>"."<br>";
    }

    /**
     * 测试call方法,这是当调用了未定义的方法时会触发
     */
    public function __call($method,$agrs){
        echo "调用了不存在的方法:".$method."<br>"."这是接收的参数:";
        print_r($agrs);
        echo "<br>"."<br>";
    }

    /**
     * 测试set方法,这是当不可访问的属性被设置时会触发
     */
    public function __set($name,$data){
        echo "调用了不可设置的属性:".$name."<br>"."参数为:".$data."<br>";
    }

    /**
     * 测试get方法,这是当不可访问的属性被访问时会触发
     */
    public function __get($name){
        echo "调用了不可获取的属性:".$name."<br>"."<br>";
    }

    /**
     * 测试clone方法,这是类被克隆时会触发
     */
    public function __clone(){
        echo static::$a+1;
        echo "我被克隆了"."<br>"."<br>";
    }

    /**
     * 测试析构方法,这是当在脚本关闭时被调用
     */
    public function __destruct(){
        echo "这是析构函数";
    }
}


$test=new Magic(); //实例化Magic类,触发构造函数

$test->callMethod('123');   //调用不存在的方法

$test->testSet=123;     //设置类外部不可访问的属性

$test->testGet;         //获取类外部不可访问的属性

$test2=clone $test;     //克隆test类,开辟了另一份一模一样的属性和方法存储空间,但相互不会影响
isset($test->testIsset);       //用isset执行类外部不可访问的属性
unset($test->testUnset);        //用unset执行类外部不可访问的属性

 

posted @ 2018-06-13 12:23  legendheng  阅读(169)  评论(0编辑  收藏  举报