码迷,mamicode.com
首页 > Web开发 > 详细

PHP中设计模式以及魔术方法

时间:2019-06-19 00:38:14      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:属性   调用   策略   tostring   ase   实例   his   creat   eof   

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=‘学生‘;
    }
}

 

PHP中设计模式以及魔术方法

标签:属性   调用   策略   tostring   ase   实例   his   creat   eof   

原文地址:https://www.cnblogs.com/shineguang/p/11048645.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!