首页 > 开发 > php > 正文

php中静态成员方法和静态成员变量是不是不支持多态?

2017-09-06 13:33:43  来源:网友分享

各位大神好,我实现了一个日志工具基类,并派生了两个子类,一个是运维日志类,一个是业务日志类,并在基类中设置了一个静态变量希望能用以区分两个子类,但在调用静态方法时,实际上完全不是想象中的情况,代码如下:

// 日志工具基类class LogTool{    protected static $type;        public static function debug($msg) {        switch (self::$type) {        case 'biz':            echo '把日志写入数据库表1';            break;        case 'opt':            echo '把日志写入数据库表2';            break;        default:            echo 'error';        }    }        // 其他代码省略}// 运维日志类class OptTool extends LogTool{    protected static $type = 'opt';}// 业务日志类class BizTool extends LogTool{    protected static $type = 'biz';}// 调用代码BizTool::debug('王小虎已登录');

代码如上,实际上函数 dosomething 的运行情况是每次都输出 'error',因为在执行静态方法debug时,静态成员 $type 是空值;
但是如果我把 debug 函数在子类中再实现一次,则运行时 $type 变量就是有值的。
可是这样做就完全没意义了,抽象父类出来就是为了减少重复代码的,现在两个子类除了写入日志的表不同,其他完全相同,结果这样的结果弄得我欲哭无泪。

恳请大神们指点一二,万分感谢!

解决方案

基类中采用static::的方式,可以覆盖当前基类中定义的静态变量/方法,而去使用子类中定义的静态变量/方法

提供两个链接关于static::(后期静态绑定(Late Static Binding))的介绍和使用说明。

后期静态绑定--来自php官方手册
php静态变量-- 有明 的回答