• PHP设计模式


    单例模式(Singleton)

    /***
     * Class Singleton 单例模式
     * 单例类不能再其它类中直接实例化,只能被其自身实例化。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
     * 1.私有的构造函数、克隆函数,防止外部代码new、clone
     * 2.私有的静态的成员变量来保存类的实例
     * 3.公共的静态函数来访问类的实例
     */
    class Singleton {
        private static $instance = null;//声明一个私有的实例变量
    
        public static function getInstance() {
            if (self::$instance === null) {
                self::$instance = new self();
            }
            return self::$instance;
        }
    
        private function __construct() {
        }
    
        private function __clone() {
        }
    }
    
    $a = Singleton::getInstance();
    $b = Singleton::getInstance();
    /*判断两个类是否为同一个类*/
    echo $a === $b ? 1 : 0; // 1
    exit;

    工厂模式

    注册模式

    适配器模式

    观察者模式

    依赖注入模式

     依赖注入DI、控制反转IOC、反射

    控制反转IOC是一种思想,依赖注入DI是实施这种思想的方法

    面向接口编程

    使用时实例化并建立连接

    构造器注入、setter、接口注入

    容器模式

    迭代器iterator

    迭代器实际是一个实现了Iterator的类,可以用foreach进行遍历。

     1 <?php
     2 class Sample implements Iterator{
     3   private $curIndex=0;
     4   private $items=null;
     5   public function __construct($_items) {
     6     $this->items = $_items;
     7   }
     8   public function current (){
     9     echo "current
    ";
    10     return $this->items[$this->curIndex];
    11   }
    12   public function key (){
    13     echo "key
    ";
    14     return $this->curIndex;
    15   }
    16   public function next (){   
    17       echo "next
    "; 
    18       $this->curIndex++;
    19   }
    20   public function rewind (){
    21       $this->curIndex = 0;   
    22   }
    23   public function send ( $value ){
    24     if($value == "stop"){
    25       $this->curIndex = null;
    26     }
    27   }
    28   public function valid (){
    29     echo "valid
    ";
    30     return isset($this->items[$this->curIndex]);
    31   }
    32 }
    33 $sample = new Sample([1,2,3]);
    34 foreach ($sample as $k =>$v){
    35 }
    >>>>> valid current key next

    可以看到foreach 是先调用valid判断迭代器是否有效,然后再调用current获取当前值,同时调用next移动key到指向下一个值(输出key是因为 $k=>$v的缘故)。

     生成器

    生成器提供了一种更容易的方法来实现简单的对象迭代,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。
    生成器允许你在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组, 那会使你的内存达到上限,或者会占据可观的处理时间。
    相反,你可以写一个生成器函数,就像一个普通的自定义函数一样, 和普通函数只返回一次不同的是, 生成器可以根据需要 yield 多次,以便生成需要迭代的值。
    PHP 将会在每次需要值的时候调用生成器函数,并在产生一个值之后保存生成器的状态,这样它就可以在需要产生下一个值的时候恢复调用状态。

     1 <?php
     2 function gen_one_to_three() {
     3   for ($i = 1; $i <= 3; $i++) {
     4     //注意变量$i的值在不同的yield之间是保持传递的。
     5     yield $i;
     6   }
     7 }
     8 $generator = gen_one_to_three();
     9 foreach ($generator as $value) {
    10   echo "$value
    ";
    11 }
    12 var_dump($generator); //实际上是Generator对象
  • 相关阅读:
    了解 NoSQL 的必读资料
    关于什么时候用assert(断言)的思考
    这次见到了一些大侠
    NetBeans 时事通讯(刊号 # 87 Jan 12, 2010)
    动态链接库dll,静态链接库lib, 导入库lib
    新女性十得 写得了代码,查得出异常
    记录系统乱谈
    新女性十得 写得了代码,查得出异常
    fullpage.js禁止滚动
    RunningMapReduceExampleTFIDF hadoopclusternet This document describes how to run the TFIDF MapReduce example against ascii books. This project is for those who wants to experiment hadoop as a skunkworks in a small cluster (110 nodes) Google Pro
  • 原文地址:https://www.cnblogs.com/zhoutianyuan/p/11040468.html
Copyright © 2020-2023  润新知