PHP设计模式

54 阅读1分钟

单例模式

单例模式,就是在程序中最多只有该类的一个实例存在(本身实例化),一旦创建,就会一直存在于内存。

  • 拥有一个构造函数,并且为private,防止类被实例化。
  • 拥有一个私有静态成员变量用来保存类的实例。
  • 拥有一个公开的能访问这个实例的静态方法。
  • 通常还有一个空的私有__clone,防止对象被复制。
<?php

/**
 * 单例模式
 */
class Singleton
{


    /**
     * 该属性用来保存实例
     * @var
     */
    private static $instance;

    /**
     * 创建一个用来实例化对象的方法
     * @return
     */
    public static function getInstance()
    {
        if (is_null(static::$instance)) {
            static::$instance = new static;
        }

        return static::$instance;
    }

    /**
     * 构造函数为private,防止创建对象
     */
    private function __construct()
    {
    }

    /**
     * 防止对象被复制
     */
    private function __clone()
    {
        trigger_error('Clone is not allowed !');
    }

    public function say()
    {
        return '单例模式';
    }
}

$say = Singleton::getInstance()->say();
echo $say; //单例模式

注册树模式

注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树拿下来使用。

Register.php

<?php

include('A.php');
include('B.php');

class Register
{

    /**
     * 注册树pool
     */
    private static $object = [];

    public static function set($key, $value)
    {
        self::$object[$key] = $value;

    }

    public static function get($key)
    {
        if (!isset(self::$object[$key])) {
            self::$object[$key] = new $key;
        }
        return self::$object[$key];
    }
}

$a = new A();
$b = new B();

Register::set('aa',$a);
Register::set('bb',$b);
echo Register::get('aa')->a();  //a

A.php

<?php
class A
{
    public function a()
    {
        return 'a';
    }
}

B.php

<?php
class B
{
    public function b()
    {
        return 'b';
    }
}