Difference between revisions of "PHP OO problem"

From Organic Design wiki
(Notes: doesn't work)
m (Notes)
Line 33: Line 33:
  
 
== Notes ==
 
== Notes ==
This is a known limitation of PHP and they've tried to resolve it with [http://www.php.net/manual/en/language.oop5.late-static-bindings.php Late Static Bindings], but unfortunately this doesn't work for me as the solution would require changing the call in ''Foo:X'' to ''static::Y'', but we don't have access to the ''Foo'' class.
+
This is a known limitation of PHP and they've tried to resolve it with [http://www.php.net/manual/en/language.oop5.late-static-bindings.php Late Static Bindings], but unfortunately this doesn't work for me as the solution would require changing the call in ''Foo:X'' from ''self::Y()'' to ''static::Y()'', but we don't have access to the ''Foo'' class.

Revision as of 00:17, 30 July 2013

Take the following example class Foo which defines a static method called X that statically calls another of it's method's called Y using self::Y() as follows.

<php>

class Foo {

public static function X() { self::Y(); }

public static function Y() { echo( "This is Foo::Y" ); }

} </php>


Now lets say that Foo is part of a core library that we don't have commit access to and we want to make a modified version of the functionality via a sub-class of Foo called Bar which overrides the Y method as follows.

<php>

class Bar extends Foo {

public static function Y() { echo( "This is Bar::Y" ); }

} </php>

The problem

The Y method is only ever called via the self::Y statement in the X method, so when we call Bar::X() it's actually Foo::Y that executes, because X only ever executes within the context of Foo since we haven't overridden the X method with a definition in the Bar class.

The question

Is there a way to define a Bar::X method that calls Foo:X while maintaining the context of Bar (i.e. the value of self is "Bar" during execution of Foo::X?

Notes

This is a known limitation of PHP and they've tried to resolve it with Late Static Bindings, but unfortunately this doesn't work for me as the solution would require changing the call in Foo:X from self::Y() to static::Y(), but we don't have access to the Foo class.