2016-09-05 1 views
0

j'apprends PHP et je suis bloqué i le code suivant:PHP: Accès var protégé de la classe des enfants

<?php 

class dogtag { 

    protected $Words; 

} 

class dog { 

    protected $Name; 
    protected $DogTag; 

    protected function bark() { 
     print "Woof!\n"; 
    } 

} 

class poodle extends dog { 

    public function bark() { 
     print "Yip!\n"; 
    } 

} 

$poppy = new poodle; 
$poppy->Name = "Poppy"; 
$poppy->DogTag = new dogtag; 
$poppy->DogTag->Words = "My name is 
Poppy. If you find me, please call 555-1234"; 

var_dump($poppy); 

?> 

C'est ce que je suis:

PHP Fatal error: Uncaught Error: Cannot access protected property poodle::$Name 

Cela semble étrange moi comme je devrais accéder à des vars et des fonctions protégés à partir de classes d'enfants.

Pourriez-vous s'il vous plaît quelqu'un expliquer où je me trompe?

Merci beaucoup.

Répondre

1

Les variables protégées peuvent en effet être accédées à partir de la classe enfant. Cependant, vous n'accédez pas à votre variable depuis l'intérieur de la classe enfant.

Si vous faites les variables public vous pouvez y accéder depuis l'extérieur de la classe.

Documentation: http://php.net/manual/en/language.oop5.visibility.php

Exemple:

Class Dog { 

    private $privateProperty = "private"; //I can only be access from inside the Dog class 
    protected $protectedProperty = "protected"; //I can be accessed from inside the dog class and all child classes 
    public $publicProperty = "public"; //I can be accessed from everywhere. 

} 


Class Poodle extends Dog { 

    public function getProtectedProperty(){ 
     return $this->protectedProperty; //This is ok because it's inside the Poodle (child class); 
    } 

} 

$poodle = new Poodle; 
echo $poodle->publicProperty; //This is ok because it's public 
echo $poodle->getProtectedProperty(); //This is ok because it calls a public method. 
+0

Merci @Daan mais je ne suis pas sûr de l'avoir. Vous voulez dire que j'essaye d'y accéder à partir d'une instance ($ poppy) de la sous-classe et non de la définition de sous-classe (caniche de classe s'étend ...)? – S4rg0n

+0

Cela signifie que vous n'accédez pas à l'intérieur de la classe de chien mais de l'extérieur. – Daan

+0

Je suis vraiment désolé mais je ne comprends pas. J'essaie d'accéder à $ Name de la sous-classe caniche, qui hérite de la classe canine. Je crée une instance de poodle ($ poppy) et j'essaie de changer le nom var $ protected. Je comprends que je ne peux pas le faire avec un var privé mais $ Name est protégé. Donc comme $ poppy est une instance de classe caniche, je devrais pouvoir modifier la var du parent protégé. Merci pour votre patience. – S4rg0n

0

Vous ne pouvez pas accéder à la propriété 'mots', vous devez le rendre public

0

vous pouvez ajouter magic méthodes à votre classe - Cela vous permettrait d'accéder et de manipuler les propriétés privées de l'extérieur de la classe.

class foo{ 
    private $bah; 

    public function __construct(){ 
     $this->bah='hello world'; 
    } 
    public function __get($name){ 
     return $this->$name; 
    } 
    public function __set($name,$value){ 
     $this->$name=$value; 
    } 
    public function __isset($name){ 
     return isset($this->$name); 
    } 
    public function __unset($name){ 
     unset($this->$name); 
    } 
} 

$foo=new foo; 
echo $foo->bah; 

$foo->bah='banana'; 
echo $foo->bah;