PHP get_instance /了解Singleton模式

时间:2011-03-24 01:11:30

标签: php singleton

我玩过CodeIgniter,为了扩展我的PHP知识,我试图创建自己的框架。

我遇到的问题是我想要一个等效的CodeIgniter get_instance()函数。但通过我的所有搜索,我无法理解它,也不知道我是否在正确的背景下使用它。

我相信我正在寻找的是单身人士模式,但我无法弄清楚如何实施它,所以任何人都可以帮助我吗?

我希望能够从内容函数中访问框架的$ page变量。

[我希望感谢这是一个简化版本,我的编码通常比这更好..]

编辑前:

  <?php

    class Framework {
        // Variables
        public $page;

        function __construct()
        {

            // For simplicity's sake..
            $this->page->title = 'Page title';
            $this->page->content->h1 = 'This is a heading';
            $this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';

            $this->output();

        }

        function output()
        {

            function content($id)
            {

                // I want to get an instance of $this
                // To read and edit variables
                echo $this->page->content->$id;
            }

            ?>
    <html>
    <head>
        <title><?php echo $this->page->title ?></title>
    </head>

    <body>
        <h1><?php content('h1') ?></h1>
        <?php content('body') ?>
    </body>
    </html>
            <?php
        }

    }

    new Framework;

编辑后:

<?php

class Framework {
    // Variables
    public $page;

    public static function get_instance()
    {
        static $instance;
        $class = __CLASS__;
        if( ! $instance instanceof $class) {
            $instance = new $class;
        }
        return $instance;
    }

    function __construct()
    {

        // For simplicity's sake..
        $this->page->title = 'Page title';
        $this->page->content->h1 = 'This is a heading';
        $this->page->content->body = '<p>Lorem ipsum dolor sit amet..</p>';

        $this->output();

    }

    function output()
    {

        function content($id)
        {
            $FW = Framework::get_instance();
            // I want to get an instance of $this
            // To read and edit variables
            echo $FW->page->content->$id;
        }

        ?>
<html>
<head>
    <title><?php echo $this->page->title ?></title>
</head>

<body>
    <h1><?php content('h1') ?></h1>
    <?php content('body') ?>
</body>
</html>
        <?php
    }

}

new Framework;

2 个答案:

答案 0 :(得分:4)

get instance 方法通常就像这样....

public static function getInstance() {
  static $instance;
  $class = __CLASS__;

  if ( ! $instance instanceof $class) {
     $instance = new $class;
  }

  return $instance;
}
  1. 设置一个静态变量,使用static关键字保存状态。
  2. 设置一个指向类的变量(使维护更容易)。
  3. 检查$instance是否是此类中的实例化对象。
  4. 如果不是,那么我们从这个类中实例化一个新对象。
  5. 返回我们刚制作的新对象或现有对象。
  6. 所以调用Class::getInstance()会在第一次调用时返回一个新对象,subsequent calls will return the existing object

    单身人士常常因为一些原因而感到不满,Wikipedia covers them rather well ......

      

    这种模式使得单元测试远远不够   更难,因为它介绍   全球国家进入申请。

         

    有   还应该注意这种模式   降低了并行性的可能性   在一个程序内,因为访问   多线程中的单例   上下文必须序列化,例如,通过   锁定。

         

    依赖的倡导者   注射会认为这是一个   反模式,主要是由于其使用   私有和静态方法。

         有些人有   建议的方法来打破   单身模式使用方法等   作为语言中的反映   Java或PHP。

答案 1 :(得分:0)

使用PHP在单例模式上找到了一篇非常好的文章。这家伙在解释它时做得很好:http://phpadvocate.com/blog/?p=211