2016-10-28 5 views
0

Внутри PHP руководство пример http://php.net/manual/en/language.oop5.visibility.php#example-242 он говоритPHP OOP переобъявить частный метод/функцию в дочернем классе

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

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

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. Точная точная логика применяется к частным методам правильно?

ответ

0

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