我这样做时有疑问:
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类的静态变量(任何静态变量)?它不应该接受任何其他字符串或整数作为参数。
答案 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
}
}
我自己从未尝试过,但我认为没有任何理由不行。就个人而言,我会选择更简单的事情。