Re: Bazar behavior w/ private member variables
| From: | Nathan Nobbe | Date: | Fri, 13 Jul 2012 03:25:15 +0000 |
| Subject: | Re: Bazar behavior w/ private member variables | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-318467@lists.php.net to get a copy of this message | ||
On Thu, Jul 12, 2012 at 9:23 PM, Nathan Nobbe <quickshiftin@gmail.com>wrote:
> On Thu, Jul 12, 2012 at 8:38 PM, Tommy Pham <tommyhp2@gmail.com> wrote:
>
>> 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.
>>
>
> I know that sounds like it should make sense but if it's true, it's an
> aspect I've never known about, at least maybe I'm just spacing really bad
> or something...
>
> Anyway, this chokes in javac:
>
> public class PrivateAccess
> {
> private Boolean isAccessible = true;
> }
>
> class PrivateAccessChild extends PrivateAccess
> {
> public Boolean getAccessible()
> {
> return isAccessible;
> }
> }
>
> PrivateAccessChild.java:5: isAccessible has private access in PrivateAccess
> return isAccessible;
> ^
>
> -nathan
>
Ahhh, but if I add the private declaration in the subclass it works. Where
have I been??
-nathan