All,
I sent this originally to the php-general mailing list, but there doesn't
appear to be any consensus on how private variables should act. Any ideas?
Thanks,
--Paul
---------- Forwarded Message ----------
Subject: Re: [PHP] Private and protected variables in PHP 5?
Date: Saturday 12 Jul 2003 10:51 am
From: Paul Hudson <[EMAIL PROTECTED]>
To: Greg Beaver <[EMAIL PROTECTED]>, Alan D'Angelo <[EMAIL PROTECTED]>
Greg,
Meh - I thought namespaces were canned? Or is it just that the Poppy object
gets the private variables, but when I say $poppy->Name, PHP creates a new
public $Name variable and sets that?
Anyway, I've moved this from php-general to php-internals in the hope that we
can get a sure answer along the lines of "This isn't a bug"
Anyone?
--Paul
On Saturday 12 Jul 2003 12:27 am, Greg Beaver wrote:
> Hi to both of you,
>
> What is happening here is that there is a separate namespace for private
> elements in PHP 5. You can have both a private $Name and a public
> $Name if it is defined at runtime. I don't know if this is a feature or
> a bug, I'd call it a bug since redeclaration of a variable is not
> allowed, perhaps we should include the developers in on this question?
>
> Try this script to see the duplicate $Name variable:
>
> <?php
> class dog {
> // declare two private variables
> private $Name;
> private $DogTag;
>
> public function bark() {
> print "Woof!\n";
> }
>
> public function printName() {
> print $this->Name; // prints nothing!
> }
> }
>
> // new class, for testing derived stuff
> class poodle extends dog {
> public function bark() {
> print "Yip!\n";
> }
> }
>
> // I now create an instance of the
> // derived class
> $poppy = new poodle;
>
> // and set its private property
> $poppy->Name = "Poppy";
> print $poppy->Name. "\n";
> $poppy->printName();
> print_r($poppy);
> ?>
>
> outputs:
>
> Poppy
> poodle Object
> (
> [Name:private] =>
> [DogTag:private] =>
> [Name] => Poppy
> )
>
> Regards,
> Greg
> --
> phpDocumentor
> http://www.phpdoc.org
>
> Alan D'Angelo wrote:
> > Hello,
> > In my PHP5 installation the first example print Poppy,
> > but the second return
> > Fatal error: Call to protected method dog::bark() from context '' in
> > c:\appserv\www\test\mailingphp50.php on line 18
> >
> > In my previous installation oh PHP5, private variable worked well ...
> > PHP 5 is one beta, try with an next snapshot.
> >
> >
> > Alan
> >
> >
> > ----- Original Message -----
> > From: "Paul Hudson" <[EMAIL PROTECTED]>
> > To: <[EMAIL PROTECTED]>
> > Sent: Friday, July 11, 2003 11:21 PM
> > Subject: [PHP] Private and protected variables in PHP 5?
> >
> >>All,
> >>
> >>I'm toying with the new stuff available in PHP 5 (latest CVS), but I've
> >
> > hit a
> >
> >>brick wall: both private and protected don't seem to work as I'd expect
> >
> > them
> >
> >>to.
> >>
> >>Here's an example script:
> >>
> >><?php
> >> class dog {
> >> // declare two private variables
> >> private $Name;
> >> private $DogTag;
> >>
> >> public function bark() {
> >> print "Woof!\n";
> >> }
> >> }
> >>
> >> // new class, for testing derived stuff
> >> class poodle extends dog {
> >> public function bark() {
> >> print "Yip!\n";
> >> }
> >> }
> >>
> >> // I now create an instance of the
> >> // derived class
> >> $poppy = new poodle;
> >>
> >> // and set its private property
> >> $poppy->Name = "Poppy";
> >> print $poppy->Name;
> >>?>
> >>
> >>For some reason, that script works fine - PHP doesn't object to me
> >> setting private variables in the derived class. Yet if I use "$poppy =
> >> new dog",
> >
> > the
> >
> >>script errors out as expected. It's almost like PHP inherits the member
> >>variables, but not the attached access control.
> >>
> >>For protected, here's another script:
> >>
> >><?php
> >> class dog {
> >> // this next function is protected
> >> // viz, it should be available to dog
> >> // and its children
> >>
> >> protected function bark() {
> >> print "Woof!\n";
> >> }
> >> }
> >>
> >> class poodle extends dog {
> >> // nothing happening here
> >> }
> >>
> >> $mydog = new poodle;
> >> // I now call the protected function
> >> $mydog->bark();
> >>?>
> >>
> >>That script errors out saying that I can't call the protected function
> >
> > bark -
> >
> >>surely, being protected, it should be available in the poodle class too?
> >>
> >>Of course, it might be that these two pieces of functionality are not yet
> >>implemented in PHP, or, more likely, that I'm just misinterpreting the
> >>documentation! ;)
> >>
> >>If you have any insight, please CC me into your response to the list.
> >>
> >>Thanks,
> >>
> >>
> >>Paul
> >>
> >>--
> >>PHP General Mailing List (http://www.php.net/)
> >>To unsubscribe, visit: http://www.php.net/unsub.php
-------------------------------------------------------
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php