您的位置:首页 > 编程语言 > PHP开发

PHP的self::与static::,new self()和new static()之分

2016-06-03 10:37 537 查看
//后期静态绑定
class A {
public static function who() {
var_dump("I'm A");
}
public static function test() {
self::who();
}
public static function staticT() {
static::who();
}
public function who1() {
var_dump("I'm A who1");
}
public static function staticT1() {
//    static::who1(); //who1不是static方法, 错误
(new static())->who1(); //用new static()创建新的静态域对象(具体是哪个类对象,则根据运行的类计算,跟static定义所在类无关),用->调用非静态方法
(new self())->who1(); //永远是A的who1()方法, self::只跟其定义所在类相关
}
}

class B extends A {
public static function who() {
var_dump("I'm B");
}
public function who1() {
var_dump("I'm B1 who1");
}
}

class B1 extends A {
public static function who() {
var_dump("I'm B1");
}
public static function test() {
self::who();
}
}
B::test();  //I'm A, 因为self::在A中,所以只会调用A的who()方法
B1::test(); //I'm B1, 因为B1\A都有self::, 但B1重载了A中的test()方法, 所以B1中的self::只会调用B1的方法

B::staticT(); //I'm B,因为static::是一个全局的静态域, 不局限于其定义所在的类,因此B重载了A的who()静态方法, static::会调用B的who()
B1::staticT(); //I'm B1,与上同理

B::staticT1(); //I'm B1 who1, I'm A who1, 解释看代码
die;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 后期静态绑定