<?php
 class base
 {
public function getName(){
   echo $this->name;
}
 }
  class son extends base
 {
private $name = "son";
 }
 $son = new son();
 $son->getName();
?> 
代码很简单,我的理解是:子类继承了父类的getName函数,而且getName是public的 所以应该可以访问子类中的私有变量,但是为什么这段程序报了“不能访问私有变量”的错误?修改下程序,在父类中增加个私有的name变量
<?php
 class base
 {
private $name = "base";
public function getName(){
   echo $this->name;
}
 }
  class son extends base
 {
private $name = "son";
 }
 $son = new son();
 $son->getName();
?> 程序没有报错,但是返回的是父类中的name的值,把子类的name变为public的也是一样,这里好像并不是调用子类继承过来的函数,而是调用了父类的函数,我记得之前学习JAVA的时候,根据OOP的多态性,此处调用的应该是子类的变量,所以这个过程很不理解,希望大家指点~~

解决方案 »

  1.   

    getName()函数只是调用base类中的$name变量,如果你想调用son类中的$name变量请这么写
    <?php 
    class base 

    private $name = "base"; 
    public function getName(){ 
      echo $this->name; 


      class son extends base 

    private $name = "son"; 
    public function getName(){  //重载
      echo $this->name; 

    $son = new son(); 
    $son->getName(); 
    ?> 
      

  2.   


    为什么还要重载呢?程序不是已经把这个函数继承过来了么?难道PHP的继承并不是真正有了这个函数,而是回调父类的函数?
      

  3.   

    原因很简单,因为private $name = "son";子类的成员变量是私有的,只能在类中使用.
    所以父类的成员函数,无法访问$name.
      

  4.   

    为什么是父类的函数,子类不是已经把getName()继承过来了么?它本身应该就有这个函数呀
      

  5.   

    我的理解是:既然son继承了base,也就继承了base的方法,也就是在不重载的前提下 son已经拥有了getName()方法,它也是public的,所以应该可以访问son内部任何修饰符的变量我觉得大家的理解是:son调用getName()的时候仍然是调用父类的那个getName函数,这样来继承还有什么作用呢?
      

  6.   

    class base 

    public function getName(){ 
      echo $this->name; 

    } 你单独一个父类实例的话,你的name变量在那里?这样的道理想不清楚吗?
      

  7.   

    1 private $name = "son";是私有的,只有类的成员函数能够访问.
    2 getName方法,是父类的方法,父类的方法无法访问子类的私有成员变量.
    这是规则.
    不能想当然.
      

  8.   

    <?php 
    class base 

    protected $name = "base"; 
    public function getName(){ 
      echo $this->name; 


      class son extends base 

      function __construct() {
         $this->name = "son";
      }

    这样就是把  父类的  $name  该覆盖了。.
    就可以得到  子类中了。
      

  9.   


    1 private $name = "son";是私有的,只有类的成员函数能够访问.这也正是我迷惑的,son继承base后它应该有了getName()这个成员函数了吧?
      

  10.   

    这也正是我迷惑的,son继承base后它应该有了getName()这个成员函数了吧?继承是这样的 不是继承以后就有了父类的对方和方法 而是可以使用public private protected 公共的 成员私有 私有 
      

  11.   


    你在程序下面加上
    print_r(get_class_methods($son))
    这行代码,可以打印出这个方法,是不是说明他其实是有这个方法的?
      

  12.   

    其实这个方法等同于
    public function getName()

      parent::getName(); 

    所以你就知道为什么不能访问了.将private $name = "son"; 改成 protected $name='son';就可以访问了.
      

  13.   


     class base
     {
    private $name = "base";
    public function getName(){
       echo $this->name;
    }
     }
     class son extends base
     {
    public $name = "son";
     }
     
     $son = new son();
     $son->getName();我把代码改了下,现在son类的name为public的,但是函数还是返回了base类的name值,这又是为什么呢?我打印了下$this,显示的是object(son),所以$this-name应为"son"呀
      

  14.   

    我劝LZ还是看看OO最基本的东西再来提问吧。这些问题根本没有任何讨论的必要。
      

  15.   

    收集自己平常生活学习中的心得,同时也能分享他人的心得  自由区为你打造专版小屋 http://sblig.517800.com  绝非广告 纯属个人收集 工作学习心得   大家一起动手  自己一个人收集太慢了
      

  16.   

    "当子类继承基类后,它就得到了基类所有的数据成员和成员方法"-- 这是think in java里对继承的描述
    但是根据现在程序的执行发现,其实他本身并没有拥有该成员方法,而是调用父类的成员方法,其实到这我也可以理解了,只是当子类调用父类成员方法的时候访问的仍然是父类的变量
     class base
     {
        private $name = "base";
        public function getName(){
           echo $this->name;
        }
     }
     class son extends base
     {
        public $name = "son";
     }
     
     $son = new son();
     $son->getName();这就想不明白了
      

  17.   

    要是子类都能访问父类的私有成员,那还要protected做什么?