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 に答える
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 に答える