繁体   English   中英

PHP类中的常量和“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;
            }
            ...
        }
    }

我在交换机内部使用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”字符串,因此只获得了默认开关。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM