Внутренний пример php руководства http://php.net/manual/en/language.oop5.visibility.php#example-242 это говорит
Мы можем переопределить публичный и защищенный метод, но не приватный
что они имеют в виду мой, что я не понимаю, как правильно использовать наследование но скажем, у нас есть этот код.
class MyClass1 {
public $public = 'Public 1';
protected $protected = 'Protected 1';
private $private = 'Private 1';
function printHello1() {
echo $this->public . " MyClass1 ". PHP_EOL;
echo $this->protected . " MyClass1 " . PHP_EOL;
echo $this->private . " MyClass1 " . PHP_EOL;
}
}class MyClass2 extends MyClass1 {
public $public = 'Public 2';
protected $protected = 'Protected 2';
private $private = 'Private 2';
function printHello2() {
echo $this->public . " MyClass2 ". PHP_EOL;
echo $this->protected . " MyClass2 " . PHP_EOL;
echo $this->private . " MyClass2 " . PHP_EOL;
}
}
$obj2 = new MyClass2();
$obj2->printHello1();
$obj2->printHello2();
вернусь
Public 2 MyClass1
Protected 2 MyClass1
Private 1 MyClass1
Public 2 MyClass2
Protected 2 MyClass2
Private 2 MyClass2
Похоже, я могу создать другой $private
переменная в MyClass2
без проблем, так почему они говорят, что его мы не можем?
да это не меняет $private
переменная в MyClass1
когда я использую функцию printHello1()
в родительском классе, однако, когда я бегу printHello2()
в детском классе MyClass2
это показывает новое значение для $private
переменная.
Теперь у меня вопрос, это плохая практика:
printHello2()
в дочернем классе, когда он уже есть в родительском классе, это делает код немного спагеттишным, не так ли?private
ограничивается ТО конкретным классом и его кодом. Он невидим для классов-потомков. Например. если вы устраните private $private
в MyClass2:
class MyClass2 extends MyClass1 {
// private $private = 'Private 2';
^^---literally the only change
и затем запустите код:
Public 2 MyClass1
Protected 2 MyClass1
Private 1 MyClass1
Public 2 MyClass2
Protected 2 MyClass2
PHP Notice: Undefined property: MyClass2::$private in /home/sites/ca.usask.vido-inout/html/z.php on line 25
MyClass2
Вот почему вы получаете Private 1
а также Private 2
, частные переменные не «разделяются» внутри семьи. Вы ничего не «перезаписываете», потому что private 1
не существует в классах-потомках.
Других решений пока нет …