后期静态绑定
从PHP 5.3.0开始,PHP增加一个叫做后期静态绑定的功能,拥有在继承范围内引用静态调用的类。
该功能从语言内部角度考虑被命名为“后期静态绑定”。“后期绑定”的意思事说,static::不再被解析为定义当前方法所在的类,而是实际运行时计算的。因为它可以用于(但不限于)静态方法的调用。
就是哪个类被最先实例化,static::就执行这个类里面的方法或者属性,不管自身处于被继承的类,还是多代继承。
当使用self::或者class 对当前类静态引用,取决于定义当前方法所在的类:
1 <?php 2 class A{ 3 public static function who(){ 4 echo __CLASS__; 5 } 6 public static function test(){ 7 self::who(); 8 } 9 } 10 class B extends A{ 11 public static function who(){ 12 echo __CLASS__; 13 } 14 } 15 B::test(); //A 16 ?>
后期静态绑定的用法
1 <?php 2 class A{ 3 public static function who(){ 4 echo __CLASS__; 5 } 6 public static function test(){ 7 static :: who(); 8 } 9 } 10 class B extends A{ 11 public static function who(){ 12 echo __CLASS__; 13 } 14 } 15 B::test(); 16 ?>
谁实例了他 static::就选择谁的方法
1 <?php 2 class TestChild extends TestParent { 3 public function __construct() { 4 static::who(); 5 } 6 7 public function test() { 8 $o = new TestParent(); 9 } 10 11 public static function who() { 12 echo __CLASS__."\n"; 13 } 14 } 15 16 class TestParent { 17 public function __construct() { 18 static::who(); 19 } 20 21 public static function who() { 22 echo __CLASS__."\n"; 23 } 24 } 25 $o = new TestChild; 26 $o->test();//TestChild TestParent 27 ?>
而parent:: 或者 self:: 将转发调用信息
1 <?php 2 class A { 3 public static function foo() { 4 static::who(); 5 } 6 7 public static function who() { 8 echo __CLASS__."\n"; 9 } 10 } 11 12 class B extends A { 13 public static function test() { 14 A::foo(); //A->foo A->who() 15 parent::foo();//A->foo C->who() 16 self::foo();//A->foo C->who() 17 } 18 19 public static function who() { 20 echo __CLASS__."\n"; 21 } 22 } 23 class C extends B { 24 public static function who() { 25 echo __CLASS__."\n"; 26 } 27 } 28 29 C::test();//A C C 30 ?>
1 <?php 2 class A { 3 4 protected static function who() { 5 echo __CLASS__."\n"; 6 } 7 8 public function __get($var) { 9 return static::who(); 10 } 11 } 12 13 class B extends A { 14 15 protected static function who() { 16 echo __CLASS__."\n"; 17 } 18 } 19 20 $b = new B; 21 $b->foo;//B 22 ?>
对象和引用
php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。
<?php class A{ public $foo=1; } $a=new A;//$a=<A,id:1> $b=$a;//$a=$b=<A.id:1> $b->foo=2;//$a=$b=<A.id:1>=($foo=2) echo $a->foo."\n";//2 $c=new A;//$c=<A.id:2> $d=&$c;//($d,$c)=<A.id:2> $d->foo=2;//($d,$c)=<A.id:2>=($foo=2) echo $c->foo."\n";//2 $e= new A;//$e=<A.id:3> function foo($obj){ $obj->foo=2;//$e=$obj=<A.id.3> } foo($e); echo $e->foo."\n"; //2 ?>