php5中很诡异的问题,请高手指教

zhongqixing1104 2009-10-03 03:32:33

<?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呢?
...全文
114 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvhong84 2009-10-06
  • 打赏
  • 举报
回复
原来错误了,
分配了两段存储空间给父类和子类,分别包含自己的成员变量和函数入口,你调用的时候就分别调用了父类和子类的方法和成员变量
Manager::getSal();调用的是Manager的$sal
employee::getSal();调用的是employee的$sal

继承只是某对象空间能否调用其他对象的成员变量和方法的问题,和这个无关
lvhong84 2009-10-06
  • 打赏
  • 举报
回复
原来错误了,
分配了两段存储空间给父类和子类,分别包含自己的成员变量和函数入口,你调用的时候就分别调用了父类和子类的方法和成员变量
lvhong84 2009-10-05
  • 打赏
  • 举报
回复
//这里返回的是父类的private属性.
其实这里不是返回父类的private属性.
而是执行父类的getSal()方法,而也就是执行了return $this->sal;
这样一句代码,实际上还是返回当前对象的sal属性
dzxccsu 2009-10-05
  • 打赏
  • 举报
回复
私有变量是不能被改变的,你NEW一个对象的时候先初始化的是父类的变量,因此是3000,当改为protected或者public时,子类是可以更改父类的变量的,因此是当初始化完子类后,输出的就是5000了!
lvhong84 2009-10-05
  • 打赏
  • 举报
回复
我认为是因为初始化Manager类之前先初始化其父类employee,sal属性实际只有一个,这里因为是私有的初始化成了3000所以就是3000了,如果是protected或者public就是使用的继承的属性5000了
zhongqixing1104 2009-10-05
  • 打赏
  • 举报
回复
是把两个地方的属性都改成protected
zhongqixing1104 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhufeng16 的回复:]
引用 4 楼 zhongqixing1104 的回复:
为什么第一个是3000而不是5000呢


你看过你的代码了吗?PHP codeprivate$sal=3000;publicfunction getSal(){return$this->sal;
}

这是第一个类里面的函数,虽然下面的那个class是继承第一个,你在调用的时候,
虽然初始化了后者.

echo $manager->getSal();

你在输出的时候, 仍然调用的是父类中的方法...

这里注意,父类方法里面的return $this->sal;
是返回父类中的$sal变量的值..

自然就是3000而不是5000了

明白了吗?
[/Quote]

那要是把父类中的属性变成protected,结果却都是打印出5000,这个按你说的又该怎么解释呢?
zhongqixing1104 2009-10-05
  • 打赏
  • 举报
回复
内存中private $sal=3000;是不是初始化父类的时候就初始化的?
private $sal=5000;这个子类无法覆盖父类的private $sal=3000, 是不是因为子类显式的getSal()
中的$htis->sal而产生的另个个sal变量呢?
这样理解对么?
dzxccsu 2009-10-05
  • 打赏
  • 举报
回复
 public function getParentSal(){
return parent::getSal();//这里调用了父类的方法,输出当然就是3000。
}

内参中应该是这样的:
指针1->$sal;
指针2->$sal;
zhongqixing1104 2009-10-05
  • 打赏
  • 举报
回复
如果把代码改成下面这样:

<?php
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呢还是两个?
StackWorm 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhongqixing1104 的回复:]
为什么第一个是3000而不是5000呢
[/Quote]

你看过你的代码了吗?
private  $sal=3000;
public function getSal(){
return $this->sal;
}


这是第一个类里面的函数,虽然下面的那个class是继承第一个,你在调用的时候,
虽然初始化了后者.

echo $manager->getSal();

你在输出的时候, 仍然调用的是父类中的方法...

这里注意,父类方法里面的return $this->sal;
是返回父类中的$sal变量的值..

自然就是3000而不是5000了

明白了吗?
zhongqixing1104 2009-10-03
  • 打赏
  • 举报
回复
为什么第一个是3000而不是5000呢
  • 打赏
  • 举报
回复
呵呵,这个没什么问题吧
zhongqixing1104 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 abest 的回复:]
第一个3000应该没什么疑问吧。

第二个3000,是因为你用的是 return parent::getSal();

我觉得结果没什么问题啊。很正常


[/Quote]

我的疑问就是第一个3000
应该网 2009-10-03
  • 打赏
  • 举报
回复
第一个3000应该没什么疑问吧。

第二个3000,是因为你用的是 return parent::getSal();

我觉得结果没什么问题啊。很正常

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