<?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呢?

解决方案 »

  1.   

    第一个3000应该没什么疑问吧。第二个3000,是因为你用的是 return parent::getSal();我觉得结果没什么问题啊。很正常
      

  2.   


    你看过你的代码了吗?private  $sal=3000;
        public function getSal(){        
            return $this->sal;
        }    
    这是第一个类里面的函数,虽然下面的那个class是继承第一个,你在调用的时候,
    虽然初始化了后者.echo $manager->getSal();你在输出的时候, 仍然调用的是父类中的方法...这里注意,父类方法里面的return $this->sal;
    是返回父类中的$sal变量的值..自然就是3000而不是5000了明白了吗?
      

  3.   


    那要是把父类中的属性变成protected,结果却都是打印出5000,这个按你说的又该怎么解释呢?
      

  4.   

    是把两个地方的属性都改成protected
      

  5.   

    我认为是因为初始化Manager类之前先初始化其父类employee,sal属性实际只有一个,这里因为是私有的初始化成了3000所以就是3000了,如果是protected或者public就是使用的继承的属性5000了
      

  6.   

    私有变量是不能被改变的,你NEW一个对象的时候先初始化的是父类的变量,因此是3000,当改为protected或者public时,子类是可以更改父类的变量的,因此是当初始化完子类后,输出的就是5000了!
      

  7.   

    //这里返回的是父类的private属性.
    其实这里不是返回父类的private属性.
    而是执行父类的getSal()方法,而也就是执行了return $this->sal;
    这样一句代码,实际上还是返回当前对象的sal属性
      

  8.   

    如果把代码改成下面这样:<?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呢还是两个?
      

  9.   

      public function getParentSal(){
            return parent::getSal();//这里调用了父类的方法,输出当然就是3000。
        }    内参中应该是这样的:
    指针1->$sal;
    指针2->$sal;
      

  10.   

    内存中private  $sal=3000;是不是初始化父类的时候就初始化的?
    private   $sal=5000;这个子类无法覆盖父类的private  $sal=3000, 是不是因为子类显式的getSal()
    中的$htis->sal而产生的另个个sal变量呢?
    这样理解对么?
      

  11.   

    原来错误了, 
    分配了两段存储空间给父类和子类,分别包含自己的成员变量和函数入口,你调用的时候就分别调用了父类和子类的方法和成员变量
    Manager::getSal();调用的是Manager的$sal
    employee::getSal();调用的是employee的$sal继承只是某对象空间能否调用其他对象的成员变量和方法的问题,和这个无关