1.设计模式

       1.1单例模式

       口诀:三私一公

1、私有的静态属性用来保存对象的单例
2、私有的构造方法用来阻止在类的外部实例化
3、私有的__clone阻止在类的外部clone对象
4、公有的静态方法用来获取对象的单例

           实现:

<?php
//三私一公
class db {
    //静态的属性用来保存对象的单例
    private static $instance;
    //私有的构造方法阻止在类的外部实例化
    private function __construct() {
        
    }
    //私有的__clone()阻止在类的外部clone对象
    private function __clone() {
        
    }
    public static function getinstance() {
        //保存的值不属于db类的类型就实例化
        if(!self::$instance instanceof self)
            self::$instance=new self();
        return self::$instance;
    }
}

          1.2工厂模式:

           特点:传递不同的参数获取不同的对象

<?php
class productsa {
}
class productsb {    
}
//工厂模式
class productsfactory {
    public function create($num) {
        switch($num) {
            case 1:
                return new productsa;
            case 2:
                return new productsb;
            default:
                return null;
        }
    }
}

              1.3策略模式:   

              特点:传递不同的参数调用不同的策略(方法)

<?php
class walk {
    public function way() {
        echo '走着去<br>';
    }
}
class bus {
    public function way() {
        echo '坐车去<br>';
    }
}
//策略模式
class student {
    public function play($obj) {
        $obj->way();
    }
}

2.魔术方法:

            2.1__tostring()、__invoke()

            __tostring():将对象当成字符串使用的时候自动调用

            __invoke():将对象当成函数使用的时候自动调用

<?php
class student {
    //把对象当成字符串使用的时候自动执行
    public function __tostring() {
        return '这是一个对象,不是字符串<br>';
    }
    //把对象当成函数使用的时候自动执行
    public function __invoke() {
        echo '这是一个对象,不是函数<br>';
    }
}

                2.2__set()、__get()、__isset()、__unset()

__set($k,$v):给无法访问的属性赋值的时候自动执行
__get($k):获取无法访问的属性值的时候自动调用
__isset($k):判断无法访问的属性是否存在自动调用
__unset($k):销毁无法访问的属性的时候自动执行
<?php
class student {
    private $name;
    private $sex;
    private $age;
    //给无法访问的属性赋值的时候自动执行
    public function __set($k,$v) {
        $this->$k=$v;
    }
    //获取无法访问的属性值的时候自动调用
    public function __get($k) {
        return $this->$k;
    }
    //判断无法访问的属性是否存在自动调用
    public function __isset($k) {
        return isset($this->$k);
    }
    //销毁无法访问的属性的时候自动执行
    public function __unset($k) {
        unset($this->$k);
    }
}

                 2.3__call()、__callstatic()

__call():调用无法访问的方法时自动执行
__callstatic():调用无法访问的静态方法时自动执行
<?php
class student {
    /**
    *作用:调用无法访问的方法时自动执行
    *@param $fn_name string 方法名
    *@param $fn_args array 参数数组
    */
    public function __call($fn_name,$fn_args) {
        echo "{$fn_name}不存在<br>";
    }
    //调用无法访问的静态方法时自动执行
    public static function __callstatic($fn_name,$fn_args) {
        echo "{$fn_name}静态方法不存在<br>";    
    }
}

                2.4__sleep()、__wakeup()

__sleep():当序列化的时候自动调用
__wakeup():当反序列化的时候自动调用
<?php
class student {
    private $name;
    private $sex;
    private $add='中国';
    public function __construct($name,$sex) {
        $this->name=$name;
        $this->sex=$sex;
    }
    /**
    *序列化的时候自动调用
    *@return array 序列化的属性名
    */
    public function __sleep() {
        return array('name','sex');
    }
    //反序列化的时候自动调用
    public function __wakeup() {
        $this->type='学生';
    }
}