【问题标题】:OOP singleton validation to see it doesn't create more than 1 instanceOOP 单例验证以查看它不会创建超过 1 个实例
【发布时间】:2014-04-11 09:07:50
【问题描述】:

我在下面创建了 Singleton 类,但我怎么知道只创建了一个实例。我该如何测试它?另外,self::$instance = new FileProcessor()self::$instance = new static() 之间有什么区别或者我应该使用哪一个?

谢谢

class FileProcessor
{
    protected static $instance = null;

    public static function get_instance()
    {
        if (self::$instance === null)
        {
            self::$instance = new FileProcessor();
            //self::$instance = new static();
        }

        return self::$instance;
    }
}

$obj_1 = FileProcessor::get_instance();
echo '<pre>'; print_r($obj_1);

$obj_2 = FileProcessor::get_instance();
echo '<pre>'; print_r($obj_2);

输出

FileProcessor Object
(
)
FileProcessor Object
(
)

【问题讨论】:

    标签: php oop singleton


    【解决方案1】:

    理想情况下,您一开始不会使用单例模式。相反,您依赖注入一个FileProcessor 的实例给所有需要它的东西。这意味着您的应用程序中所有需要FileProcessor 的地方都不会“自己获取”,而是从更高的权威机构接收。而不是:

    function foo() {
        $fp = FileProcessor::getInstance();
        ...
    }
    

    你会的:

    function foo(FileProcessor $fp) {
        ...
    }
    

    这使您可以精确地实例化一个FileProcessor 并将其注入到需要的任何地方。这使您可以完全控制其使用。您可以将其与注册表/依赖注入容器模式结合使用,以简化依赖管理。

    【讨论】:

    • 感谢您让我大开眼界。如何更改我的示例以使用您的第二个功能?
    • 您展示的所有代码都涉及实例化单例。你基本上删除了所有这些。然后你只需留下一个$obj_1 = new FileProcessor; 并将$obj_1 传递给每个需要它的函数和类。
    • 顺便说一句,您可能也对此感兴趣:How Not To Kill Your Testability Using Statics
    • 是这样吗?class FileProcessor { //Whatever } $obj = new FileProcessor; function foo($obj) { echo '&lt;pre&gt;'; var_dump($obj); } foo($obj);
    • 没错。我还将类型提示 FileProcessor $obj 添加到 function foo,如我的答案所示。
    【解决方案2】:

    var_dump 函数可以让你查看对象的内容。 这段代码演示了对象实际上是相同的:

    <?php
    class FileProcessor
    {
        protected static $instance = null;
        private $arr = array();
    
        public static function get_instance()
        {
            if (self::$instance === null)
            {
                self::$instance = new FileProcessor();
                //self::$instance = new static();
            }
    
            return self::$instance;
        }
    
        public function set($key, $value)
        {
        $this->arr[$key] = $value;
        }
    }
    
    $obj_1 = FileProcessor::get_instance();
    $obj_1->set('this-is-key', 'this-is-value');
    echo '<pre>'; var_dump($obj_1);
    
    $obj_2 = FileProcessor::get_instance();
    echo '<pre>'; var_dump($obj_2);
    

    【讨论】:

    • 感谢您的示例。 +1
    【解决方案3】:

    您可以使用=== 运算符比较结果。在你的情况下: 如果两个对象都引用同一个实例,$obj_1 === $obj_2 将返回 true。更多信息在这里:http://www.php.net/manual/en/language.oop5.object-comparison.php。这里也是使用new static() 的一个很好的解释:New self vs. new static

    【讨论】:

    • 感谢您提供查看差异的链接。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多