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
变量的新值。
现在我的问题是这种不好的做法是:
- Overwrite/Redeclare child 中的私有 属性 函数 class?
- 在 child class 中创建第二个函数
printHello2()
当 parent class 中已经有一个函数时,这会使代码有点像意大利面条一样,不是吗?
- 将相同的逻辑应用于私有方法是否正确?
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 1
和 Private 2
的原因。私有变量不在家族中 "shared"。你什么都不是 "overwriting",因为 private 1
不存在于后代 classes.
在 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
变量的新值。
现在我的问题是这种不好的做法是:
- Overwrite/Redeclare child 中的私有 属性 函数 class?
- 在 child class 中创建第二个函数
printHello2()
当 parent class 中已经有一个函数时,这会使代码有点像意大利面条一样,不是吗? - 将相同的逻辑应用于私有方法是否正确?
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 1
和 Private 2
的原因。私有变量不在家族中 "shared"。你什么都不是 "overwriting",因为 private 1
不存在于后代 classes.