I would like to better understand why, in the scenario below, there is a difference in the way class constants are inherited vs. instance variables.
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
Output:
TWO
TWO
ONE
TWO
In the code above, ChildClass does not have a showTest() method, so the ParentClass showTest() method is used by inheritance. The results show that since the method is executing on the ParentClass, the ParentClass version of the TEST constant is being evaluated, whereas because it's evaluating within the ChildClass context via inheritance, the ChildClass member variable $test is being evaluated.
I've read the documentation, but can't seem to see any mention of this nuance. Can anyone shed some light for me?
self::
Isn't inheritance-aware and always refers to the class it is being executed in. If you are using php5.3+ you might try static::TEST
as static::
is inheritance-aware.
The difference is that static::
uses "late static binding". Find more information here:
http://php.net/manual/en/language.oop5.late-static-bindings.php
Here's a simple test script I wrote:
<?php
class One
{
const TEST = "test1";
function test() { echo static::TEST; }
}
class Two extends One
{
const TEST = "test2";
}
$c = new Two();
$c->test();
output
test2