PHP - Argument with static variable in called function
我做这件事时有点怀疑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
现在我的问题是:有没有办法让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 |
上面的结构提供了一个很好的机会:
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中的一样接近。为了使它防弹,您必须使用一些反射来检查传入的参数。这个答案是这样的,所以有更多关于如何去实现它的信息。