PHP OOP 在 child class 中重新声明私有 method/function

PHP OOP redeclare private method/function in child class

在 php 手册示例 http://php.net/manual/en/language.oop5.visibility.php#example-242 里面说

We can redeclare the public and protected method, but not private

我的那个是什么意思我可能不知道如何正确使用继承但是说我们有这段代码。

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();

将return

Public 2 MyClass1
Protected 2 MyClass1
Private 1 MyClass1

Public 2 MyClass2 
Protected 2 MyClass2 
Private 2 MyClass2 

似乎我可以在 MyClass2 中创建另一个 $private 变量而没有任何问题,那么为什么他们说 我们不能

是的,当我在 parent class 中使用函数 printHello1() 时,它不会更改 MyClass1 中的 $private 变量,但是当我 运行 printHello2() 在 child class MyClass2 它确实显示了 $private 变量的新值。

现在我的问题是这种不好的做法是:

  1. Overwrite/Redeclare child 中的私有 属性 函数 class?
  2. 在 child class 中创建第二个函数 printHello2() 当 parent class 中已经有一个函数时,这会使代码有点像意大利面条一样,不是吗?
  3. 将相同的逻辑应用于私有方法是否正确?

private 仅限于特定的 class 及其代码。它对后代 classes 是不可见的。例如。如果你删除 MyClass2 中的 private $private:

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 1Private 2 的原因。私有变量不在家族中 "shared"。你什么都不是 "overwriting",因为 private 1 不存在于后代 classes.