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"字符串,因此只获得了默认开关.
您必须将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)