搜索
首页后端开发php教程php 设计模式,设计模式_PHP教程

php 设计模式,设计模式

几个模式简述:

1、工厂模式

工厂模式 是一种类,它具有为您创建对象的某些方法。

您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。  

系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。

您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。

2、单元素模式

某些应用程序资源是独占的,因为有且只有一个此类型的资源。

例如,通过数据库句柄到数据库的连接是独占的。

您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

3、观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。

该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。

当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可 以相互对话,而不必了解原因。

4、命令链模式

命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。

每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。

5、策略模式

我们讲述的最后一个设计模式是策略 模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。

例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。

思考一下搜索引擎 的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。

在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个 类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

常用模式详解:

1、 单例模式(三私一公)

①、私有的构造方法 (访问控制:防止外部代码使用new操作符创建对象,单例类不能在其他类中实例化,只能被其自身实例化)

②、私有的静态属性 (拥有一个保存类的实例的静态成员变量)

③、私有的克隆方法 (拥有一个访问这个实例的公共的静态方法,常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)

④、公有的静态方法 (防止对象被复制)

所谓单例模式,也就是在任何时候,应用程序中只会有这个类的一个实例存在。

常见的,我们用到单例模式只让一个对象去访问数据库,从而防止打开多个数据库连接。

要实现一个单例类应包括以下几点:

和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private。 

要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。

因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实例的公共静态方法。 

在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为基提供一个空的私有__clone()方法。 

下面是一个基本的单例模式:

class SingetonBasic {

    private static $instance;

    private function __construct() {

        // do construct..

    }

    private function __clone() {}

    public static function getInstance() {

        if (!(self::$instance instanceof self)) {

            self::$instance = new self();

        }

        return self::$instance;

}

}

$a = SingetonBasic::getInstance();

$b = SingetonBasic::getInstance();

var_dump($a === $b);

2、工厂模式

工厂模式在于可以根据输入参数或者应用程序配置的不同来创建一种专门用来实现化并返回其它类的实例的类。下面是一个最基本的工厂模式:

class FactoryBasic {

    public static function create($config) {

    }

}

比如这里是一个描述形状对象的工厂,它希望根据传入的参数个数不同来创建不同的形状。

// 定义形状的公共功能:获取周长和面积。

interface IShape {

    function getCircum();

    function getArea();

}

// 定义矩形类

class Rectangle implements IShape {

    private $width, $height;

    public function __construct($width, $height) {

        $this->width = $width;

        $this->height = $height;

    }

    public function getCircum() {

        return 2 * ($this->width + $this->height);

    }

    public function getArea() {

        return $this->width * $this->height;

    }

}

// 定义圆类

class Circle implements IShape {

    private $radii;

    public function __construct($radii) {

        $this->radii = $radii;

    }

    public function getCircum() {

        return 2 * M_PI * $this->radii;

    }

    public function getArea() {

        return M_PI * pow($this->radii, 2);

    }

}

// 根据传入的参数个数不同来创建不同的形状。

class FactoryShape {

    public static function create() {

        switch (func_num_args()) {

            case 1:

                return new Circle(func_get_arg(0));

                break;

            case 2:

                return new Rectangle(func_get_arg(0), func_get_arg(1));

                break;

        }

    }

}

// 矩形对象

$c = FactoryShape::create(4, 2);

var_dump($c->getArea());

// 圆对象

$o = FactoryShape::create(2);

var_dump($o->getArea());

使用工厂模式使得在调用方法时变得更容易,因为它只有一个类和一个方法,若没有使用工厂模式,则要在调用时决定应该调用哪个类和哪个方法;

使用工厂模式还使得未来对应用程序做改变时更加容易,比如要增加一种形状的支持,只需要修改工厂类中的create()一个方法,而没有使用工厂模式,则要修改调用形状的代码块。

3、观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。

该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)使本身变得可观察。

当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

一个简单的示例:当听众在收听电台时(即电台加入一个新听众),它将发送出一条提示消息,通过发送消息的日志观察者可以观察这些消息。

// 观察者接口

interface IObserver {

    function onListen($sender, $args);

    function getName();

}

// 可被观察接口

interface IObservable {

    function addObserver($observer);

    function removeObserver($observer_name);

}

// 观察者类

abstract class Observer implements IObserver {

    protected $name;

    public function getName() {

        return $this->name;

    }

}

// 可被观察类

class Observable implements IObservable {

    protected $observers = array();

    public function addObserver($observer) {

        if (!($observer instanceof IObserver)) {

            return;

        }

        $this->observers[] = $observer;

    }

    public function removeObserver($observer_name) {

        foreach ($this->observers as $index => $observer) {

            if ($observer->getName() === $observer_name) {

                array_splice($this->observers, $index, 1);

                return;

            }

        }

    }

}

// 模拟一个可以被观察的类:RadioStation

class RadioStation extends Observable {

    public function addListener($listener) {

        foreach ($this->observers as $observer) {

            $observer->onListen($this, $listener);

        }

    }

}

// 模拟一个观察者类

class RadioStationLogger extends Observer {

    protected $name = 'logger';

    public function onListen($sender, $args) {

        echo $args, ' join the radiostation.
';

    }

}

// 模拟另外一个观察者类

class OtherObserver extends Observer {

    protected $name = 'other';

    public function onListen($sender, $args) {

        echo 'other observer..
';

    }

}

$rs = new RadioStation();

// 注入观察者

$rs->addObserver(new RadioStationLogger());

$rs->addObserver(new OtherObserver());

// 移除观察者

$rs->removeObserver('other');

// 可以看到观察到的信息

$rs->addListener('cctv');

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/989816.htmlTechArticlephp 设计模式,设计模式 几个模式简述: 1、工厂模式 工厂模式是一种类,它具有为您创建对象的某些方法。 您可以使用工厂类创建对象,...
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
哪些常见问题会导致PHP会话失败?哪些常见问题会导致PHP会话失败?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置错误、Cookie问题和Session过期。1.配置错误:检查并设置正确的session.save_path。2.Cookie问题:确保Cookie设置正确。3.Session过期:调整session.gc_maxlifetime值以延长会话时间。

您如何在PHP中调试与会话相关的问题?您如何在PHP中调试与会话相关的问题?Apr 25, 2025 am 12:12 AM

在PHP中调试会话问题的方法包括:1.检查会话是否正确启动;2.验证会话ID的传递;3.检查会话数据的存储和读取;4.查看服务器配置。通过输出会话ID和数据、查看会话文件内容等方法,可以有效诊断和解决会话相关的问题。

如果session_start()被多次调用会发生什么?如果session_start()被多次调用会发生什么?Apr 25, 2025 am 12:06 AM

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

您如何在PHP中配置会话寿命?您如何在PHP中配置会话寿命?Apr 25, 2025 am 12:05 AM

在PHP中配置会话生命周期可以通过设置session.gc_maxlifetime和session.cookie_lifetime来实现。1)session.gc_maxlifetime控制服务器端会话数据的存活时间,2)session.cookie_lifetime控制客户端cookie的生命周期,设置为0时cookie在浏览器关闭时过期。

使用数据库存储会话的优点是什么?使用数据库存储会话的优点是什么?Apr 24, 2025 am 12:16 AM

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

您如何在PHP中实现自定义会话处理?您如何在PHP中实现自定义会话处理?Apr 24, 2025 am 12:16 AM

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

什么是会话ID?什么是会话ID?Apr 24, 2025 am 12:13 AM

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

您如何在无状态环境(例如API)中处理会议?您如何在无状态环境(例如API)中处理会议?Apr 24, 2025 am 12:12 AM

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能