关于oop:PHP – 在被调用函数中使用静态变量的参数

PHP - Argument with static variable in called function

我做这件事时有点怀疑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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类中的log函数只接受logger类的静态变量(任何静态变量)?它不应接受任何其他字符串或整数作为参数。


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

如果您使用它作为更新的示例记录器::$info,它将传递值字符串(4)"info",这将不起作用。它需要传递值字符串(8)"日志信息"

是的,通过反射:

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

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

把你的需要编码成这样的接缝对我来说更合适:

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

上面的结构提供了一个很好的机会:

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
    }
}

我自己从来没有尝试过,但我看不出有什么理由不起作用。就我个人而言,我会选择更简单的方式。


你要的是类似Java世界中的枚举。在so上检查这个问题,它提供了一些关于如何在PHP中实现类似概念的信息。

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

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

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

1
Logger::INFO

它并不完美,但我相信它和PHP中的一样接近。为了使它防弹,您必须使用一些反射来检查传入的参数。这个答案是这样的,所以有更多关于如何去实现它的信息。