Hi all,
Strangely PHP seems to let each class have its own layer of private scope
for member variables. If a subclass defines a member variable of the same
name as one defined in the parent the values are maintained independently
in instances of the child class.
Advertising
First off a simple class with a private member variable $_myPrivate, and a
public accessor method which returns its value:
class A
{
private $_myPrivate = 5;
public function getMyPrivate()
{
return $this->_myPrivate;
}
}
Second, a subclass, that gets weird right away, first we define a private
member variable that already has been defined in the parent class, and give
it a different initial value. To illustrate the behavior we have two
accessor methods, setMyPrivate that uses the $this keyword to get the value
of $_myPrivate, which returns the value of the subclasse's version of the
variable, and getParentsMyPrivate, that calls A::getMyPrivate via the
parent keyword and it returns the value of $_myPrivate as defined in the
base class.
class B extends A
{
private $_myPrivate = 6;
public function setMyPrivate()
{
$this->_myPrivate = 6;
}
public function getMyPrivate()
{
return $this->_myPrivate;
}
public function getParentsMyPrivate()
{
return parent::getMyPrivate();
}
}
Look at a var_dump of an instance of B:
object(B)#2 (2) {
["_myPrivate":"B":private]=>
int(6)
["_myPrivate":"A":private]=>
int(5)
}
clearly storage is allocated for two different values. Now I'm sure you
all know that if I were to define a private method in A and try to call it
from B a Fatal error is raised, something on the order of
PHP Fatal error: Call to private method A::tryToCallMeFromB() from context
'B'
so why the special treatment for member variables, is this supposed to be a
feature?
-nathan