建材秒知道
登录
建材号 > 设计 > 正文

PHP有哪几种设计模式

冷艳的羊
懵懂的楼房
2022-12-31 01:04:26

PHP有哪几种设计模式?

最佳答案
懵懂的航空
温柔的鞋垫
2026-03-24 19:43:35

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 )

?>

最新回答
闪闪的棒棒糖
幸福的荷花
2026-03-24 19:43:35

首先回答你搭建一个完整动态网站的步骤:

1、首先你得搭建PHP运行环境。建议使用PHP开发速成搭建工具包xampp。集成php+phpmyadm+mysql

2、第二步,写需求,如图书管理系统。是否需要会员系统(会员是否分等级如普通、VIP分等级的话,那么有这些等级之间有什么差别)、是否需要文章发布、是否需要图书信息发布、是否需要在线购买书籍、是否要对书籍进行留言评论、是否要有在线试读。

3、针对上面列出的需求,进行数据库的表设计。表的设计要根据以上的需求来。

4、确定怎么对网站进行架构,因为这是一个系统了。是一个系统化的东西,而不是其中某一个小模块功能。你必须要对自己的网站来做一个架构。以使将来有可能网站进行功能模块增加、网站风格改版提供支持,如果只是单纯的PHP写法,将来网站维护改版会很麻烦的,前期一个好的系统架构很重要。这就是为什么很多好的程序员都会喜欢用自己熟悉的某一PHP框架来进行编程了。当然,你也可以自己构思自己的框架,当然这个是需要有对PHP这门语言相当熟练,在通过自己的理解,自己的需要编写适合自己或大众的框架。如zend framework 、thinphp、qeephp、smarty、cakephp等等,要知道一个好的框架不是一天就能写出来的,都是日积月累的。

5、程序实现了你自己的需求,然后就是测试了。测试,可以分的很细了。如数据完整性验证。数据有效性、操作步骤一致性、

6、以上则完成。

聪明的季节
大气的流沙
2026-03-24 19:43:35
1、单例模式:PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,因此PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:

a. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;

机灵的飞机
顺心的小蚂蚁
2026-03-24 19:43:35
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" )

?>

另外四种是:观察者模式,单元素模式,命令链模式,策略模式。例子可以百度一搜。

深情的红牛
简单的超短裙
2026-03-24 19:43:35
状态state模式是GOF23种模式中的一种,和命令模式一样,也是一种行为模式。状态模式和命令模式相当像,一样是“接口—实现类”这种模式的应用,是面向接口编程原则的体现。

状态模式属于对象创建型模式,其意图是允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类。比较常见的例子是在一个表示网络连接的类TCPConnection,一个TCPConnection对象的状态处于若干不同的状态之一:连接已经建立(Established),正在监听,连接已经关闭(closed)。当一个TCPConnection对象收到其他对象的请求时,他根据自身的状态作出不同的反应。

喜悦的秀发
忐忑的山水
2026-03-24 19:43:35
注意 = 是赋值的意思 所以你的判断他永远都为true 所以都输出了1111

== 才是判断值是否相等

=== 是在判断值是否相等的同时 还要类型相同的。。。

一般情况下用 ==

懵懂的小伙
眯眯眼的短靴
2026-03-24 19:43:35
一般对于这种设置的思路是:

点击保存

1、内容入库。

2、内容替换公用配置文件,例如替换:公用配置文件config.php

$web_title="网站标题"

$web_key="网站关键词"

$web_desc="网站描述"

..................................

3.前台html页面,直接输出这些变量

这样就可以做到前后台的管理,而且每次不需要去查询数据库

执着的镜子
花痴的网络
2026-03-24 19:43:35

统计,就是把基本的数据,整合起来。

用到sql的,有group by 功能,count功能,order by功能等等。

sql将收集的数据,进行统计分析。

一般情况下,sql处理后得到的数据,还要通过php的逻辑来进行整理。

以一定的格式,展示到前台。

一般都是以数组的方式展示,这也是数据结构的概念。

看这张图片,基本想想结构大概为

{上线数,出单总数,核过总数,总人均,总核率,{(坐席人1,工号1,出单数1,发货数1,核单率1),(坐席人2,工号2,出单数2,发货数2,核单率2)}}

如果用php展示成上面的结构的话,就很好处理了。

兴奋的悟空
耍酷的糖豆
2026-03-24 19:43:35
首先补充一下楼上的回答:如果楼主说的是数据库的话,php一般是和mysql数据库结合的。服务呢用Apache,操作系统呢就用Linux。这就是你以后经常都可能会看到的“LAMP”了。

不过呢,通常初学在Windows下面就可以了。可以去网上下载集成环境来安装。比如说“AppServ”,很久很久以前我就是用的这个。

以我个人对PHP和粗浅认识,PHP和C在语法上的区别就是PHP的变量前面要加个$。

其余地方都是一样的。都要用大括号,都要用分号结尾。

当然PHP的功能没C强,而且PHP的部份函数和C也不一样。

ASP是用<%%>括起来的,PHP是用<??>或者<?php ?>括起来的。

至于说书嘛,我只有一本:《PHP5+MYSQL网站开发基础与应用》不知道你们当地有没有卖的。

我个人觉得你还要弄一下css和javascript。

儒雅的玉米
紧张的凉面
2026-03-24 19:43:35
php的页面其实就是html的页面,只是把部分内容动态化而已啊

你把只要动态的部分用php就行,内容太长可能是里面的引号出了问题。

比如你的html代码是这样

<html>

<body>

<a>77</a>

</body>

</html>

你的php代码写成这样就行,其它地方不变,问题就会出现得比较少

<html>

<body>

<a><?php

$i = 77

echo($i)?></a>

</body>

</html>