专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

PHP实现观察者模式

最近写代码乏力,所以打算好好学习一下设计模式,本文当作是一个笔记了。 PHP内部提供了SplObserver、SplSubject和SplObjectStorage这三个接口,利用这些接口可以很方便的构建PHP观察者模式。

//使用SPL实现观察者模式
<?php
class Order implements SplSubject {
    private $observers;
    private $uid;
    private $goods_id;

    public function __construct($uid, $goods_id)
    {
        $this->uid = $uid;
        $this->goods_id = $goods_id;
        $this->observers = new SplObjectStorage();
    }

    public function attach(SplObserver $observer)
    {
        $this->observers->attach($observer);
    }

    public function detach(SplObserver $observer)
    {
        $this->observers->detach($observer);
    }

    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }

    public function order()
    {
        echo "make order ok...".PHP_EOL;
        echo '用户'.$this->uid.' 购买商品 '.$this->goods_id;
        $this->notify();
    }

    public function getUid()
    {
        return $this->uid;
    }
}

class SmsUser implements SplObserver {
//    private $uid;
//    private $content;
//    public function __construct($uid, $content)
//    {
//        $this->uid = $uid;
//        $this->content = $content;
//    }

    public function update(SplSubject $subject)
    {
//        var_dump(get_class($subject));
        $uid = $subject->getUid();
        echo "sending sms ...".PHP_EOL;
        echo "给用户".$uid.'发送短信内容'.PHP_EOL;
    }
}

class LogUser implements SplObserver {

    public function update(SplSubject $subject)
    {
        echo "loging....".PHP_EOL;
    }
}

$order = new Order('2849749330', 111);
$order->attach(new SmsUser());
$order->attach(new LogUser());
$order->order();

定义了一个订单类,下单后需要发送短信和LOG。

除了使用PHP 内置SPL接口实现观察者模式,还可以使用非SPL方式实现。 Subject参与者是一个抽象类而不是一个接口
用数组代替SplObjectStorage对象

abstract class Subject
{
    protected $observers = [];
    protected $stateNow;

    public function attachObserver(Observer $observer)
    {
        array_push($this->observers, $observer);
    }

    public function detachObserver(Observer $observer)
    {
        $position = 0;
        foreach ($this->observers as $viewer) {
            ++$position;
            if($observer == $viewer) {
                array_slice($this->observers, $position, 1);
            }
        }
    }

    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
}

class Order extends Subject
{
    protected $uid;
    protected $goods_id;

    public function __construct($uid, $goods_id)
    {
        $this->uid = $uid;
        $this->goods_id = $goods_id;
    }

    public function setState($stateSet)
    {
        $this->stateNow = $stateSet;
        $this->notify();
    }

    public function getState()
    {
        return $this->stateNow;
    }

    public function getUid()
    {
        return $this->uid;
    }

    public function makeOrder()
    {
        echo "make order ok...".PHP_EOL;
        echo '用户'.$this->uid.' 购买商品 '.$this->goods_id;
        $this->notify();
    }
}

interface Observer
{
    function update(Subject $subject);
}

class SmsUser implements Observer {

    public function update(Subject $subject)
    {
        $uid = $subject->getUid();
        echo "sending sms ...".PHP_EOL;
        echo "给用户".$uid.'发送短信内容'.PHP_EOL;
    }
}

class LogUser implements Observer {

    public function update(Subject $subject)
    {
        echo "loging....".PHP_EOL;
    }
}

$order = new Order('2849749330', 111);
$order->attachObserver(new SmsUser());
$order->attachObserver(new LogUser());
$order->makeOrder();
exit();

文章永久链接:https://tech.souyunku.com/45228

未经允许不得转载:搜云库技术团队 » PHP实现观察者模式

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们