zoukankan      html  css  js  c++  java
  • PHP的new self() 与new static()

    参考链接:【PHP中new static()与new self()的区别异同分析】,【PHP中new self()和new static()的区别探究】,【PHP中static和self的区别

    要点其实是理解概念:

    还是看看老外的专业解释吧:
    
    self refers to the same class whose method the new operation takes place in.
    译:self指那些方法被重写的类。tip:如果继承层次深(如继承深度大于1),当前子类没有重写父类方法,那么就需要找到最后一个方法被重写的类;如果是当前类重写的话,那当然就直接是当前类咯。 static in PHP 5.3's late static bindings refers to whatever class in the hierarchy which you call the method on.
    译:static指当你所调用的方法所在的类。tip:其实这个就不用管继承了,永远都是当前类,不用管父类。

    一、只有一层继承:

    看代码:

    class Father {
    
        public function getNewFather() {
            return new self();
        }
    
        public function getNewCaller() {
            return new static();
        }
    }
    
    class Sun1 extends Father {
        
    
    }
    
    class Sun2 extends Father {
    
    }
    
    $sun1 = new Sun1();
    $sun2 = new Sun2();
    
    print '$sun1->getNewFather():'.get_class($sun1->getNewFather());
    echo '<br>';
    print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller());
    echo '<br>';
    print '$sun2->getNewFather():'.get_class($sun2->getNewFather());
    echo '<br>';
    print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller());
    echo '<br>';
    echo '<br>';
    View Code

    结果:

    $sun1->getNewFather():Father
    $sun1->getNewCaller():Sun1
    $sun2->getNewFather():Father
    $sun2->getNewCaller():Sun2

     二、有两层继承

    看代码:

    class Father {
    
        public function getNewFather() {
            return new self();
        }
    
        public function getNewCaller() {
            return new static();
        }
    }
    
    class Sun1 extends Father {
        public function getNewFather() {
            return new self();
        }
    
        public function getNewCaller() {
            return new static();
        }
    }
    
    class Sun2 extends Father {}
    
    class subSun1 extends Sun1{}
    class subSub2 extends Sun2{}
    
    $sun1 = new Sun1();
    $sun2 = new Sun2();
    
    $subSun1=new subSun1();
    $subSub2=new subSub2();
    
    print '$sun1->getNewFather():'.get_class($sun1->getNewFather());
    echo '<br>';
    print '$sun1->getNewCaller():'.get_class($sun1->getNewCaller());
    echo '<br>';
    print '$sun2->getNewFather():'.get_class($sun2->getNewFather());
    echo '<br>';
    print '$sun2->getNewCaller():'.get_class($sun2->getNewCaller());
    echo '<br>';
    echo '<br>';
    
    print '$subSun1->getNewFather():'.get_class($subSun1->getNewFather());
    echo '<br>';
    print '$subSun1->getNewCaller():'.get_class($subSun1->getNewCaller());
    echo '<br>';
    print '$subSun2->getNewFather():'.get_class($subSub2->getNewFather());
    echo '<br>';
    print '$subSun2->getNewCaller():'.get_class($subSub2->getNewCaller());
    View Code

    结果:

    $sun1->getNewFather():Sun1
    $sun1->getNewCaller():Sun1
    $sun2->getNewFather():Father
    $sun2->getNewCaller():Sun2
    
    $subSun1->getNewFather():Sun1
    $subSun1->getNewCaller():subSun1
    $subSun2->getNewFather():Father
    $subSun2->getNewCaller():subSub2
  • 相关阅读:
    ASPxGridView控件的基本属性
    未整理笔记
    ASPxGridView中Command列自定义按钮点击事件概要
    Cookie的使用
    ASPxGridView行的选中和行的焦点
    改变“骨感”,让OKR变得“丰满”
    高成就者的5个共同点
    项目的风险管理
    实际执行动作对OKR目标落地的重要性
    13种公认的高绩效习惯
  • 原文地址:https://www.cnblogs.com/zjfblog/p/8268264.html
Copyright © 2011-2022 走看看