2016-03-31 17 views
1

Ich habe den folgenden Code: Klassendefinition:PHP OOP private protected

<?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{ 
    } 

und der Teil mit Instanzen:

<!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> 

Ausgang:

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 

Wie ich verstehe, Auf die private Variable kann nur von ihrer eigenen Klasse zugegriffen werden, und die geschützte Variable ist auch für fr zugänglich om die Klassen, die die Klasse erweitern. Ich habe die private Variable $pinnNumber. Also habe ich erwartet, dass ich einen Fehler bekomme, wenn ich $Jake->sayIt() rufe. Denn $Jake ist Mitglied von class Employee, das sich erweitert class Person. Und die Variable $pinnNumber sollte nur von class Person zugänglich sein, nicht von der class Employee.

Wo ist das Problem?

+1

Sind Sie '$ pinnNumber' in der Klasse Mitarbeitern zugreifen? Sie greifen auf 'sayIt()' zu, das öffentlich und damit aufrufbar ist. – Daan

+1

"Mitarbeiter" von "Person" geerbt. 'Mitarbeiter' hat nicht ** direkt ** auf die' private' Variable zugegriffen. Es wurde eine Methode verwendet, die von der übergeordneten Klasse stammt (sie wurde geerbt), und diese übergeordnete Klasse darf auf die Variable zugreifen. Deshalb ist alles gut. – Mjh

+0

@Daan Ja, weil $ Jack Mitglied von Employee ist, also nimmt es alle Eigenschaften von Person. Alle Funktionen, Variablen, aber wenn $ pinnNumber privat ist, wie ist das möglich, das in der Ausgabe angezeigt wird. –

Antwort

4

Eigentlich, das ist nicht, wie es funktioniert. Wie Sie die sayIt() Methode nicht verlängern haben, gibt es kein „Zugänglichkeit Problem“, würde es sein, wenn Sie so etwas wie dies tun:

<?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

Geschützt, öffentlich und privat sind nur Umweltbereiche, in Ihrem Fall für eine Klasse. Da Ihre satIt()-Funktion public ist, können Sie auf die Funktion zugreifen, die dann den richtigen Umgebungsbereich für den Zugriff auf private oder protected Variablen hat.

Wenn Sie versucht zu tun:

$Jake->pinnNumber 

Außerhalb der Klasse, dann würden Sie den Fehler.

Sie sollten in Methoden und Klassen, die mehr über Scopes recherchieren, dann können Sie auf anonyme Funktionen bewegen;)

+0

Versuchen Sie, 'sayIt' in' Employee' mit 'this-> pinnNumber' zu erweitern und eine Fehlermeldung zu erhalten. –

+0

Das ist bereits unten gesagt, so habe ich nur mehr zur Antwort hinzugefügt .. so erklären Sie die Abstimmung nach unten – KDOT

+1

'sayIt' Funktion hat Zugriff auf' pinnNumber' nur, weil es nicht in der Kindklasse erweitert wird, und nicht weil es öffentlich ist und Zugriff hat zu allen Variablen. –