9

我正在尝试扩展 PHP 类而不重写整个内容。这是一个例子:

<?
$a = new foo();
print $a->xxx();
$b = new bar();
print $b->xxx();

class foo {
  const something = 10;

  public function xxx() {
    $this->setSomething();
    return $this->something;
  }

  private function setSomething() {
    $this->something = self::something;
  }
}

class bar extends foo {

  public function xxx() {
    $this->setSomething();
    $this->something++;
    return $this->something;
  }

}
?>

但是,当我运行脚本时,出现以下错误:

Fatal error: Call to private method foo::setSomething() from context 'bar' in test.php on line 23

看起来 bar 没有继承私有函数 setSomething()。在不修改 foo 类的情况下如何解决这个问题?

4

6 回答 6

15

,如果不修改 foo 类,您将无法解决此问题。因为继承的类不能访问父类的私有成员。这是一个非常基本的规则。

声明setSomething()protected。会解决的。

手册

于 2012-04-09T06:52:03.267 回答
8

私有成员不可继承,不能在子类中使用。在课堂外无法访问它们。

您必须需要将该功能设为受保护或公开。该类和继承的类可以访问受保护的成员。因此,您最好的选择是使该功能受到保护。

于 2012-04-09T06:51:45.857 回答
7

bar继承函数没问题,但它不能调用它。这就是private方法的全部意义,只有声明类可以调用它们。

于 2012-04-09T06:54:01.353 回答
4

尝试反射

http://php.net/manual/en/class.reflectionclass.php

还:

从 PHP 中的类外部调用私有方法和私有属性

于 2012-04-09T06:57:02.313 回答
1

你试过这个吗?

class bar extends foo {

    public function xxx() {
      $this->something = parent::xxx();
      $this->something++;
      return $this->something;
    }
}

注意parent::xxx(); 是公开的,所以它应该可以工作......即使它看起来像一个静态调用。

于 2015-10-16T21:12:09.967 回答
0

不修改原来的类,继承的类是没有办法直接调用private父类的方法的。

于 2012-04-09T06:55:53.657 回答