php中注册器形式类用法实例深入分析,完整实战

PHP实战创建型模式

  • 单例模式

  • 工厂模式

  • 抽象工厂模式

  • 原型模式

  • 建造者模式

<h1 align="center">Easy Tips</h1>

本文实例讲述了php中注册器模式类用法。分享给大家供大家参考,具体如下:

一、安装phpunit

➜ wget https://phar.phpunit.de/phpunit.phar //最新版本支持 PHP 7.0, 和 PHP 7.1
➜ wget https://phar.phpunit.de/phpunit-5.7.phar //支持于 PHP 5.6, PHP 7.0 和 PHP 7.1,PHPUnit 5 将于2018年02月02日结束维护支持,目前还是建议使用5.7版本

➜ chmod x phpunit-5.7.phar

➜ sudo mv phpunit-5.7.phar /usr/local/bin/phpunit

➜ phpunit --version

PHP实战结构型模式

  • 桥接模式

  • 享元模式

  • 外观模式

  • 适配器模式

  • 装饰器模式

  • 组合模式

  • 代理模式

  • 过滤器模式

<p align="center">
<a href=";
  <img src="" alt="php">
</a>
<a href=";
  <img src="" alt="mysql">
</a>
<a href=";
  <img src="" alt="redis">
</a>
<a href=";
  <img src="" alt="patterns">
</a>
<a href=";
  <img src="" alt="algorithm">
</a>
<a href=";
  <img src="" alt="data-structure">
</a>
<a href=";
  <img src="" alt="network">
</a>
</p>

注册器读写类
Registry.class.php

二、搭建测试项目

本次测试项目的目录结构如下

├── phpunit.xml
├── src
│   ├── autoload.php
│   ├── Money.php
└── tests
    └── MoneyTest.php

自动载入代码

<?php

function __autoload($class){
    include $class.'.php';
}

spl_autoload_register('__autoload');

项目代码在src/Money.php

<?php

class Money
{
    public $amount;

    public function __construct($amount)
    {
        $this->amount = $amount;
    }

    public function getAmount()
    {
        return $this->amount;
    }

    public function negate()
    {
        return new Money(-1*$this->amount);
    }
}

与之对应的单元测试是tests目录下的MoneyTest.php,注意单元测试文件名以*Test.php,这样以后指定tests目录便可以执行目录下的所有测试。

<?php

class MoneyTest extends PHPUnit_Framework_TestCase
{
    public function testCanBeNegated()
    {
        $a = new Money(1);

        $b = $a->negate();

        $this->assertEquals(-1, $b->getAmount());
    }
}

PHP实战行为型模式

  • 模板模式

  • 策略模式

  • 状态模式

  • 观察者模式

  • 责任链模式

  • 访问者模式

  • 解释器模式

  • 备忘录模式

  • 命令模式

  • 迭代器模式

  • 中介者器模式

  • 空对象模式

23种设计模式都提供测试用例,使用方法:

  • 克隆项目: git clone git@github.com:TIGERB/easy-tips.git

  • 运行脚本: php patterns/[文件夹名称]/test.php,例如测试责任链模式: 运行 php patterns/chainOfResponsibility/test.php

运行结果:请求5850c8354b298: 令牌校验通过~ 请求5850c8354b298: 请求频率校验通过~ 请求5850c8354b298: 参数校验通过~ 请求5850c8354b298: 签名校验通过~ 请求5850c8354b298: 权限校验通过~

原文: PHP:一个极速轻量级的PHP全栈框架

<br>

<?php
/** 
 * 注册器读写类 
 */
class Registry extends ArrayObject
{
  /** 
   * Registry实例
   *
   * @var object 
   */
  private static $_instance = null;
  /**
   * 取得Registry实例
   * 
   * @note 单件模式
   * 
   * @return object
   */
  public static function getInstance()
  {
    if (self::$_instance === null) {
      self::$_instance = new self();
      echo "new register object!";
    }
    return self::$_instance;
  }
  /**
   * 保存一项内容到注册表中
   * 
   * @param string $name 索引
   * @param mixed $value 数据
   * 
   * @return void
   */
  public static function set($name, $value)
  {
    self::getInstance()->offsetSet($name, $value);
  }
  /**
   * 取得注册表中某项内容的值
   * 
   * @param string $name 索引
   * 
   * @return mixed
   */
  public static function get($name)
  {
    $instance = self::getInstance();
    if (!$instance->offsetExists($name)) {
      return null;
    }
    return $instance->offsetGet($name);
  }
  /**
   * 检查一个索引是否存在 
   * 
   * @param string $name 索引
   * 
   * @return boolean
   */
  public static function isRegistered($name)
  {
    return self::getInstance()->offsetExists($name);
  }
  /**
   * 删除注册表中的指定项
   * 
   * @param string $name 索引
   * 
   * @return void
   */
  public static function remove($name)
  {
    self::getInstance()->offsetUnset($name);
  }
}

