rfc:lsb_parentself_forwarding
no way to compare when less than two revisions

Differences

This shows you the differences between two versions of the page.


Previous revision
Last revision
rfc:lsb_parentself_forwarding [2013/10/29 17:30] – -> Implemented nikic
Line 1: Line 1:
 +====== Request for Comments: LSB, parent::/self:: forwarding ======
 +  * Version: 1.0
 +  * Date: 2008-07-22
 +  * Author: Etienne Kneuss <colder@php.net>
 +  * Status: Implemented in PHP 5.3
 +
 +===== Introduction =====
 +
 +This RFC covers the change that occured to Late Static Bindings (LSB) prior to its first alpha release.
 +
 +==== Terms and concepts ====
 +
 +LSB works by passing the original call info to the function, used then by ''static::'' or get_called_class to get the original class name used. This information will only be useful in case a ''fallback'' occurs, which takes place when you call a static method that only exists in one of the parent classes.
 +<code php>
 +<?php
 +  class A {
 +     public static function who() {
 +        return get_called_class();
 +     }
 +  }
 +  class B extends A {
 +     
 +  }
 +  class C extends B {
 +
 +  } 
 +  echo C::who(); // C
 +?>
 +</code>
 +
 +Now let's say that you want to overwrite who in B, but still rely on A's who():
 +
 +<code php>
 +<?php
 +  class A {
 +     public static function who() {
 +        return get_called_class();
 +     }
 +  }
 +  class B extends A {
 +     public static function who() {
 +         /* do stuff.. */
 +
 +         /* call A's who() */
 +     }  
 +  }
 +  class C extends B {
 +
 +  } 
 +  echo C::who(); // ??
 +?>
 +</code>
 +
 +Now, depending on how you call A's ''who()'' from ''B::who()'', you might get different results for the ''C::who()'' call:
 +  - C, if the call was ''forwarding''
 +  - A, if the call wasn't ''forwarding''.
 +
 +===== The change =====
 +
 +Previously, ''A::who()'' and ''parent::who()'' would be ''non-forwarding''. The only way to call A's who() with ''forwarding'' was to use an helper function: ''forward_static_call()''.
 +
 +With the change, a difference between ''parent::'' and ''A::'' is introduced, that is: ''parent::'' is ''forwarding'' while ''A::'' isn't. Basically, explicit calls are ''non-forwarding'', but calls using keywords are.
 +
 +Note that ''self::'' will also be made to be ''forwarding'', while ''<nameoftheclass>::'' won't.
 +
 +===== ML Discussion =====
 +
 +http://markmail.org/message/at3ypbykl6luwr6l
  
rfc/lsb_parentself_forwarding.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1