downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
search for in the  

<Classes and Objects (PHP 5)Namespaces>
Last updated: Thu, 26 Jun 2008

Late Static Bindings

As of PHP 5.3.0, PHP implements a feature called late static bindings which can be used to reference the called class in a context of static inheritance.

This feature was named "late static bindings" with an internal perspective in mind. "Late binding" comes from the fact that static:: will no longer be resolved using the class where the method is defined but it will rather be computed using runtime information. It was also called a "static binding" as it can be used for (but is not limited to) static method calls.

Limitations of self::

Static references to the current class like self:: or __CLASS__ are resolved using the class in which the function belongs, as in where it was defined:

Example #1 self:: usage

<?php
class A {
  
public static function who() {
       echo
__CLASS__;
   }
  
public static function test() {
      
self::who();     
   } 


class
B extends A {     
  
public static function who() {
         echo
__CLASS__;
   } 


B::test();
?>

The above example will output:

A

Late Static Bindings' usage

Late static bindings tries to solve that limitation by introducing a keyword that references the class that was initially called at runtime. Basically, a keyword that would allow you to reference B from test() in the previous example. It was decided not to introduce a new keyword but rather use static that was already reserved.

Example #2 static:: simple usage

<?php
class A {
  
public static function who() {
       echo
__CLASS__;
   }
  
public static function test() {
       static::
who(); // Here comes Late Static Bindings   
  



class
B extends A {     
  
public static function who() {
         echo
__CLASS__;
   } 


B::test();
?>

The above example will output:

B

Note: static:: does not work like $this for static methods! $this-> follows the rules of inheritance while static:: doesn't. This difference is detailed later on this manual page.

Example #3 static:: usage in a non-static context

<?php
class TestChild extends TestParent {
  
public function __construct() {
       static::
who();
   }

  
public function test() {
      
$o = new TestParent();
   }

  
public static function who() {
       echo
__CLASS__."\n";
   }
}

class
TestParent {
  
public function __construct() {
       static::
who();
   }

  
public static function who() {
       echo
__CLASS__."\n";
   }
}
$o = new TestChild;
$o->test();

?>

The above example will output:

TestChild
TestParent

Note: Late static bindings' resolution will stop at a fully resolved static call with no fallback.

Example #4 Fully resolved static calls

<?php
class A {
  
public static function foo() {
       static::
who();
   }
      
  
public static function who() {
       echo
__CLASS__."\n";
   }
}

class
B extends A {
  
public static function test() {
      
A::foo();
   }

  
public static function who() {
       echo
__CLASS__."\n";
   }
}

B::test();
?>

The above example will output:

A

Edge cases

There are lots of different ways to trigger a method call in PHP, like callbacks or magic methods. As late static bindings base their resolution on runtime information, it might give unexpected results in so-called edge cases.

Example #5 Late static bindings inside magic methods

<?php
class A {

  
protected static function who() {
       echo
__CLASS__."\n";
   }

  
public function __get($var) {
       return static::
who();
   }
}

class
B extends A {

  
protected static function who() {
       echo
__CLASS__."\n";
   }
}

$b = new B;
$b->foo;
?>

The above example will output:

B


add a noteadd a note User Contributed Notes
Late Static Bindings
There are no user contributed notes for this page.




<Classes and Objects (PHP 5)Namespaces>
Last updated: Thu, 26 Jun 2008
show source | credits | sitemap | contact | advertising | mirror sites
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: http://phpbuilder.com/
Last updated: Tue Nov 1 20:20:59 2005 EST
Columns / Articles | Tips / Quickies | News | News Linking and RSS Feeds | Shared Code Library
Mail Archives | Support / Discussion Forums | Get Started! Links | Contribute! | Docs