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;
}
....
}
请考虑此代码:
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;
}
....
}