好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php用设计模式 php设计原则

很多站长朋友们都不太清楚php用设计模式,今天小编就来给大家整理php用设计模式,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 PHP有哪几种设计模式? 2、 php设计模式介绍之迭代器模式 3、 php多端登录用什么设计模式 4、 PHP设计模式有哪些 PHP有哪几种设计模式?

PHP 一般有五种常见的设计模式

工厂模式

工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

例如:

<?php

interface IUser

{

function getName();

}

class User implements IUser

{

public function __construct( $id ) { }

public function getName()

{

return "Jack";

}

}

class UserFactory

{

public static function Create( $id )

{

return new User( $id );

}

}

$uo = UserFactory::Create( 1 );

echo( $uo->getName()."\n" );

?>

单元素模式

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。

例如:

<?php

require_once("DB.php");

class DatabaseConnection

{

public static function get()

{

static $db = null;

if ( $db == null )

$db = new DatabaseConnection();

return $db;

}

private $_handle = null;

private function __construct()

{

$dsn = 'mysql://root:password@localhost/photos';

$this->_handle = DB::Connect( $dsn, array() );

}

public function handle()

{

return $this->_handle;

}

}

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );

print( "Handle = ".DatabaseConnection::get()->handle()."\n" );

?>

观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

例如:

<?php

interface IObserver

{

function onChanged( $sender, $args );

}

interface IObservable

{

function addObserver( $observer );

}

class UserList implements IObservable

{

private $_observers = array();

public function addCustomer( $name )

{

foreach( $this->_observers as $obs )

$obs->onChanged( $this, $name );

}

public function addObserver( $observer )

{

$this->_observers []= $observer;

}

}

class UserListLogger implements IObserver

{

public function onChanged( $sender, $args )

{

echo( "'$args' added to user list\n" );

}

}

$ul = new UserList();

$ul->addObserver( new UserListLogger() );

$ul->addCustomer( "Jack" );

?>

命令链模式

命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。

例如:

<?php

interface ICommand

{

function onCommand( $name, $args );

}

class CommandChain

{

private $_commands = array();

public function addCommand( $cmd )

{

$this->_commands []= $cmd;

}

public function runCommand( $name, $args )

{

foreach( $this->_commands as $cmd )

{

if ( $cmd->onCommand( $name, $args ) )

return;

}

}

}

class UserCommand implements ICommand

{

public function onCommand( $name, $args )

{

if ( $name != 'addUser' ) return false;

echo( "UserCommand handling 'addUser'\n" );

return true;

}

}

class MailCommand implements ICommand

{

public function onCommand( $name, $args )

{

if ( $name != 'mail' ) return false;

echo( "MailCommand handling 'mail'\n" );

return true;

}

}

$cc = new CommandChain();

$cc->addCommand( new UserCommand() );

$cc->addCommand( new MailCommand() );

$cc->runCommand( 'addUser', null );

$cc->runCommand( 'mail', null );

?>

策略模式

我们讲述的最后一个设计模式是策略 模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

例如:

<?php

interface IStrategy

{

function filter( $record );

}

class FindAfterStrategy implements IStrategy

{

private $_name;

public function __construct( $name )

{

$this->_name = $name;

}

public function filter( $record )

{

return strcmp( $this->_name, $record ) <= 0;

}

}

class RandomStrategy implements IStrategy

{

public function filter( $record )

{

return rand( 0, 1 ) >= 0.5;

}

}

class UserList

{

private $_list = array();

public function __construct( $names )

{

if ( $names != null )

{

foreach( $names as $name )

{

$this->_list []= $name;

}

}

}

public function add( $name )

{

$this->_list []= $name;

}

public function find( $filter )

{

$recs = array();

foreach( $this->_list as $user )

{

if ( $filter->filter( $user ) )

$recs []= $user;

}

return $recs;

}

}

$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );

$f1 = $ul->find( new FindAfterStrategy( "J" ) );

print_r( $f1 );

$f2 = $ul->find( new RandomStrategy() );

print_r( $f2 );

?>

php设计模式介绍之迭代器模式

《PHP设计模式介绍》第八章 迭代器模式

类中的面向对象编程封装应用逻辑 类 就是实例化的对象 每个单独的对象都有一个特定的身份和状态 单独的对象是一种组织代码的有用方法 但通常你会处理一组对象或者集合

属性来自 SQL 查询的一组数据就是一个集合 就像本书前面章节介绍的 Monopoly 游戏示例的对象列表

集合不一定是均一的 图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu Slider 和 Button 并且 集合的实现可以有多种方式 PHP 数字是一个集合 但也是一个散列表 一个链接列表 一个堆栈以及队列

问题

如何操纵任意的对象集合?

解决方案

使用迭代器模式来提供对集合内容的统一存取

你可能没有意识到这一点 但你每天都在使用迭代器模式 - 它潜藏在 PHP 的数组类型和各种数组操作函数中 (其实 给你一些固有类的数组的组合和一群用这些固有类工作的可变函数 你将不得不使用这些数组来处理对象集合 这是在 PHP 中的本地数组迭代

$test  =  array( one   o   three );$output  =  ; reset($test); do  {$output  =  current($test);}  while  (next($test));echo  $output;  //  produces  oneothree

reset() 函数将迭代重新转到数组的开始 current() 返回当前元素的值 next() 则前进至数组中的下一个元素并返回新的 current() 值 当你超出数组的最后一个元素时 next() 返回 false 使用这些迭代方法 PHP 数组的内部实现就与你不相关了 迭代器结合了封装和多态的面向对象程序设计原理 使用迭代器 你可以对集合中的对象进行操作 而无需专门了解集合如何显现或者集合包含什么(对象的种类) 迭代器提供了不同固定迭代实现的统一接口 它完全包含了如何操纵特定集合的详细信息 包括显示哪些项(过滤)及其显示顺序(排序)

让我们创建一个简单的对象 在数组中对它进行操作 (尽管该示例在 PHP 环境下 但迭代器并不特定于 PHP 虽然添加了较多的引用操作符 本章节中的大多数示例在 PHP 下也能够运行) 对象 Lendable 表示诸如电影 相册等媒体 它作为 Web 站点的一部分或服务 允许用户浏览或将他们的媒体集合分享给其他用户 (对        于该示例 请无需考虑其他方面 )让我们开始下面对 Lendable 基础设计的测试

//  PHP class  LendableTestCase  extends  UnitTestCase  {function  TestCheckout()  {$item  =  new  Lendable;$this >assertFalse($item >borrower);$item >checkout( John );$this >assertEqual( borrowed   $item >status);$this >assertEqual( John   $item >borrower);}function  TestCheckin()  {$item  =  new  Lendable;$item >checkout( John );$item >checkin();$this >assertEqual( library   $item >status);$this >assertFalse($item >borrower);}}

要实现这一最初测试的需求 我们来创建一个带有若干公共属性和一些方法的类 来触发这些属性的值

class  Lendable  {public  $status  =  library ;public  $borrower  =  ;public  function  checkout($borrower)  {$this >status  =  borrowed ;$this >borrower  =  $borrower;}public  function  checkin()  {$this >status  =  library ;$this >borrower  =  ;}}

Lendable 是一个好的 普通的开端 让我们将它扩展到诸如 DVD 或 CD 的磁道项 媒体扩展了 Lendable 并且磁道详细记录了特定媒体的详细信息 包括项目的名称 发布的年份以及项本身的类型

class  Media  extends  Lendable  {public  $name; public  $type; public  $year;public  function  __construct($name   $year   $type= dvd )  {$this >name  =  $name;$this >type  =  $type;$this >year  =  (int)$year;}}

要使事情更加简单 媒体有三个公共的实例变量 Media::name Media::year 和Media::type 构造函数采用了两个参数 将第一个存储在 $name 中 第二个存储在 $year 中 构造函数还允许可选的第三个参数来指定类型(缺省为dvd)

给定单独的对象来操作 你现在可以创建一个容器来包含他们 Library 类似于常用的库 Library 应该能够添加 删除和计算集合中的项 甚至 Library 还应该允许访问集合(本章中的样本代码部分可看到示例)中的单一的项(对象)

我们开始构建 Library 的测试用例

class  LibraryTestCase  extends  UnitTestCase  {function  TestCount()  {$lib  =  new  Library;$this >assertEqual(   $lib >count());}}

它是满足这一测试的简单类

class  Library  {function  count()  {return  ;}}

继续将一些有趣的功能添加到测试中

class  LibraryTestCase  extends  UnitTestCase  {function  TestCount()  {  /*    */  }function  TestAdd()  {$lib  =  new  Library;$lib >add( one );$this >assertEqual(   $lib >count());}}

实现 add() 的简单方法是建立在 PHP 灵活数组函数的基础上 你可以将项添加到实例变量并使用 count() 来返回集合众项的数量

class  Library  {protected  $collection  =  array();function  count()  {return  count($this >collection);}function  add($item)  {$this >collection[]  =  $item;}}

lishixinzhi/Article/program/net/201311/13092

php多端登录用什么设计模式

观察者设计模式。

用户登录,需要写日志,送积分,参与活动等使用消息队列,把用户和日志,积分,活动之间解耦合。

观察者模式是挺常见的一种设计模式,使用得当会给程序带来非常大的便利,使用得不当,会给后来人一种难以维护的想法。

PHP设计模式有哪些

1.工厂模式

工厂模式是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

2.单元素模式

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

3.观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可 以相互对话,而不必了解原因。

4.命令链模式

命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。

5.策略模式

我们讲述的最后一个设计模式是策略 模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎 的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个 类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

关于php用设计模式的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php用设计模式 php设计原则的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did197823
更新时间:2023-04-26   阅读:23次

上一篇: php截取字符里的数字 php 截取字符

下一篇:php结尾视频教程 php结束语句

最新资料更新

  • 1.php项目基本流程 php项目如何运行
  • 2.PHP没有前景吗 php现在怎么样
  • 3.php中catch的简单介绍
  • 4.php5.2cgi的简单介绍
  • 5.php文本转字节 php字符转换成数字
  • 6.php用户资料转移 php迁移java
  • 7.phpgetrows的简单介绍
  • 8.修改php网页链接 怎么修改php网页
  • 9.ubuntuphp启动 ubuntu开机启动python
  • 10.phpping测速 测试php性能工具
  • 11.phpajax日历 php如何生成一年的日历
  • 12.phphint插件下载 php 插件系统
  • 13.phpjson提交 phppost提交
  • 14.hbuilder写php hbuilder写PHP
  • 15.php语法基础csdn php语言基础
  • 16.php_syntax的简单介绍
  • 17.php系统源代码下载 php源码免费下载
  • 18.php脚本在线解密 php解密网站程序源码
  • 19.php余数1 php math
  • 20.PHP安装宽带办理 php网站安装

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]