1

这样做时我有一个疑问:

class Logger {
        public static $log_INFO = 'INFO';
        public static $log_ERROR = 'ERROR';
        public function log($logLevel, $param2, $param3) {
              // Write log to some file
        }
}

class Midea {
       public function fn1 {
           $logger = new Logger();
           $logger->log(Logger::$log_INFO, 'some', 'some2');
       }
}

现在我的问题是:有没有办法让 Logger 类中的日志函数只接受 Logger 类的静态变量(任何静态变量)?它不应接受任何其他字符串或整数作为参数。

4

3 回答 3

3

我的回答是基于 $logLevel 包含静态类属性的名称这一事实。

如果您将其用作更新的示例 Logger::$INFO,则将传递值string(4) "INFO",这将不起作用。它需要传递值string(8) "log_INFO"

是的,通过使用反射:

public function log($logLevel, $param2, $param3) {
    $reflection_property = new ReflectionProperty(get_called_class(), $logLevel);
    if($reflection_property->isStatic()) {
        // rest of the code
    }
}

IMO 这种强制执行是不必要的,它增加了代码的复杂性和开销。而且好处很小。

像这样对您的必要性进行编码对我来说更合适:

public static function $log_levels = array('INFO', 'ERROR');
public function log($log_level, $param2, $param3) {
    if(in_array($log_level, static::$log_levels)) {
        // code
    }
}

上面的结构开辟了一个很好的机会:

public static function $log_levels = array(
    'INFO' => array('Logger', 'handleInfoLogs'),
    'ERROR' => array('Logger', 'handleErrorLogs')
);
public function log($log_level, $param2, $param3) {
    if(array_key_exists($log_level, static::$log_levels)) {
        return(static::$log_levels[$log_level]($param2, $param3));
    }
}
于 2012-05-21T07:13:04.990 回答
1

您所要求的类似于 Java 世界中的枚举。在 SO 上查看问题,其中包含有关如何在 PHP 中实现类似概念的一些信息。

更具体地说,您可以像这样实现您的要求:

class Logger {
    const INFO = 1;
    const ERROR = 2;
};

然后,您可以在如下代码中使用它:

Logger::INFO

它并不完美,但我相信它与 PHP 一样接近。为了使其防弹,您将不得不采用一些反射来检查传入的参数。关于 SO 的这个答案有更多关于如何实施它的信息。

于 2012-05-21T07:11:41.230 回答
1

这很麻烦,但你可以这样做:

abstract class LoggerStatus
{
    public function __toString()
    {
        return $this->status;
    }
}

class LoggerStatusInfo extends LoggerStatus
{
    protected $status = 'INFO';
}

class LoggerStatusError extends LoggerStatus
{
    protected $status = 'ERROR';
}

class Logger {
    public static $log_INFO;
    public static $log_ERROR;

    public function __construct()
    {
        self::$log_INFO = new LoggerStatusInfo();
        self::$log_ERROR = new LoggerStatusError();
    }

    public function log(LoggerStatus $logLevel, $param2, $param3) {
          // Write log to some file
    }
}

我自己从未尝试过,但我看不出有任何原因它不起作用。就个人而言,我会选择更简单的东西。

于 2012-05-21T07:31:25.850 回答