Should go to the mailinlist :> ---------- Forwarded message ---------- From: Sebastian Krebs <krebs.seb@xxxxxxxxx> Date: 2012/7/13 Subject: Re: Bazar behavior w/ private member variables To: Nathan Nobbe <quickshiftin@xxxxxxxxx> Hi, Private properties are only accessable from within an object of the class, where it's defined. If you define a new private property with the same name in a subclass, then you just have two properties with the same name, but in different classes. They are separate from each other ;) It seems, that you are _really_ looking for protected properties instead. Regards, Sebastian 2012/7/13 Nathan Nobbe <quickshiftin@xxxxxxxxx> > On Thu, Jul 12, 2012 at 9:23 PM, Nathan Nobbe <quickshiftin@xxxxxxxxx > >wrote: > > > On Thu, Jul 12, 2012 at 8:38 PM, Tommy Pham <tommyhp2@xxxxxxxxx> wrote: > > > >> On Thu, Jul 12, 2012 at 7:19 PM, Nathan Nobbe <quickshiftin@xxxxxxxxx> > >> 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 >