gpt4 book ai didi

PHP OOP 在子类中重新声明私有(private)方法/函数

转载 作者:行者123 更新时间:2023-12-04 17:56:00 26 4
gpt4 key购买 nike

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

会回来

Public 2 MyClass1
Protected 2 MyClass1
Private 1 MyClass1

Public 2 MyClass2
Protected 2 MyClass2
Private 2 MyClass2

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

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

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

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

最佳答案

private 仅限于特定类及其代码。它对后代类是不可见的。例如。如果你删除 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 的原因。私有(private)变量不在家庭中“共享”。你没有“覆盖”任何东西,因为 private 1 在后代类中不存在。

关于PHP OOP 在子类中重新声明私有(private)方法/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40309468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com