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

Внутри php ручной пример http://php.net/manual/en/language.oop5.visibility.php это говорит

Мы можем переопределить публичный и защищенный метод, но не приватный

что они имеют в виду, что я могу не понимать, как правильно использовать наследование, но сказать, что у нас есть этот код.

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

Другие вопросы по тегам