Is Inheritance means copy from parent to child or the child gain access to the parent visible members?
接受我作为OOP初学者的道歉,根据以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Class Test{ private $name ="youhana"; function setPrivatePropFromInside(){ $this->name ="mina"; } function getPrivate(){ var_dump(__CLASS__); echo $this->name ; } } Class Test2 extends Test { } $obj2 = new Test2(); $obj2->getPrivate(); |
我的问题是,继承意味着从父级复制到子级,还是子级获得对父级可见成员的访问权?
让我通过与两个问题成员提到我的想法来描述我为什么会感到困惑:
所以上面提到的代码等于:
1 2 3 4 5 6 7 8 | Class Test{ private $name ="youhana"; function getPrivate(){ var_dump(__CLASS__); echo $this->name ; } |
}
1 2 3 4 5 6 |
我读了20多篇参考文献,仍然感到困惑,再次接受我作为初学者寻找正确方法的道歉。
注意:我在这里问了一个问题,但是在研究了更多的参考资料之后,我又回到了困惑中,所以我需要一个可靠的答案。
这与"复制"无关……类定义方法和属性,以及指示从何处可以访问这些方法和属性的可见性。
当一个类扩展另一个类时,您将创建继承层次结构或树,或一组类上下文。
当您实例化一个子类时,实际上是在实例化继承该完整树的对象。
当您针对该实例调用一个方法时,它会查看子类定义中是否存在(并且可以访问)该方法。如果是,它将在该上下文中执行:如果不是,它将查看父类中是否存在该方法;如果是,它将在该上下文中执行该方法。
当方法在类扩展层次结构中的特定上下文中执行时,它可以访问该上下文中可见的所有内容。私有属性只能在定义它们的上下文/定义它们的类中访问;但是该上下文/类中的方法可以访问这些私有属性。
如果(在本例中)公共getter和setter与private属性位于同一类/上下文中,那么这些方法可以访问private属性(因为它们位于同一类/上下文中),并且可以从该上下文之外访问它,因为getter/setter本身是公共的。
Is Inheritance means copy from parent to child or the child gain
access to the parent visible members?
子类可以访问父类的可见成员。此外,您还可以灵活地重写父类的特性(方法)。
我认为你的困惑来自于
1 | private $name ="youhana"; |
是类声明中存在的静态值。在任何情况下,这只是在构造函数中声明变量值的一个简写,因此即使从父级继承"copy"也是一个错误的示例。您应该问的是:静态属性是从父级复制的吗?静态属性存在于类声明中,并且该类的所有对象都可以看到任何修改。关于静态属性的PHP文档答案是"否"。只传递对父级值的引用。我写了一个简单的例子来说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } public function modifyFooStatic(){ return self::$my_static .= '+'; } } class Bar extends Foo { public function fooStatic() { return self::$my_static; } public function modifyBarStatic(){ return self::$my_static .= '-'; } } $foo = new Foo(); $foo->modifyFooStatic(); print $foo->staticValue() ." "; // foo+ $bar = new Bar(); $bar->modifyBarStatic(); print $bar->fooStatic() ." "; // foo+- ?> |
正如您所看到的,即使子变量使用