ホームページ > php教程 > PHP开发 > PHP設計パターン登録ツリーパターン

PHP設計パターン登録ツリーパターン

高洛峰
リリース: 2016-11-16 10:04:05
オリジナル
1279 人が閲覧しました

はじめに

登録ツリー モードは、登録モードまたはレジストラ モードとも呼ばれます。登録ツリー パターンは、オブジェクト インスタンスをグローバル オブジェクト ツリーに登録し、必要に応じてオブジェクト ツリーから選択するパターン設計方法です。果樹と違って果物は一度しか採れませんが、登録した木のインスタンスは何度でも採ることができます。

登録ツリー モードを使用すると、インスタンスをより適切に調整および管理できるようになり、グローバル変数を使用するのと同じくらい便利で実用的です。

実装

詳細はコードのコメントを参照してください

コード:

<?php
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
/**
 * Class Register 注册树类
 */
class Register
{
    // 树的枝干-用于储存树上的果实(实例)
    public static $objects;

    /**
     * 将实例插入注册树中
     *
     * @param $alias 对象别名-注册树中的名称
     * @param $object 对象实例
     */
    public static function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }

    /**
     * 从注册树中读取实例
     *
     * @param $alias 对象别名-注册树中的名称
     *
     * @return mixed 返回的对象实例
     */
    public static function get($alias)
    {
        if (isset(self::$objects[$alias])) {
            return self::$objects[$alias];
        } else {
            echo &#39;您要找的对象实例不存在哦<br>&#39;;
        }

    }

    /**
     * 销毁注册树中的实例
     *
     * @param $alias 对象别名-注册树中的名称
     */
    public static function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

/**
 * Class demo 演示类
 */
class demo
{
    /*
     * 测试方法
     */
    public function test()
    {
        echo &#39;看这里看这里<br><br>&#39;;
    }
}

// 实例化测试类,获取对象实例
$demo = new demo();
// 注册到树上
$tree = Register::set(&#39;de&#39;, $demo);
// 取出来
$de_true = Register::get(&#39;de&#39;);
// 测试
$de_true->test();
// 销毁
Register::_unset(&#39;de&#39;);
// 尝试再次取出来
$de_true_two = Register::get(&#39;de&#39;);
// 尝试再次测试
$de_true_two->test();
ログイン後にコピー

実行結果:

// 第一次成功运行
看这里看这里
// 第二次销毁后找不到对象实例
您要找的对象实例不存在哦
// 第二次销毁后找不到对象实例,故无法调用对象方法,报错
Fatal error: Call to a member function test() on a non-object in E:\phpStudy\WWW\test\test.php on line 77
ログイン後にコピー

拡張機能

上記はビルド方法を示しています。例を通して登録ツリー パターンを理解すれば、誰もが理解できるはずです。登録ツリー モード、ファクトリー モード、シングルトン モードを組み合わせて、コードの実装方法を見てみましょう

コード:

<?php
header(&#39;Content-Type:text/html;charset=utf-8&#39;);
/**
 * Class Register 注册树类
 */
class Register
{
    // 树的枝干-用于储存树上的果实(实例)
    public static $objects;

    /**
     * 将实例插入注册树中
     *
     * @param $alias 对象别名-注册树中的名称
     * @param $object 对象实例
     */
    public static function set($alias, $object)
    {
        self::$objects[$alias] = $object;
    }

    /**
     * 从注册树中读取实例
     *
     * @param $alias 对象别名-注册树中的名称
     *
     * @return mixed 返回的对象实例
     */
    public static function get($alias)
    {
        if (isset(self::$objects[$alias])) {
            return self::$objects[$alias];
        } else {
            echo &#39;您要找的对象实例不存在哦<br>&#39;;
        }

    }

    /**
     * 销毁注册树中的实例
     *
     * @param $alias 对象别名-注册树中的名称
     */
    public static function _unset($alias)
    {
        unset(self::$objects[$alias]);
    }
}

/**
 * Class demo 单例演示类
 */
class singleDemo
{
    // 存放实例属性
    public static $_instance;
    public $content;

    // 私有化构造函数,防止外部new
    private function __construct($content)
    {
        $this->content = $content;
    }

    // 获取实例
    public static function getInstance($content)
    {
        // 判断实例是否存在
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self($content);
        }
        return self::$_instance;
    }

    // 私有化克隆方法,防止克隆
    private function __clone()
    {

    }

    // 测试方法
    public function test()
    {
        echo $this->content.&#39;<br>&#39;;
    }

}

/**
 * Class factory 工厂类
 */
class Factory
{
    // 生产
    public static function create($content)
    {
        // 返回对象
        return singleDemo::getInstance($content);
    }
}

// 生产并返回对象实例
$object = Factory::create(&#39;我是content参数内容,哈哈&#39;);
// 执行测试方法
$object->test();
ログイン後にコピー

実行結果:

我是content参数内容,哈哈
ログイン後にコピー


関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート