//后期静态绑定 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的self::与static::,new self()和new static()之分
最新推荐文章于 2024-07-08 18:11:27 发布