PHP类中的常量;静态“;关键字


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

我对开关中的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 Server识别出来,反之亦然。

抛出的通知是:使用未定义的常量ALERT_ERROR-假定为"ALERT_ERR"

回答后编辑

问题不在交换机的情况下,而在默认参数中。它被假定为"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;
    }
    ....
}