PHP各种设计模式代码示例

一、单例模式

<?php
class Singleton {
    private static $_instance = null;

    // 构造方法私有化
    private function __construct() {}

    // 提供一个public方法供外部调用,以获取实例对象
    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    // 防止克隆实例
    public function __clone() {
        exit('Clone is not allowed:' . E_USER_ERROR);
    }

    // 防止通过序列化/反序列化的方式创建新实例
    public function __sleep() {
        exit('Serialize is not allowed');
    }
}
?>

二、简单工厂/静态工厂模式

注:这两种不属于23种设计模式

<?php
class Button {/* ...*/}
class WinButton extends Button {/* ...*/}
class MacButton extends Button {/* ...*/}

interface ButtonFactory {
    public function createButton($type);
}

class MyButtonFactory implements ButtonFactory {
    // 实现工厂方法
    // 将这个方法改为静态方法,就由「简单工厂模式」变成了「静态工厂模式」
    public function createButton($type) {
        switch($type) {
            case 'Mac':
                return new MacButton();
            case 'Win':
                return new WinButton();
        }
    }
}
?>

三、工厂模式

<?php
class Button {}
class MacButton extends Button {}
class WinButton extends Button {}

interface AbstractFactory {
    public function createButton();
}

class MacFactory implements AbstractFactory {
    public function createButton() {
        return new MacButton();
    
}

class WinFactory implements AbstractFactory {
    public function createButton() {
        return new WinButton();
    }
}
?>

四、抽象工厂模式

<?php
class Button {}
class Border {}
class MacButton extends Button {}
class WinButton extends Button {}
class MacBorder extends Border {}
class WinBorder extends Border {}

interface AbstractFactory {
    public function createButton();
    public function createBorder();
}

class MacFactory implements AbstractFactory {
    public function createButton() {
        return new MacButton();
    }
    public function createBorder() {
        return new MacBorder();
    }
}

class WinFactory implements AbstractFactory {
    public function createButton() {
        return new WinButton();
    }
    public function createBorder() {
        return new WinBorder();
    }
}
?>

五、观察者模式

ProducerA类负责生产消息
ConsumerAConsumerB负责消费消息

<?php

class Message
{
    public $senderName; // 消息发送者名称
    public $payload; // 消息内容
}

interface IConsumer
{
    public function onReceive(Message $msg);
}

abstract class AbstractProducer
{
    /**
     * 消息生产者名字
     *
     * @var string
     */
    private $name;

    /**
     * 消息消费者数组
     *
     * @var IConsumer[]
     */
    private $consumerList = [];

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    /**
     * 添加消费者
     *
     * @param IConsumer $consumer
     *
     * @return void
     */
    public function add(IConsumer $consumer)
    {
        $this->consumerList[] = $consumer;
    }

    /**
     * 生产消息
     *
     * @param string $msg
     *
     * @return void
     */
    public function produce(string $msg)
    {
        $msgObj = new Message();
        $msgObj->senderName = $this->name;
        $msgObj->payload = $msg;
        foreach ($this->consumerList as $consumer) {
            $consumer->onReceive($msgObj);
        }
    }
}

class ConsumerA implements IConsumer
{
    public function onReceive(Message $msg)
    {
        echo "ConsumerA receive message: " . json_encode($msg) . "\n";
    }
}

class ConsumerB implements IConsumer
{
    public function onReceive(Message $msg)
    {
        echo "ConsumerB receive message: " . json_encode($msg) . "\n";
    }
}

class ProducerA extends AbstractProducer
{
    public function __construct()
    {
        parent::__construct('ProducerA');
    }
}

$producerA = new ProducerA();
$producerA->add(new ConsumerA());
$producerA->add(new ConsumerB());
$producerA->produce('Hello World');
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
  Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。   Smarty 3.1.9 更新日志:   - 修正提取()和显示()与相对路径(104期)   - 修正错误的治疗“0000-00-00”0作为在modifier.date_format的(第103)   Smarty优点:   1.速度:采用Smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。   2.编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)   3.缓存技术:Smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时,在Smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。   4.插件技术:Smarty可以自定义插件。插件实际就是一些自定义的函数。   5.模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。   不适合使用Smarty的地方:   1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,导致经常重新编译模板,所以这类型的程序使用Smarty会使模板处理速度变慢。   2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用Smarty会在一定程度上丧失PHP开发迅速的优点。 我的网站一直在用,大家有兴趣的可以去看下,www.gg265.net和www.fmrpg.com。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值