三、实战

  • 快速体验

经过第二部测试项目的搭建,我们可以运行底下的命令快速查看测试结果

1、第一种方式

phpunit --bootstrap src/Money.php tests/MoneyTest.php

#运行结果
[root@s2 auto_test]# phpunit --bootstrap src/Money.php tests/MoneyTest.php 
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.
.                                                                   1 / 1 (100%)
Time: 94 ms, Memory: 12.00MB

OK (1 test, 1 assertion)

2、第二种方式

#第二种方式跟第一种基本一样,只不过是变成是自动引入
phpunit --bootstrap src/autoload.php tests/MoneyTest

#运行结果
[root@s2 auto_test]# phpunit --bootstrap src/autoload.php tests/MoneyTest
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.
.                                                                   1 / 1 (100%)

Time: 87 ms, Memory: 12.00MB

OK (1 test, 1 assertion)

3、第三种方式

#如果要执行MoneyTest,在项目根目录下执行:
phpunit tests/MoneyTest

#如果要执行tests目录下的所有测试,在项目根目录下执行:
phpunit tests

4、第四种方式
虽然可以自动载入,但是要执行的命令更长了。我们还可以写一个配置文件来为项目指定bootstrap,这样就不用每次都写在命令里了

#展示了一个最小化的 phpunit.xml 例子,它将在递归遍历 tests 时添加所有在 *Test.php 文件中找到的 *Test 类
<phpunit bootstrap="src/autoload.php">
    <testsuites>
        <testsuite name="money">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

#指定文件测试顺序
<phpunit bootstrap="src/autoload.php">
    <testsuites>
        <testsuite name="money">
            <file>tests/HelloTest.php</file>
            <file>tests/MoneyTest.php</file>
            <file>tests/SiteTest.php</file>
        </testsuite>
    </testsuites>
</phpunit>

github 地址 https://github.com/BGGANF/phpunit.git

> 一个php技术栈后端猿的知识储备大纲

需要注册的类
 
test.class.php

## 前言

<?php
class Test
{
   function hello()
   {
    echo "hello world";
    return;
   }
} 
?>

为什么把php,mysql,redis放在前三位?因为php/mysql/redis基础是一个当代phper的根基。

测试 test.php

## 备注

<?php
//引入相关类
require_once "Registry.class.php";
require_once "test.class.php";
//new a object
$test=new Test();
//$test->hello();
//注册对象
Registry::set('testclass',$test);
//取出对象
$t = Registry::get('testclass');
//调用对象方法
$t->hello();
?>
状态        含义
not-start 当前未开始总结
doing     总结中
α         目前仅供参考未修正和发布
done      总结完毕
fixing    查漏补缺修改中

希望本文所述对大家php程序设计有所帮助。

## 目录

您可能感兴趣的文章:

  • php基础设计模式大全(注册树模式、工厂模式、单列模式)
  • 详解PHP中的状态模式编程
  • 简单介绍PHP的责任链编程模式
  • PHP基于工厂模式实现的计算器实例
  • PHP单例模式详细介绍
  • PHP设计模式之适配器模式代码实例
  • PHP设计模式之装饰者模式代码实例
  • 解决ThinkPHP关闭调试模式时报错的问题汇总
  • php单例模式实现方法分析
  • php设计模式之单例模式实例分析
  • php单例模式示例分享
  • PHP(doing)

  - 符合PSR的PHP编程规范(含个人建议)

    - [实例]()
    - [文档]()
    - [经验]()

  - 基础知识[读(R)好(T)文(F)档(M)]

    - [数据类型]()
    - [运算符优先级]()
    - [string函数]()
    - [array函数]()
    - [math函数]()
    - [面向对象]()
    - 版本新特性

      - [7.1]()
      - [7.0]()
      - [5.6]()
      - [5.5]()
      - [5.4]()
      - [5.3]()

  - [记一些坑]()

  • Mysql(doing)

  - [常用sql语句]()
  - 引擎
    - InnoDB
    - MyISAM
    - Memory
    - ArchiveBlackholeCSVFederatedmergeNDB
  - 事务隔离级别
    - READ UNCOMMITTED:未提交读
    - READ COMMITTED:提交读/不可重复读
    - REPEATABLE READ:可重复读(MYSQL默认事务隔离级别)
    - SERIALIZEABLE:可串行化
  - 索引
    - B-Tree
    - 哈希索引(hash index)
    - 空间数据索引(R-Tree)
    - 全文索引
  - 锁
    - 悲观锁
    - 乐观锁
  - 分表
    - 垂直分表
    - 水平分表
  - sql优化
  - 主从配置

  • Redis(doing)

  - 常用命令
  - 实现原理&与memcache区别
  - 常见使用场景实战
    - [缓存]()
    - [队列]()
    - [悲观锁]()
    - [乐观锁]()
    - [订阅/推送]()

  • 设计模式(done/fixing)

  - [概念]()

  - 创建型模式实例

    - [单例模式]()
    - [工厂模式]()
    - [抽象工厂模式]()
    - [原型模式]()
    - [建造者模式]()

  - 结构型模式实例

    - [桥接模式]()
    - [享元模式]()
    - [外观模式]()
    - [适配器模式]()
    - [装饰器模式]()
    - [组合模式]()
    - [代理模式]()
    - [过滤器模式]()

  - 行为型模式实例

    - [模板模式]()
    - [策略模式]()
    - [状态模式]()
    - [观察者模式]()
    - [责任链模式]()
    - [访问者模式]()
    - [解释器模式]()
    - [备忘录模式]()
    - [命令模式]()
    - [迭代器模式]()
    - [中介者器模式]()
    - [空对象模式]()

