Php 继承是指从父级复制到子级,还是子级可以访问父级可见成员?
请接受我对OOP初学者的歉意, 根据以下代码:Php 继承是指从父级复制到子级,还是子级可以访问父级可见成员?,php,oop,inheritance,Php,Oop,Inheritance,请接受我对OOP初学者的歉意, 根据以下代码: Class Test{ private $name = "youhana"; function setPrivatePropFromInside(){ $this->name = "mina"; } function getPrivate(){ var_dump(__CLASS__); echo $this->name ; } } Class Test2
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();
我的问题是,继承是指从父对象复制到子对象,还是子对象可以访问父对象可见的成员
让我通过向两位问题成员提及我的想法来描述我为何感到困惑:
Class Test{
private $name = "youhana";
function getPrivate(){
var_dump(__CLASS__);
echo $this->name ;
}
}
如果(在本例中)您的公共getter和setter与私有属性存在于同一类/上下文中,那么这些方法可以访问私有属性(因为它们位于同一类/上下文中),并且可以从上下文之外访问它,因为getter/setter本身是公共的。我认为您的困惑来自于这样的想法
private $name = "youhana";
是存在于类声明中的静态值。在任何情况下,这只是在构造函数中声明变量值的一个简写,所以即使继承“复制”自父项,这也是一个错误的例子来说明这一点。您应该问的是:静态属性是否从父级复制?静态属性存在于类声明中,任何修改对该类的所有对象都是可见的。
答案是否。只传递对父级值的引用。 我写了一个简单的例子来说明
<?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() . "\n"; // foo+
$bar = new Bar();
$bar->modifyBarStatic();
print $bar->fooStatic() . "\n"; // foo+-
?>
正如您所见,即使child使用
sellf:$my_static
调用同一变量,child和parent都会修改同一变量。这里的主要问题是私有成员是否实例化,但这里我有继承的概念,我面临一个没有答案的问题,所以我提到了它,我提到了引起混淆的两个要点。我在这里的混淆会让专家们回答得更清楚。你能提供一个强大的教程或书籍来加强PHP中的OOP并做一些练习吗?
<?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() . "\n"; // foo+
$bar = new Bar();
$bar->modifyBarStatic();
print $bar->fooStatic() . "\n"; // foo+-
?>