自己写了一点测试继承关系的代码,如下:<html><body>
<?php
class A
{
public $pub_A;
private $pri_A;
public function pub()
{
$this->pub_A = 'It is public of A!';
echo "<p>".$this->pub_A."</p>";
}
protected function pri()
{
$this->pri_A = 'It is private of A!';
echo "<p>".$this->pri_A."</p>";
}
}

class B extends A
{
public $pub_B;
private $pri_B;
function __construct()
{
echo "<p>".$this->pri()."</p>";
$this->pri_A = 10;
echo "<p>".$this->pri_A."</p>";
}
}
$b = new B;

?>
</body></html>重点我标了出来,在父类A中,$pri_A是private的,应该不能被子类B继承,可为什么下面可以对pri_A赋值并且显示出赋值后的数?

解决方案 »

  1.   

    private:方法或者属性只能从类的一个成员中访问到,而且无法从继承类的成员中访问到。经过private便签标记的方法或者属性可以在继承类中重新定义。每一个类只能看到它自己定义的私有方法。
      

  2.   


    我测试了下代码,如果在A中给$pri_A="aaa",在B中不赋值的话将不能得到值,在B中赋值之后得到赋值后的值,可见在子类中是可以对父类的私有属性重新定义的。
      

  3.   


    问题不是子类访问了 父类的 私有成员而是 子类调用了$this->pri()方法  这个方法是继承父类的  但是父类的这个方法调用了父类的私有成员 
      

  4.   

    还是不太懂,有点糊涂了,private不是不能继承么?为什么子类B可以访问并且修改它的值?
      

  5.   


    我确实在子类B中调用了父类A的一个方法,但那个是protected,下面倒数第二行的红字很明显是子类B访问并修改了父类A的私有变量
      

  6.   

    是的,私有属性不被继承!
    这一点你可以通过这样看到
    function __construct()
    {
    echo "<p>".$this->pri()."</p>";
    echo isset($this->pri_A) ? 'yes' : 'no';//这里将输出 no
    $this->pri_A = 10;
    echo "<p>".$this->pri_A."</p>";
    }pri() 方法是父类的,自然可以访问其私有属性当你 $this->pri_A = 10; 后,将在对象 $b 中创建名为 pri_A 的公共属性(public)
    这一点你可以这样看到
    print_r($b);
    输出:
    B Object
    (
        [pub_B] => 
        [pri_B:private] => 
        [pub_A] => 
        [pri_A:private] => It is private of A!
        [pri_A] => 10
    )
      

  7.   


    厄......是不是说这个$pri_A是子类B重新声明的一个变量?和父类A中的$pri_A是重名不同人?
      

  8.   

    <?php
    /*
    class Person {
         private $name;
         private $age;    function say() {
            echo "我的名字叫:".$this->name."<br />";
    echo "我的年龄是:".$this->age;
        }
    }// 类的继承
    class Student extends Person {
        private  $school;    //学生所在学校的属性

        function study() {
            echo "我的名子叫:".$this->name."<br />";
            echo "我正在".$this->school."学习";
        }
    }$t1 = new Student();
    $t1->name = "张三";
    //$t1->school = "人民大学";
    $t1->study();*/
    class A
    {
    private $a=5;}class B extends A
    {
    public function say()
    {
    echo $this->a;

    }

    }
    $ca=new A();
    $ca->b=10;//相当于有定义了一个变量;
    echo $ca->b;$cb=new B();
    $cb->say();$cb=new B();
    $cb->a=20;//B里面没有继承a变量,这行代码相当于重新第一了一个变量a;
    $cb->say();?>
      

  9.   

    class A
    {
    private $a=5;}class B extends A
    {
    public function say()
    {
    echo $this->a;

    }

    }
    $ca=new A();
    $ca->b=10;//相当于有定义了一个变量;
    echo $ca->b;$cb=new B();
    $cb->say();$cb=new B();
    $cb->a=20;//B里面没有继承a变量,这行代码相当于重新第一了一个变量a;
    $cb->say();?>