- [数据结构(doing)]()

  - 数组
  - 堆/栈
  - 树
  - 队列
  - 链表
  - 图
  - 散列表

  • 算法(doing)

  - 算法分析

    - 时间复杂度/空间复杂度/正确性/可读性/健壮性

  - 算法实战

    - 排序算法(α)

      - [冒泡排序]()
      - [快速排序]()
      - [选择排序]()
      - [插入排序]()
      - [归并排序]()
      - [希尔排序]()
      - [基数排序]()

  • 网络基础(doing)

  - [互联网协议概述]()
  - [client和nginx简易交互过程]()
  - [nginx和php-fpm简易交互过程]()
  - [http]()
    - 报文
      - 报文头部
      - 报文体
    - 常见13种状态码
    - 方法method
    - https
    - http2
    - websocket

  • 计算机基础(doing)

  - [linux常用命令]()
  - shell

  • 高并发相关(not-start)

## 测试用例

### 设计模式

运行脚本: php patterns/[文件夹名称]/test.php

```
例如,

测试责任链模式: 运行 php patterns/chainOfResponsibility/test.php

运行结果:

请求5850c8354b298: 令牌校验通过~
请求5850c8354b298: 请求频率校验通过~
请求5850c8354b298: 参数校验通过~
请求5850c8354b298: 签名校验通过~
请求5850c8354b298: 权限校验通过~
```

### 算法

运行脚本: php algorithm/test.php [算法名称|空获取列表]

```
例如,

测试冒泡排序: 运行 php algorithm/test.php bubble

运行结果:

==========================冒泡排序=========================
Array
(
    [0] => 11
    [1] => 67
    [2] => 3
    [3] => 121
    [4] => 71
    [5] => 6
    [6] => 100
    [7] => 45
    [8] => 2
)
=========上为初始值==================下为排序后值=============
Array
(
    [0] => 2
    [1] => 3
    [2] => 6
    [3] => 11
    [4] => 45
    [5] => 67
    [6] => 71
    [7] => 100
    [8] => 121
)
```

### 常见redis运用实现

运行脚本: php redis/test.php [名称|空获取列表]

```
例如,

测试悲观锁: 运行 php redis/test.php p-lock

运行结果:

执行count加1操作~

count值为:1

```

## 纠错

如果大家发现有什么不对的地方,可以发起一个[issue]( request](),
我会及时纠正,THX~

> 补充:发起pull request的commit message请参考文章[Commit message编写指南]()

## 英文版

因为国外开发者的要求和个人的时间有限,征集大家有兴趣的可以把本项目进行英文版翻译。希望国外的developer也可以受益于这个项目~

翻译文件认领申请:<;

## 感谢

感谢以下朋友的issue或pull request:

  • @[faynwol]()
  • @[whahuzhihao]()
  • @[snriud]()
  • @[fhefh2015]()
  • @[RJustice]()
  • @[ooing]()
  • @[shellus]()
  • @[entimm]()
  • @[jealone]()
  • @[cugblbs]()
  • @[CmderQ]()
  • @[neetdai]()
  • @[yangqiphp]()

本文由星彩网app下载发布于计算机编程,转载请注明出处:php中注册器形式类用法实例深入分析,完整实战

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。