第二十二节:类与对象后期静态绑定对象和引用

后期静态绑定

从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
?> 
原文地址:https://www.cnblogs.com/saw2012/p/2910259.html