Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';管理单身汉的最佳方法是什么?_Php_Design Patterns_Singleton - Fatal编程技术网

Php 什么';管理单身汉的最佳方法是什么?

Php 什么';管理单身汉的最佳方法是什么?,php,design-patterns,singleton,Php,Design Patterns,Singleton,我正在摆弄不同的PHP日志框架。我目前正在尝试PEAR::Log。我想我应该使用它的singleton函数来确保这个类只有一个实例 我有一个类似守护进程的小脚本,我想添加日志记录,因为它可能是系统中最简单的测试脚本。这个脚本有几个功能。我可能想在函数中记录一些东西 我的问题是如何最好地管理这个单身汉 给我打电话: &Log::singleton($handler, $name, $ident, $conf, $maxLevel); 在每个函数中似乎都不理想,特别是因为我已经在初始调用中

我正在摆弄不同的PHP日志框架。我目前正在尝试PEAR::Log。我想我应该使用它的
singleton
函数来确保这个类只有一个实例

我有一个类似守护进程的小脚本,我想添加日志记录,因为它可能是系统中最简单的测试脚本。这个脚本有几个功能。我可能想在函数中记录一些东西

我的问题是如何最好地管理这个单身汉

给我打电话:

&Log::singleton($handler, $name, $ident, $conf, $maxLevel);
在每个函数中似乎都不理想,特别是因为我已经在初始调用中指定了所有选项。日志序列化了这些信息,但从外观上看,您仍然必须提供所有这些变量才能获得实例

另一种选择是将实例传递到每个函数中。再一次,这似乎不太理想

我想您也可以将该实例设置为“全局”


在这种情况下你会怎么做?有更好的解决方案吗

我对PEAR::Log了解不多,但为什么不创建另一个包装/简化日志的单例呢

class Logger {

    private static $log;

    private function __construct() { }

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function get() {
        return self::$log;
    }

}
使用
Log
实例初始化
Logger
后,您可以通过
Logger::get
访问它。因为在PHP中取消引用是可能的,所以您可以这样做

Logger::get()->doSomething($foo, $bar);

我对PEAR::Log了解不多,但为什么不创建另一个包装/简化日志的单例呢

class Logger {

    private static $log;

    private function __construct() { }

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function get() {
        return self::$log;
    }

}
使用
Log
实例初始化
Logger
后,您可以通过
Logger::get
访问它。因为在PHP中取消引用是可能的,所以您可以这样做

Logger::get()->doSomething($foo, $bar);

只需使用一个全局实例。你必须在某个地方有一个所有其他文件都必须包含的文件。只是在那里实例化它。如果您对全局变量有异议,您可能不应该使用PHP编程。

只需使用全局实例即可。你必须在某个地方有一个所有其他文件都必须包含的文件。只是在那里实例化它。如果您对全局变量有异议,您可能不应该使用PHP编程。

如果您的最终目标是能够盲目调用

Logger::Write("Something happened");
无论你在哪里需要它,你都可以进一步使用Michal的解决方案

class Logger {
    private static $log = null;

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function Write(String $str) {
        if($log == null)
            init(Log::singleton(...));

        $this->log->Write($str);
    }
}

这样,您的日志将在第一次使用时初始化一次。

如果您的最终目标是能够盲目调用

Logger::Write("Something happened");
无论你在哪里需要它,你都可以进一步使用Michal的解决方案

class Logger {
    private static $log = null;

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function Write(String $str) {
        if($log == null)
            init(Log::singleton(...));

        $this->log->Write($str);
    }
}
这样,您的日志将在第一次使用时初始化一次

另一种选择是将实例传递到每个函数中。再一次,它似乎不太理想

基本上,您可以选择为每个函数、每个对象实例或一个全局范围传递依赖项。我发现使用对象实例范围通常能很好地平衡灵活性。通常,您应该尽可能地限制变量的范围,因此,如果有意义的话,可以通过各种方式传递函数参数

另一种选择是将实例传递到每个函数中。再一次,它似乎不太理想


基本上,您可以选择为每个函数、每个对象实例或一个全局范围传递依赖项。我发现使用对象实例范围通常能很好地平衡灵活性。通常,您应该尽可能地限制变量的范围,因此,如果有意义的话,可以通过各种方式传递函数参数。

单例可以是特定于名称空间的(即5.3之前的“前缀类”),而全局变量不能这样做。当你包含一个使用全局变量的库时,它总是很好的…如果他在写一个库,谨慎是好的。但对于我自己的非库代码,我更喜欢可读性$LOGGER->foo()比LOGGER::get()->foo()好得多。在我的版本中,可以使用一个小类禁用记录器:类NoLogger{public function}uuuu get(){}public function}uuuu call(){};一个单例可以是特定于名称空间的(即5.3之前的“前缀类”),这是全局变量不能接受的。当你包含一个使用全局变量的库时,它总是很好的…如果他在写一个库,谨慎是好的。但对于我自己的非库代码,我更喜欢可读性$LOGGER->foo()比LOGGER::get()->foo()好得多。在我的版本中,可以使用一个小类禁用记录器:类NoLogger{public function}uuuu get(){}public function}uuuu call(){};