如何在PHP 5.6版中使用全局常量而不是类常量

如何在PHP 5.6版中使用全局常量而不是类常量,php,constants,monolog,class-constants,Php,Constants,Monolog,Class Constants,我正在使用创建我的应用程序的日志系统。在核心应用程序文件中,创建新的Monolog对象后,我需要选择要在日志文件中打印的日志级别。我想使用一个全局常量LOG\u LEVEL,它可以是'DEBUG','INFO',等等。我需要Monolog类将其值作为类常量处理 // content of config.php // Here I declare the constants in a separate file called 'config.php' define("LOG_FILE", "pat

我正在使用创建我的应用程序的日志系统。在核心应用程序文件中,创建新的Monolog对象后,我需要选择要在日志文件中打印的日志级别。我想使用一个全局常量
LOG\u LEVEL
,它可以是'DEBUG','INFO',等等。我需要Monolog类将其值作为类常量处理

// content of config.php
// Here I declare the constants in a separate file called 'config.php'
define("LOG_FILE", "patch/to/my/log.log");
define("LOG_LEVEL", "ERROR");

// content of app.php
require 'config.php';
require 'vendor/autoload.php';

$container['logger'] = function($c) {
    $logger = new \Monolog\Logger('logger');
    error_log('log level ' . LOG_LEVEL); // prints 'log level ERROR'

    $fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::LOG_LEVEL); // here I get the error 'Undefined class constant LOG_LEVEL'
    //the normal syntax would be '$logger::ERROR' in this case and that works fine

    $logger->pushHandler($fileHandler);
    return $logger;
};

我需要将“LOG_LEVEL”常量用作monolog类的“ERROR”,而不是“LOG_LEVEL”。我在这里做错了什么,已经搜索了几个小时的答案而没有任何运气。

您也可以像下面这样使用
Logger::getLevels()

$log_level = $logger->getLevels()[LOG_LEVEL];
$fileHandler = new ...StreamHandler(LOG_FILE, $log_level);

您现在正在执行
$logger::LOG\u LEVEL
,这将从类中删除“LOG\u LEVEL”,无论
$logger
是哪个(在本例中是
\monog\logger
)。它没有名为LOG_LEVEL的静态变量,因此得到了未定义的变量。
您刚刚定义了任何类之外的“日志级别”,因此:

 $fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, LOG_LEVEL); 

奇特的解决方案:

您可以创建一个静态类,并将其包含在主页中:

Class CONFIG {
    public static $LOG_LEVEL = 'default Value';
}

// Then you can use this anywhere:
CONFIG::$LOG_LEVEL
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, CONFIG::$LOG_LEVEL); 

这样做的好处是只有一个用于配置的文件,而不是分散在所有类型的文件中,这将很快变得非常烦人。

创建一个静态类并包含该类

class GLOBALCONF{
    public static $VALUE= 'Something in here';
}

// Use it where you want
GLOBALCONF::$VALUE

你让事情变得比需要的更复杂了。Monolog将错误级别转换为字符串,并转换为其自身的内部值。只需将代码更改为:

$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::toMonologLevel(LOG_LEVEL));

dang u更快^^^,但他们不想传递字符串值“ERROR”。如果
LOG\u FILE
设置为“ERROR”,则他们希望传递
$logger::ERROR
。基本上,他们需要变量,但需要常数。(我想)现在我看到了,我觉得自己很愚蠢。我不知道我的头在哪里,有一段时间没有编码,但我的脑袋里有一个巨大的空白。我以后需要更加小心。您的解决方案是完美的,即使下面同事的解决方案也是好的。谢谢你,先生。