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 General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to