Home > Backend Development > PHP Tutorial > php 后期延迟静态绑定(初步了解)

php 后期延迟静态绑定(初步了解)

WBOY
Release: 2016-06-23 13:04:13
Original
809 people have browsed it

(刚接触这个高大上的东西,还不是特别的了解,不过基本是搞明白一些了。)

从PHP 5.3.0开始,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 该功能从语言内部角度考虑被命名为“后期静态绑定”。 “后期绑定”的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。 也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。

科普几个:1.什么是静态调用?并不是说有::就是静态调用,而是看calling scope。2.$this指针指向的对象就是这个方法被调用时刻的calling scope,静态调用是没有calling scope的,非静态调用this−>abc()中的this−>abc()中的this指向的对象就是calling scope。3.大家尽量要避免使用”::”来调用一个非静态的方法.4.this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。this是指向当前对象的指针,self是指向当前类的指针,parent是指向父类的指针。5.静态环境即静态域。public static function
Copy after login

引用参考:

http://www.laruence.com/2012/06/14/2628.html

http://www.cnblogs.com/yjf512/archive/2012/09/12/2682556.html

第一个例子

Example #1 self:: 用法< ?phpclass A {    public static function who() {//这是一个静态域        echo __CLASS__;    }    public static function test() {         self::who(); //self关键字是调用自身的静态域方法,调用的是上面那个    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  //这里因为b继承了a,理论上B::test()应该是出现B的输出,但是因为使用 self:: ,self是调用自身            //所以输出A?>以上例程会输出:A
Copy after login

第二个例子

Example #2 static:: 简单用法< ?phpclass A {    public static function who() {        echo __CLASS__;    }    public static function test() {  //这是一个静态作用域        static::who(); // 后期静态绑定从这里开始                       // 虽然B继承A,B在调用test方法的时候,静态作用域会解析为了当前类B类,这就是“static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。”                       //所以会调用B类的who方法,所以输出B    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  ?>以上例程会输出:B
Copy after login

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

第三个例子

Example #3 非静态环境下使用 static::< ?phpclass A {    private function foo() {  //这不是一个静态域        echo "success!\n";    }    public function test() { //这不是一个静态域        $this->foo();        echo "---------\n";        var_dump($this);        static::foo();        echo "+++++++++\n";    }}class B extends A {   /* foo() will be copied to B, hence its scope will still be A and    * the call be successful */    //scope依然是A,所以能够调用private的foo}class C extends A {    private function foo() {        /* original method is replaced; the scope of the new one is C */        //因为c重写了foo方法,所以scope是c,而test是scope A,所以无法调用private的foo    }}$b = new B();$b->test();echo "--------分隔线,下面是c类相关调用\n";$c = new C();$c->test();   //fails?>以上例程会输出:success!---------object(B)#1 (0) {}success!+++++++++--------分隔线,下面是c类相关调用success!---------object(C)#2 (0) {}Fatal error: Call to private method C::foo() from context 'A'
Copy after login

目前还不知道怎么证明,但是可以知道一些东西,这个不是static作用域,所以有所属的scope,而函数本身的scope只能是自己,而不能是别人,即使是继承,除非用parent::来传递scope

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template