在我们以往中,在类中使用self关键字的时候都是指向了被调用方法定义时的类,而非原始的调用类。
例如:
class Animal{ static $IQ_lv_avg = 1; public static function myiqlvavg(){ echo self::$IQ_lv_avg.PHP_EOL; } public static function test(){ self::myiqlvavg(); } } class Dog extends Animal{ static $IQ_lv_avg = 3; public static function myiqlvavg(){ echo self::$IQ_lv_avg.PHP_EOL; } } Dog::test();//echo 1
我们可以得到最后得到的平均IQ等级是1
self指向的是定义其所在方法的类。
我们如果想执行Dog类,也就是调用类的静态方法怎么办呢?
静态后期绑定可以做到。
使用方法其实就是使用static关键字。
例如:
class GrandparentClass{ static $age = 40; public static function foo(){ static::whatMyAge(); } public static function whatMyAge(){ echo __CLASS__.PHP_EOL; } } class ParentClass extends GrandparentClass{ static $age = 60; public static function start(){ GrandparentClass::foo(); parent::foo(); self::foo(); } } class ChildrenClass extends ParentClass{ static $age = 90; public static function whatMyAge(){ echo __CLASS__.PHP_EOL; } } ChildrenClass::start();
最终获得的年代为:
40 90 90
在静态方法中,我们可以使用get_called_class()函数得知调用静态方法的类名。
例如:
class foo { static public function test() { var_dump(get_called_class()); } } class bar extends foo { } foo::test();//echo foo bar::test();//echo bar
在php 5.5之后可以使用static::class 达到get_called_class()同效果。
Note:可以直接调用phpversion函数查看当前php版本,或者cli模式查看,总之方法多多。