子类是不是继承父类的私有成员? [复制]
Posted
技术标签:
【中文标题】子类是不是继承父类的私有成员? [复制]【英文标题】:Is subclass inherits private members from parent class? [duplicate]子类是否继承父类的私有成员? [复制] 【发布时间】:2018-06-14 01:40:11 【问题描述】:我有两个关于 OOP 继承对象的问题:
第一个是根据下面的代码:
class Test
private $name = "Youhana";
function getPrivate()
echo $this->name ;
Class Test2 extends Test
$obj2 = new Test2();
$obj2->getPrivate();
结果将是 => Youhana,但是这是如何工作的,尽管继承意味着成员是从父级克隆到子级的,所以如果这是正确的,那么子类中的代码必须类似于以下逻辑:
Class Test2 // simple imagination to the Test2 after extends Test CLass
function getPrivate() //which must return null not the value of the private member.
echo $this->name ;
参考:Manual
第二个问题是考虑下面的代码:
Class Ex1
function checkClassName()
var_dump(__CLASS__);
Class Ex2 extends Ex1
$obj2 = new Ex2();
$obj2->checkClassName();//how this will return EX1 although we invoked this function from the second object which after the inheritance will have a clone of public and protected members of the parent class?
虽然我们从第二个对象调用了这个函数,但它如何返回 EX1,在继承之后将有父类的公共和受保护成员的克隆?
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:当您从超类扩展时,不会“克隆”任何内容。这是错误的看待这个问题的方式。该类基本上是用于创建实例的模板。
超类中的private
属性仅对该超类中定义的方法可见。这就是为什么它被称为“可见性”。
当您创建子类时,private
属性仍然存在。它们只是在子类中定义的方法中不可见。
class Foo
private $x = 1;
public function check()
return $this->x;
class Bar extends Foo
public $x = 2;
class Buz extends Foo
private $x = 3;
public function check()
return $this->x;
$n = new Bar;
var_dump($n); /*
object(Bar)#1 (2)
["x"]=>
int(2)
["x":"Foo":private]=>
int(1)
*/
var_dump($n->check()); // int(1)
$k = new Buz;
var_dump($k->check()); // int(3)
https://3v4l.org/KkTD2
当你扩展一个类时,你正在创建一个专门的 subtype case,它应该仍然是 compatible 与原始超类. private
与extend
一起使用时,其意义在于定义不受任何行为变化影响的部分。
至于__CLASS__
,它是一个“神奇的常数”(暗示这实际上不是常数),由访问它的上下文决定。它会给你类的名字,然后在里面写__CLASS__
。
不过,我不知道你想用它做什么,因为你不应该在生产代码中使用它。
【讨论】:
所以你的意思是继承意味着只调用和访问父类,这是否正确?你完美的例子证明了这一点。 当你有一个对象时,你实际上并不是在“调用一个类”。相反,您正在与基于“模板”制作的实例进行交互。extend
关键字应该用于添加更专业的行为(参见:LSP)。另外,你的英语很烂:(
@tereško 您能否为magic constants __CLASS__
的范围解析添加解释,以解决OP 的第二个问题?
继承不是子类型。子类型是指接口的兼容性。继承是指实现的重用。谷歌“继承与子类型化”、“子类化与子类型化”,更多信息请参阅 William Cook 和 Alistair Cockburn 的论文。
@reaanb thnx。稍微清理了一下。它只是一种表达方式,而不是技术术语。而且,不,上一句中的“表达”也没有用作技术术语。【参考方案2】:
我想解释一下克隆的概念。
假设,我们有 classA
具有 3 个属性:
- private int x
- protected int y
- public int z
然后我们有一个继承自ClassA
的ClassB
。
在这种情况下,我们将克隆用作结构克隆。意味着父类的所有属性和方法都克隆到子类中。我们可以通过获取子类实例的大小来证明这一点。
但是,他们是访问策略。这是 OOP 中的封装。
ClassB
具有 x
,y
,z
属性。但它无法访问x
。 (因为封装)
结构克隆概念在运行时很重要。在运行时,孩子和父母之间没有任何关系。克隆到子级的父级的所有结构。在子类中,我们可以使用super
(在java中)和base
(在C#中)等关键字来访问这个克隆的部分。
最后,正如我所说,在子类中,我们有父类的私有成员。我们可以使用按语言提供的关键字访问它们。但是,由于封装原则,我们无法访问私有数据。
【讨论】:
没有。 php 中的克隆是一个特定的事情:secure.php.net/manual/en/language.oop5.cloning.php 免责声明:我不懂 PHP,我的专业是 Java。但是,请考虑我所说的结构克隆是指在编译过程中复制类的结构。 不是编程中的对象克隆。以上是关于子类是不是继承父类的私有成员? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
继承的基本概念: Java不支持多继承,也就是说子类至多只能有一个父类。 子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 子类中定义的成员变量和父类中