欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-19 23:36:57
1.设计模式 1.1单例模式 口诀:三私一公 实现: 1.2工厂模式: 特点:传递不同的参数获取不同的对象 1.3策略模式: 特点:传递不同的参数调用不同的策略(方法) 2.魔术方法: 2.1__tostring()、__invoke() __tostring():将对象当成字符串使用的时候自动调用 ......

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