• 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对象
  • 相关阅读:
    web之用FileUpload上传文件
    利用LinQ技术和lambd表达式进行增删改查
    weibform中Application、ViewState对象和分页
    webform中Session和Cookies对象的用法、登录保持
    点击input框弹出输入法 ,底部footer内容就会被顶上去的问题
    实现input密码框显示/隐藏的功能
    Elasticsearch 入门
    svn 提示错误 :Failed to run the WC DB work queue associated with 解决办法
    provider:命名管道提供程序,error:40
    ECMAScript (Javascript)位运算符
  • 原文地址:https://www.cnblogs.com/zhoutianyuan/p/11040468.html
Copyright © 2020-2023  润新知