PHP ООП частная защита

У меня есть следующий код:
Определение класса:

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

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

В чем проблема?

1

Решение

На самом деле это не так.
Как вы не продлили 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
}
}
4

Другие решения

Защищенные, публичные и частные — это, в вашем случае, просто классы окружающей среды для класса. Так как ваш satIt() функция public, вы можете получить доступ к функции, которая затем имеет правильную область действия для доступа к любому private или же protected переменные.

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

$Jake->pinnNumber

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

Вам следует больше изучить Scopes в методах и классах, а затем переходить к анонимным функциям;)

-1

По вопросам рекламы [email protected]