PHP - 在被调用函数中使用静态变量的参数

时间:2012-05-21 07:07:42

标签: php oop

我这样做时有疑问:

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类的静态变量(任何静态变量)?它不应该接受任何其他字符串或整数作为参数。

3 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分:1)

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

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

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

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

Logger::INFO

这并不完美,但我相信它与PHP一样接近。为了使其成为防弹,你必须使用一些反思来检查传入的参数。This回答SO有更多关于如何实现它的信息。

答案 2 :(得分: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
    }
}

我自己从未尝试过,但我认为没有任何理由不行。就个人而言,我会选择更简单的事情。