rfc:lsb_parentself_forwarding

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.

<?php
  class A {
     public static function who() {
        return get_called_class();
     }
  }
  class B extends A {
 
  }
  class C extends B {
 
  } 
  echo C::who(); // C
?>

Now let's say that you want to overwrite who in B, but still rely on A's who():

<?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(); // ??
?>

Now, depending on how you call A's who() from B::who(), you might get different results for the C::who() call:

  1. C, if the call was forwarding
  2. 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

rfc/lsb_parentself_forwarding.txt · Last modified: 2013/10/29 18:30 by nikic