2016-03-31 7 views
1

je le code suivant: Classe Définition:PHP POO privé protégé

<?php 
    class Person{ 
     var $name; 
     public $height; 
     protected $socialInsurance = "yes"; 
     private $pinnNumber = 12345; 

     public function __construct($personsName){ 
      $this->name = $personsName; 
     } 

     public function setName($newName){ 
      $this->name = $newName; 
     } 

     public function getName(){ 
      return $this->name; 
     } 

     public function sayIt(){ 
      return $this->pinnNumber; 
     } 
    } 

    class Employee extends Person{ 
    } 

Et la partie avec les instances:

<!DOCTYPE html> 
<HTML> 
    <HEAD> 
     <META charset="UTF-8" /> 
     <TITLE>Public, private and protected variables</TITLE> 
    </HEAD> 
    <BODY> 
     <?php 
      require_once("classes/person.php"); 

      $Stefan = new Person("Stefan Mischook"); 

      echo("Stefan's full name: " . $Stefan->getName() . ".<BR />"); 

      echo("Tell me private stuff: " . $Stefan->sayIt() . "<BR />"); 


      $Jake = new Employee("Jake Hull"); 

      echo("Jake's full name: " . $Jake->getName() . ".<BR />"); 

      echo("Tell me private stuff: " . $Jake->sayIt() . "<BR />"); 

     ?> 
    </BODY> 
</HTML> 

Sortie:

Stefan's full name: Stefan Mischook. 
Tell me private stuff: 12345 
Jake's full name: Jake Hull. 
Tell me private stuff: 12345 // Here I was expecting an error 

Si je comprends bien, la variable privée n'est accessible qu'à partir de sa propre classe, et la variable protégée est accessible aussi en om les classes qui étendent la classe. J'ai la variable privée $pinnNumber. Donc je m'attendais à ce que j'obtienne une erreur si j'appelle $Jake->sayIt(). Parce que $Jake est membre de class Employee qui s'étend class Person. Et la variable $pinnNumber doit être accessible uniquement à partir de class Person, et non du class Employee.

Où est le problème?

+1

Êtes-vous 'pinnNumber' $ accèdent à l'employé de la classe? Vous accédez à 'sayIt()' qui est public, donc appelable. – Daan

+1

'Employee' a hérité de' Person'. 'Employee' n'a pas ** directement ** accédé à la variable' private'. Il a utilisé une méthode issue de la classe parente (héritée) et cette classe parente est autorisée à accéder à la variable. Par conséquent, tout est bon. – Mjh

+0

@Daan Oui, parce que $ Jack est membre de l'employé donc il prend toutes les propriétés de la personne. Toutes les fonctions, variables, mais si $ pinnNumber est privé, comment est-ce possible qui est montré en sortie. –

Répondre

4

En fait, ce n'est pas comment cela fonctionne. Comme vous ne l'avez pas prolongez la méthode sayIt(), il n'y a pas de « problème d'accessibilité », il y aurait un si vous avez fait quelque chose comme ceci:

<?php 
    class Person{ 
     var $name; 
     public $height; 
     protected $socialInsurance = "yes"; 
     private $pinnNumber = 12345; 

     public function __construct($personsName){ 
      $this->name = $personsName; 
     } 

     public function setName($newName){ 
      $this->name = $newName; 
     } 

     public function getName(){ 
      return $this->name; 
     } 

     public function sayIt(){ 
      return $this->pinnNumber; 
     } 
    } 

    class Employee extends Person{ 
     public function sayIt(){ 
      return $this->pinnNumber;//not accessible from child class 
     } 
    } 
-1

Protégé, public et privé sont juste des étendues d'environnement, dans votre cas, pour une classe. Puisque votre fonction satIt() est public, vous pouvez accéder à la fonction qui a alors la bonne portée d'environnement pour accéder à toutes les variables private ou protected.

Si vous avez essayé de le faire:

$Jake->pinnNumber 

En dehors de la classe, alors vous obtiendrez l'erreur.

Vous devriez rechercher plus sur Scopes dans les méthodes et les classes, vous pouvez passer à des fonctions anonymes;)

+0

Essayez d'étendre 'sayIt' dans' Employee' en utilisant 'this-> pinnNumber' et obtenez une erreur. –

+0

Cela est déjà dit ci-dessous, donc je viens d'ajouter plus à la réponse .. donc expliquer le vote vers le bas – KDOT

+1

La fonction 'sayIt' a accès à' pinnNumber' uniquement parce qu'elle n'est pas étendue dans la classe enfant, et non parce qu'elle est publique et a accès à toutes les variables. –