PHP ООП переопределить закрытый метод / функцию в дочернем классе

Внутренний пример 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 переменная.

Теперь у меня вопрос, это плохая практика:

  1. Перезаписать / переопределить функцию частной собственности в дочернем классе?
  2. Создать вторую функцию printHello2() в дочернем классе, когда он уже есть в родительском классе, это делает код немного спагеттишным, не так ли?
  3. Та же самая точная логика применяется к частным методам правильно?

1

Решение

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 не существует в классах-потомках.

1

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

Других решений пока нет …

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