Re: Bazar behavior w/ private member variables
| From: | Tommy Pham | Date: | Fri, 13 Jul 2012 02:38:45 +0000 |
| Subject: | Re: Bazar behavior w/ private member variables | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-318465@lists.php.net to get a copy of this message | ||
On Thu, Jul 12, 2012 at 7:19 PM, Nathan Nobbe <quickshiftin@gmail.com> wrote:
> 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.
>
> 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
That is OOP accross all languages. If you want the child class to
modify the variable, then set it to protected. Private is only
accessible within that class.