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

Tob*_*bia 2 php oop constants php-5.4

请考虑以下代码:

    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;
            }
            ...
        }
    }
Run Code Online (Sandbox Code Playgroud)

static::constant在交换机内部的语法有些问题.我在一些PHP Web服务器中被识别为const ALERT_ERROR其他服务器中的正确值(如定义)我必须删除static::前缀并仅保留常量名称.但通过这种方式,第一个网络服务器不起作用......

第一个php版本是5.4.7,第二个是5.4.37 ......但我不认为这是版本问题.

问题是,如果我运行此代码:

App::alert("test",App::ALERT_INFO);
Run Code Online (Sandbox Code Playgroud)

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

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

在答案后编辑

问题不在于切换情况,而是在默认参数中.这被假定为"ALERT_ERROR"字符串,因此只获得了默认开关.

Mak*_*s3w 8

您必须将static关键字添加到用作默认值的常量.

public static function alert($title, $type=static::ALERT_ERROR) {
  // ....
}
Run Code Online (Sandbox Code Playgroud)

static仅在运行时确定.因此,如果static确实需要行为,那么:

public static function alert($title, $type=null) {
  if ($type === null) {
      $type = static::ALERT_ERROR;
  }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果不是真的需要静态,那么将全部替换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;
    }
    ....
}
Run Code Online (Sandbox Code Playgroud)

  • 致命错误:编译时常量中不允许使用"static ::" (2认同)
  • 好.你真的需要静电吗?如果不使用`self`.`static`用于继承覆盖 (2认同)
  • 请编辑答案以反映正确答案,因为在此处使用静态会产生致命错误! (2认同)