3

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

我们可以重新声明 public 和 protected 方法,但不能重新声明私有方法

他们是什么意思我可能没有得到如何正确使用继承但说我们有这个代码。

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变量,但是当我在子类中运行时,它确实显示了变量的新值。MyClass1printHello1()printHello2()MyClass2$private

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

  1. 覆盖/重新声明子类中的私有属性函数?
  2. 当父类中已经有一个函数时,在子类中创建第二个函数printHello2(),这会使代码有点意大利面,不是吗?
  3. 相同的逻辑适用于私有方法对吗?
4

1 回答 1

1

private仅限于那个特定的类及其代码。它对后代类是不可见的。例如,如果你消除private $privateMyClass2 中的:

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 1and的原因Private 2。私有变量在家庭中不是“共享的”。你没有“覆盖”任何东西,因为private 1在后代类中不存在。

于 2016-10-28T16:44:48.427 回答