zoukankan      html  css  js  c++  java
  • PHP中设计模式以及魔术方法

    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='学生';
        }
    }
  • 相关阅读:
    面试技巧——经典面试问题回答思路
    Linux试题及答案(一)
    面试中的问到薪资问题怎么回答?
    LoadRunner监控Linux
    面试时如何解释被裁原因
    可持久化数组
    洛谷P2286宠物收养场·改
    改博客的背景
    洛谷P2286宠物收养场
    阶乘的0
  • 原文地址:https://www.cnblogs.com/shineguang/p/11048645.html
Copyright © 2011-2022 走看看