请考虑以下代码:
class App {
const ALERT_ERROR=1;
const ALERT_WARN=2;
const ALERT_INFO=3;
public static function alert($title,$type=ALERT_ERROR) {
switch ($type){
default:
case static::ALERT_ERROR:
$class="alert-danger"; break;
case static::ALERT_WARN:
$class="alert-warning"; break;
case static::ALERT_INFO:
$class="alert-info"; break;
}
...
}
}
我在交换机内部使用static::constant
语法时遇到了一些问题。我在一些PHP Web服务器中将其识别为正确的值(在const ALERT_ERROR
中定义)在其他服务器中我必须删除static::
前缀并仅保留常量名称。但是通过这种方式,第一个网络服务器并不起作用......
第一个php版本是5.4.7,第二个版本是5.4.37 ......但我不认为这是版本问题。
问题在于,如果我运行此代码:
App::alert("test",App::ALERT_INFO);
$ class设置为" alert-danger"默认情况下,无法识别App :: ALERT_INFO常量。如果我添加static ::前缀,则从一个Web服务器识别常量,而不是从另一个Web服务器识别,反之,如果我将其删除。
抛出的通知是:使用未定义的常量ALERT_ERROR - 假设' ALERT_ERROR'
在回答后编辑
问题不在切换案例中,而是在默认参数中。这假设为" ALERT_ERROR"字符串,所以只有默认开关。
答案 0 :(得分:8)
您必须将static关键字添加到用作默认值的常量。
public static function alert($title, $type=static::ALERT_ERROR) {
// ....
}
但static
仅在运行时确定。因此,如果确实需要static
行为,那么:
public static function alert($title, $type=null) {
if ($type === null) {
$type = static::ALERT_ERROR;
}
// ...
}
如果确实不需要静态,请将所有static::
替换为self::
public static function alert($title, $type=self::ALERT_ERROR) {
switch ($type){
default:
case self::ALERT_ERROR:
$class="alert-danger"; break;
case self::ALERT_WARN:
$class="alert-warning"; break;
case self::ALERT_INFO:
$class="alert-info"; break;
}
....
}