<?php
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}class Manager extends employee {
private $sal=5000;
public function getParentSal(){
//这里返回的是父类的private属性.
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();
?>输出的结果是:
PHP 5.3.0
3000
parent's $sal 3000为什么是两个3000呢?
你看过你的代码了吗?private $sal=3000;
public function getSal(){
return $this->sal;
}
这是第一个类里面的函数,虽然下面的那个class是继承第一个,你在调用的时候,
虽然初始化了后者.echo $manager->getSal();你在输出的时候, 仍然调用的是父类中的方法...这里注意,父类方法里面的return $this->sal;
是返回父类中的$sal变量的值..自然就是3000而不是5000了明白了吗?
那要是把父类中的属性变成protected,结果却都是打印出5000,这个按你说的又该怎么解释呢?
其实这里不是返回父类的private属性.
而是执行父类的getSal()方法,而也就是执行了return $this->sal;
这样一句代码,实际上还是返回当前对象的sal属性
class employee{
private $sal=3000;
public function getSal(){
return $this->sal;
}
}class Manager extends employee {
private $sal=5000;
public function getSal(){
return $this->sal;
}
public function getParentSal(){
return parent::getSal();
}
}
$manager = new Manager();
echo "PHP ".phpversion()."<br>";
echo $manager->getSal();
echo "<br>";
echo "parent's \$sal ".$manager->getParentSal();?>这样输出的结果是:
PHP 5.3.0
5000
parent's $sal 3000这个时候5000很容易理解,3000又是怎么回事?此时内存是一个$sal呢还是两个?
return parent::getSal();//这里调用了父类的方法,输出当然就是3000。
} 内参中应该是这样的:
指针1->$sal;
指针2->$sal;
private $sal=5000;这个子类无法覆盖父类的private $sal=3000, 是不是因为子类显式的getSal()
中的$htis->sal而产生的另个个sal变量呢?
这样理解对么?
分配了两段存储空间给父类和子类,分别包含自己的成员变量和函数入口,你调用的时候就分别调用了父类和子类的方法和成员变量
Manager::getSal();调用的是Manager的$sal
employee::getSal();调用的是employee的$sal继承只是某对象空间能否调用其他对象的成员变量和方法的问题,和这个无关