探索PHP设计模式,如何通过源码实例提升编程技能?

PHP设计模式源码

PHP设计模式是一种在软件工程中常用的编程技巧,用于解决常见的软件设计问题,以下是一些常见的PHP设计模式及其源码示例:

探索PHP设计模式,如何通过源码实例提升编程技能?插图1
(图片来源网络,侵删)

单例模式(Singleton)

单例模式确保一个类只有一个实例,并提供全局访问点。

class Singleton
{
    private static $instance = null;
    private function __construct()
    {
        // 防止通过反射或序列化创建新的实例
        if (self::$instance) {
            throw new Exception("Cannot instantiate singleton class");
        }
    }
    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
    private function __clone() {}
    private function __wakeup() {}
}
// 使用示例
$singleton1 = Singleton::getInstance();
$singleton2 = Singleton::getInstance();
if ($singleton1 === $singleton2) {
    echo "Singleton works!";
} else {
    echo "Singleton failed!";
}

工厂模式(Factory Method)

工厂模式用于创建对象,而不直接使用new关键字,这使得代码更易于测试和扩展。

interface Product
{
    public function operation(): string;
}
class ConcreteProductA implements Product
{
    public function operation(): string
    {
        return "ConcreteProductA";
    }
}
class ConcreteProductB implements Product
{
    public function operation(): string
    {
        return "ConcreteProductB";
    }
}
class Creator
{
    public static function factoryMethod(string $type): Product
    {
        switch ($type) {
            case 'A':
                return new ConcreteProductA();
            case 'B':
                return new ConcreteProductB();
            default:
                throw new Exception("Invalid type");
        }
    }
}
// 使用示例
$productA = Creator::factoryMethod('A');
$productB = Creator::factoryMethod('B');
echo $productA->operation(); // 输出: ConcreteProductA
echo $productB->operation(); // 输出: ConcreteProductB

观察者模式(Observer)

探索PHP设计模式,如何通过源码实例提升编程技能?插图3
(图片来源网络,侵删)

观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

interface Observer
{
    public function update(Subject $subject);
}
interface Subject
{
    public function registerObserver(Observer $observer);
    public function removeObserver(Observer $observer);
    public function notifyObservers();
}
class ConcreteSubject implements Subject
{
    private $observers = [];
    private $state;
    public function registerObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }
    public function removeObserver(Observer $observer)
    {
        $index = array_search($observer, $this->observers);
        if ($index !== false) {
            unset($this->observers[$index]);
        }
    }
    public function notifyObservers()
    {
        foreach ($this->observers as $observer) {
            $observer->update($this);
        }
    }
    public function setState($state)
    {
        $this->state = $state;
        $this->notifyObservers();
    }
}
class ConcreteObserver implements Observer
{
    public function update(Subject $subject)
    {
        echo "Observer updated with state: " . $subject->getState() . "n";
    }
}
// 使用示例
$subject = new ConcreteSubject();
$observer1 = new ConcreteObserver();
$observer2 = new ConcreteObserver();
$subject->registerObserver($observer1);
$subject->registerObserver($observer2);
$subject->setState("New State"); // 输出: Observer updated with state: New State (两次)

到此,以上就是小编对于php设计模式 源码 _PHP的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

探索PHP设计模式,如何通过源码实例提升编程技能?插图5
(图片来源网络,侵删)

本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/65908.html

(0)
上一篇 2024年10月2日 14:01
下一篇 2024年10月2日 14:11

相关推荐