zoukankan      html  css  js  c++  java
  • 第二十二节:类与对象后期静态绑定对象和引用

    后期静态绑定

    从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/aademeng/category/1042475.html
    python中重要的模块--asyncio 转载
    await这个关键词以及asyncio.wait asyncio.gather
    async get_event_loop
    麦克米伦7000
    [GO]errorr接口的使用
    [GO]断言
    [GO]空接口
    [GO]接口的转换
    [GO]接口的嵌用继承
  • 原文地址:https://www.cnblogs.com/saw2012/p/2910259.html
Copyright © 2011-2022 走看看