使单例配置文件正确吗?

时间:2016-08-25 01:42:33

标签: php web

我创建了一个配置文件,其中只包含基本配置,例如路径和网址。为了避免多个实例在声明类时我创建了一个单例以确保配置文件类只有一个实例可重用,所以我可以在另一个类上使用它。这是对的吗?

如果该变量位于不同的类上,我还想避免多次更新变量值。有这种模式。我只能编辑一次根路径,并且所有使用此根路径变量的类都已更新,这与为具有相同根路径值的每个类创建一个局部变量不同。

class Configuration
{
    private static $instance;
    private $configurations = array( "root_path"         => "C:/xampp/htdocs/essentials",
                                     "root_url"          => "http://XXX.XXX.XXX.XXX/essentials",
                                     "global_class_path" => "/resources/scripts/php/global/classes/",
                                     "login_class_path"  => "/resources/scripts/php/login/classes/",
                                     "time_zone"         => "Asia/Manila" );

    /* Get the instance of the class */
    public static function getInstance()
    {
        if ( empty( static::$instance ) ) {
            static::$instance = new static();
        }

        return static::$instance;
    }

    /* Prevent creating of new instance if already existed */
    private function __construct() {}

    /* Prevent cloning of instance */
    private function __clone() {}

    /* Prevent unserializing of instance */
    private function __wakeup() {}

    public function getConfiguration( $configuration_id ) {
        return ( ( empty( $this->configurations[ $configuration_id ] ) )
               ? null
               : $this->configurations[ $configuration_id ] );
    }
}

1 个答案:

答案 0 :(得分:0)

解决方案的 corecness 问题首先需要深入了解我们正试图解决的问题。

首先,让我们检查一下您选择的解决方案,然后我们会更深入地研究这个问题。单例是一种旨在解决一个特定问题的设计模式:防止同一类的多个实例。这仅在创建该类的多个实例时会产生违反系统体系结构约束的问题。例如,将线程池作为典型用例,其中体系结构必须强加某些约束以防止严重故障。

现在,让我们通过稍微放大一点来检查您要通过此解决方案解决的问题。首先,重要的是要注意,通过创建像你在这里构建的约束来强加PHP的核心架构是非常困难的。由于PHP始终以相同的方式运行,因此从没有初始化类,没有定义的函数,没有定义的变量,没有共享内存,每个请求开始,然后实际上很难找到自己处于不是某种程度上你的错的位置现在有一个以上的实例。

为了防止系统出现严重故障,确切地说,您实际上并不是在阻止配置类的多个实例之后。当你的代码变得太复杂时,你所追求的就是防止自己犯错。

那么你能在这里犯下什么错误?如果您的配置类是只读的,我假定没有。 当代码在运行时对加载的配置进行永久性更改时,不应存在任何情况。那么在这种情况下,除了实例之外还有什么危害呢?

解决方案根本无法解决您要解决的潜在问题。