如果在Child中替换了子对象,如何从子对象访问父变量?

时间:2014-11-15 11:51:14

标签: php oop parent-child

我有两个类 - 使用变量$ number的Parent“First”,我在其中更改了属性$ number的Child类“Second”。

如果在Child中替换了子对象,如何从子对象访问父变量?

我们无法改变现在的属性和方法。

class First {

  protected $number = "First";

  protected function getNumber() {

     return $this->number;

  }

}

class Second extends First {

  protected $number = "Second";

  protected $count = "One More";

}

$first = new First;

$second = new Second;

// must show "First"
echo $second->getNumber();

2 个答案:

答案 0 :(得分:0)

getNumber()方法声明为protected,因此您的示例代码将导致致命错误。

引用php文档:

  

声明受保护的成员只能在类中访问   本身以及继承和父类。

链接:http://php.net/manual/en/language.oop5.visibility.php

因此,您首先需要创建自己的自定义类,扩展Second,并覆盖getNumber方法或创建另一个实例化父类的方法,以便返回其$ number值。您的方法应声明为public能够从课堂外访问它。见下面的例子:

class First {

  protected $number = "First";

  protected function getNumber() {

     return $this->number;

  }

}

class Second extends First {

  protected $number = "Second";

  protected $count = "One More";

}

class CustomClass extends Second {


  public function callSecondClassParentGetNumberMethod() {

    $parentClass=get_parent_class('Second');
    $parent=new $parentClass;
    //or if you know the parent class just call it directly:
    //$parent =new First;
     return $parent->getNumber();

  }

}


$customClass = new CustomClass;

// shows "First"
echo $customClass->callSecondClassParentGetNumberMethod();

答案 1 :(得分:0)

谢谢, matwr 这么多......你今天过得好!

我只是对您的解决方案做了一些小改动,这很有效。

class First {

protected $number = "First";

protected function getNumber() {

    return $this->number;

}

}

类Sec​​ond扩展First {

protected $number = "Second";

public function getNumber() {

    $parent = new First;

    return $parent->getNumber();

}

}

$ first = new First;

$ second = new Second;

//显示“First” echo $ second-> getNumber();