专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

php设计模式有哪些,php设计模式详解

来源:小易整编  作者:小易  发布时间:2022-12-26 06:33
摘要:php设计模式有哪些,php设计模式详解。PHP八大设计模式一、单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。1、$_instance必须声明为静态的私有变量2、构造函数和析构函...

php设计模式有哪些,php设计模式详解。PHP八大设计模式

php设计模式有哪些,php设计模式详解

一、 单例模式

解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过new建立实例对象的方法。

1、$_instance必须声明为静态的私有变量

2、构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义

3、getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用

4、::操作符只能访问静态变量和静态函数

5、new对象都会消耗内存

6、使用场景:最常用的地方是数据库连接。

7、使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。

8、私有的__clone()方法防止克隆对象

<?php class Singleton{    //私有属性,用于保存实例    private static $instance;    //构造方法私有化,防止外部创建实例    private function __construct(){}    //公有属性,用于测试    public $a;    //公有方法,用于获取实例    public static function getInstance(){        //判断实例有无创建,没有的话创建实例并返回,有的话直接返回        if(!(self::$instance instanceof self)){            self::$instance = new self();        }        return self::$instance;    }    //克隆方法私有化,防止复制实例    private function __clone(){} }

二、 工厂模式

工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。

<?php header('Content-Type:text/html;charset=utf-8'); /** *简单工厂模式(静态工厂方法模式) */ /** * Interface people 人类 */ interface  people {    public function  say(); } /** * Class man 继承people的男人类 */ class man implements people {    // 具体实现people的say方法    public function say()    {        echo '我是男人<br>';    } } /** * Class women 继承people的女人类 */ class women implements people {    // 具体实现people的say方法    public function say()    {        echo '我是女人<br>';    } } /** * Class SimpleFactoty 工厂类 */ class SimpleFactoty {    // 简单工厂里的静态方法-用于创建男人对象    static function createMan()    {        return new man();    }    // 简单工厂里的静态方法-用于创建女人对象    static function createWomen()    {        return new women();    } } /** * 具体调用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();

三、 注册模式

注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。

<?php class Register {    protected static  $objects;        function set($alias,$object)//将对象注册到全局的树上        {            self::$objects[$alias]=$object;//将对象放到树上        }        static function get($name){        return self::$objects[$name];//获取某个注册到树上的对象    }    function _unset($alias)  {        unset(self::$objects[$alias]);//移除某个注册到树上的对象。    } }

四、 适配器模式

将各种截然不同的函数接口封装成统一的API。PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。

首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。

接口 IDatabase <?php namespace IMooc; interface IDatabase {    function connect($host, $user, $passwd, $dbname);    function query($sql);    function close(); }

MYSQL

<?php namespace IMooc\Database; use IMooc\IDatabase; class MySQL implements IDatabase {    protected $conn;    function connect($host, $user, $passwd, $dbname)    {        $conn = mysql_connect($host, $user, $passwd);        mysql_select_db($dbname, $conn);        $this->conn = $conn;    }    function query($sql)    {        $res = mysql_query($sql, $this->conn);        return $res;    }    function close()    {        mysql_close($this->conn);    } }

MYSQLi

<?php
namespace IMooc\Database;
use IMooc\IDatabase;
class MySQLi implements IDatabase
{
    protected $conn;
    function connect($host, $user, $passwd, $dbname)
    {
        $conn = mysqli_connect($host, $user, $passwd, $dbname);
        $this->conn = $conn;
    }
    function query($sql)
    {
        return mysqli_query($this->conn, $sql);
    }
    function close()
    {
        mysqli_close($this->conn);
    }
}

PDO

<?php namespace IMooc\Database; use IMooc\IDatabase; class PDO implements IDatabase {    protected $conn;    function connect($host, $user, $passwd, $dbname)    {        $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd);        $this->conn = $conn;    } function query($sql)    {        return $this->conn->query($sql);    }    function close()    {        unset($this->conn);    } }

通过以上案例,PHP与MySQL的数据库交互有三套API,在不同的场景下可能使用不同的API,那么开发好的代码,换一个环境,可能就要改变它的数据库API,那么就要改写所有的代码,使用适配器模式之后,就可以使用统一的API去屏蔽底层的API差异带来的环境改变之后需要改写代码的问题。

五、 策略模式

策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。

首先声明策略的接口文件,约定了策略的包含的行为。然后,定义各个具体的策略实现类。

<?php    abstract class baseAgent { //抽象策略类        abstract function PrintPage();    }    //用于客户端是IE时调用的类(环境角色)    class ieAgent extends baseAgent {        function PrintPage() {            return 'IE';        }    }    //用于客户端不是IE时调用的类(环境角色)    class otherAgent extends baseAgent {        function PrintPage() {            return 'not IE';        }    }    class Browser { //具体策略角色        public function call($object) {                return $object->PrintPage ();            }        }        $bro = new Browser ();    echo $bro->call ( new ieAgent () ); ?>

六、 观察者模式

1、观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。

2、场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。

3、观察者模式实现了低耦合,非侵入式的通知与更新机制。

定义一个事件触发抽象类

EventGenerator.php <?php require_once 'Loader.php'; abstract class EventGenerator{    private $observers = array();        function addObserver(Observer $observer){        $this->observers[]=$observer;    }    function notify(){        foreach ($this->observers as $observer){            $observer->update();        }    } }

定义一个观察者接口

Observer.php
<?php
require_once 'Loader.php';
interface Observer{
    function update();//这里就是在事件发生后要执行的逻辑
}
//一个实现了EventGenerator抽象类的类,用于具体定义某个发生的事件

实现

require 'Loader.php';
class Event extends EventGenerator{
    function triger(){
        echo "Event<br>";
    }
}
class Observer1 implements Observer{
    function update(){
        echo "逻辑1<br>";
    }
}
class Observer2 implements Observer{
    function update(){
        echo "逻辑2<br>";
    }
}
$event = new Event();
$event->addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->triger();
$event->notify();

七、原型模式

原型模式(对象克隆以避免创建对象时的消耗)

1、与工厂模式类似,都是用来创建对象。

2、与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象。这样就免去了类创建

3、原型模式适用于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,原型模式仅需要内存拷贝即可。

八、装饰器模式

1、装饰器模式,可以动态的添加修改类的功能

2、一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重写实现类的方法

3、使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大额灵活性。


本文地址:百科问答频道 https://www.neebe.cn/wenda/886390.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • phpMyAdmin是什么意思?

    phpMyAdmin是什么意思?

    phpMyAdmin是一个用PHP编写的MySQL的管理界面程序,它通过Web浏览器实现MySQL的管理,操作MySQL数据库更加容易,不必使用命令行。phpMyAdmin的功能很强大,能实现MySQL的各种管理操作,能够执行SQ...

  • phpstorm怎么配置php环境,PhpStorm如何配置php的环境

    phpstorm怎么配置php环境,PhpStorm如何配置php的环境

    phpstorm怎么配置php环境,PhpStorm如何配置php的环境前言PhpStorm配置php环境前期准备下载并安装好PhpStorm软件下载php+apache并安装好,或者直接安装wamp、phpstudy等一键环境都是可以的确...

  • php下载安装教程,php下载安装详细介绍

    php下载安装教程,php下载安装详细介绍

    php下载安装教程,php下载安装详细介绍一、PHP环境安装流程  说明:最近在搭建个人网站,环境有用到PHP,特此记录。本文安装案例是以PHP8.0.0版本为示例,「开始安装前建议先将第三步骤抛出异常的依赖安装,这样安装的时候就无需逐个解...

  • 小偷程序源码,php小偷程序实例代码

    小偷程序源码,php小偷程序实例代码

    小偷程序源码,php小偷程序实例代码小偷程序其实就是利用了php中的一特定函数实现采集别人网站的内容,然后通过正则分析把我们想要的内容保存到自己本地数据库了,下面我来介绍php小偷程序的实现方法,有需要的朋友可参考。在下面采集数据过程中fi...

  • php四舍五入函数(php四舍五入方法)

    php四舍五入函数(php四舍五入方法)

    php四舍五入函数(php四舍五入方法)经常用到取整的函数,今天小小的总结一下!其实很简单,就是几个函数而已~~主要是:ceil,floor,round,intval.一、ceil- 进一法取整floatceil(floatvalue)返回...

  • phpstudy怎么安装,phpstudy使用教程

    phpstudy怎么安装,phpstudy使用教程

    phpstudy怎么安装,phpstudy使用教程百度搜索phpstudy官网进行下载安装。配置我们在完成安装之后还不能马上进行正常的使用,我们打开刚安装好的php,点击启动WNMP,然后点击启动Apache和MySQL(我在点击启动WAM...

  • thinkphp框架漏洞总结

    thinkphp框架漏洞总结

    ThinkPHP框架漏洞总结Thinkphp简介ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPH...

  • php递归函数的例子,php递归函数用法详解

    php递归函数的例子,php递归函数用法详解

    php递归函数的例子,php递归函数用法详解,有关php递归函数的用法,分享几个php递归函数的例子,在php编程中,使用递归进行函数调用很常见,递归函数用的好,可以提高代码效率,通过例子学习php递归函数的使用。...

  • 周排行
  • 月排行
  • 年排行

精彩推荐