PHP class 和 "static" 关键字中的常量

Constant in PHP class and "static" keyword

请考虑此代码:

    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;
            }
            ...
        }
    }

我在使用 switch 中的 static::constant 语法时遇到了一些问题。我的一些 PHP 网络服务器在其他服务器中被识别为正确值(如 const ALERT_ERROR 中定义)我不得不删除 static:: 前缀并仅保留常量名称。但是用这种方式第一个网络服务器不起作用...

第一个php版本是5.4.7 第二个是5.4.37...不过我觉得不是版本问题

问题是如果我运行这个代码:

App::alert("test",App::ALERT_INFO);

$class 默认设置为 "alert-danger",App::ALERT_INFO 常量无法识别。如果我添加 static:: 前缀,则常量从一个网络服务器识别,而不是从另一个网络服务器识别,反之亦然,如果我删除它。

抛出的通知是:未定义常量的使用ALERT_ERROR - 假设'ALERT_ERROR'

回答后编辑

问题不在 switch case 中,而是在默认参数中。假定为 "ALERT_ERROR" 字符串,因此只获得了默认开关。

您必须将 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;
    }
    ....
}