2016-03-31 3 views
1

У меня есть следующий код: определение Класса:PHP OOP Личная

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

И часть с экземплярами:

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

Выход:

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 

Как я понимаю, частная переменная доступна только из собственного класса, и защищенная переменная доступна также fr om классы, расширяющие класс. У меня есть переменная $pinnNumber. Поэтому я ожидал, что получаю сообщение об ошибке, если я позвоню $Jake->sayIt(). Потому что $Jake является членом class Employee, который распространяется на class Person. И переменная $pinnNumber должна быть доступна только от class Person, а не от class Employee.

Где проблема?

+1

Вы с доступом '$ pinnNumber' в сотруднике класса? Вы получаете доступ к 'sayIt()', который является общедоступным, таким образом вызываемым. – Daan

+1

«Сотрудник» унаследован от «Личности». «Сотрудник» не ** напрямую ** не попадал в переменную 'private'. Он использовал метод, который поступает из родительского класса (он был унаследован), и этому родительскому классу разрешен доступ к переменной. Поэтому все хорошо. – Mjh

+0

@ Даан Да, потому что $ Jack является членом Employee, поэтому он принимает все свойства Person. Все функции, переменные, но если $ pinnNumber является приватным, как это возможно, что показано на выходе. –

ответ

4

На самом деле, это не так, как это работает. Как вы не распространялись метод sayIt(), нет «доступности проблемы», там будет один, если вы сделали что-то вроде этого:

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

Охраняемые, общественные и частные объекты - это всего лишь окружающие области, в вашем случае, для класса. Так как ваша функция satIt() имеет значение public, вы можете получить доступ к функции, которая имеет правильную область видимости для доступа к любым переменным .

Если вы пытались сделать:

$Jake->pinnNumber 

Вне класса, то вы получите сообщение об ошибке.

Вы должны исследовать больше о Скоупсом методов и классов, то вы можете перейти на анонимные функции;)

+0

Попробуйте расширить 'sayIt' в' Employee' с помощью 'this-> pinnNumber' и получить сообщение об ошибке. –

+0

Это уже сказано ниже, поэтому я просто добавил больше ответа. Так что объясните, что голосование – KDOT

+1

Функция 'sayIt' имеет доступ к' pinnNumber' только потому, что она не расширена в классе child, а не потому, что она общедоступна и имеет доступ ко всем переменным. –