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 )
?>
首先回答你搭建一个完整动态网站的步骤:
1、首先你得搭建PHP运行环境。建议使用PHP开发速成搭建工具包xampp。集成php+phpmyadm+mysql
2、第二步,写需求,如图书管理系统。是否需要会员系统(会员是否分等级如普通、VIP分等级的话,那么有这些等级之间有什么差别)、是否需要文章发布、是否需要图书信息发布、是否需要在线购买书籍、是否要对书籍进行留言评论、是否要有在线试读。
3、针对上面列出的需求,进行数据库的表设计。表的设计要根据以上的需求来。
4、确定怎么对网站进行架构,因为这是一个系统了。是一个系统化的东西,而不是其中某一个小模块功能。你必须要对自己的网站来做一个架构。以使将来有可能网站进行功能模块增加、网站风格改版提供支持,如果只是单纯的PHP写法,将来网站维护改版会很麻烦的,前期一个好的系统架构很重要。这就是为什么很多好的程序员都会喜欢用自己熟悉的某一PHP框架来进行编程了。当然,你也可以自己构思自己的框架,当然这个是需要有对PHP这门语言相当熟练,在通过自己的理解,自己的需要编写适合自己或大众的框架。如zend framework 、thinphp、qeephp、smarty、cakephp等等,要知道一个好的框架不是一天就能写出来的,都是日积月累的。
5、程序实现了你自己的需求,然后就是测试了。测试,可以分的很细了。如数据完整性验证。数据有效性、操作步骤一致性、
6、以上则完成。
a. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;
工厂模式
它具有创建对象的某些方法。可以使用工厂类创建对象,而不直接使用 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" )
?>
另外四种是:观察者模式,单元素模式,命令链模式,策略模式。例子可以百度一搜。
状态模式属于对象创建型模式,其意图是允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了他的类。比较常见的例子是在一个表示网络连接的类TCPConnection,一个TCPConnection对象的状态处于若干不同的状态之一:连接已经建立(Established),正在监听,连接已经关闭(closed)。当一个TCPConnection对象收到其他对象的请求时,他根据自身的状态作出不同的反应。
== 才是判断值是否相等
=== 是在判断值是否相等的同时 还要类型相同的。。。
一般情况下用 ==
点击保存
1、内容入库。
2、内容替换公用配置文件,例如替换:公用配置文件config.php
$web_title="网站标题"
$web_key="网站关键词"
$web_desc="网站描述"
..................................
3.前台html页面,直接输出这些变量
这样就可以做到前后台的管理,而且每次不需要去查询数据库
统计,就是把基本的数据,整合起来。
用到sql的,有group by 功能,count功能,order by功能等等。
sql将收集的数据,进行统计分析。
一般情况下,sql处理后得到的数据,还要通过php的逻辑来进行整理。
以一定的格式,展示到前台。
一般都是以数组的方式展示,这也是数据结构的概念。
看这张图片,基本想想结构大概为
{上线数,出单总数,核过总数,总人均,总核率,{(坐席人1,工号1,出单数1,发货数1,核单率1),(坐席人2,工号2,出单数2,发货数2,核单率2)}}
如果用php展示成上面的结构的话,就很好处理了。
不过呢,通常初学在Windows下面就可以了。可以去网上下载集成环境来安装。比如说“AppServ”,很久很久以前我就是用的这个。
以我个人对PHP和粗浅认识,PHP和C在语法上的区别就是PHP的变量前面要加个$。
其余地方都是一样的。都要用大括号,都要用分号结尾。
当然PHP的功能没C强,而且PHP的部份函数和C也不一样。
ASP是用<%%>括起来的,PHP是用<??>或者<?php ?>括起来的。
至于说书嘛,我只有一本:《PHP5+MYSQL网站开发基础与应用》不知道你们当地有没有卖的。
我个人觉得你还要弄一下css和javascript。
你把只要动态的部分用php就行,内容太长可能是里面的引号出了问题。
比如你的html代码是这样
<html>
<body>
<a>77</a>
</body>
</html>
你的php代码写成这样就行,其它地方不变,问题就会出现得比较少
<html>
<body>
<a><?php
$i = 77
echo($i)?></a>
</body>
</html>