2012-04-09 20 views
6

私はすべてを書き直すことなくPHPクラスを拡張しようとしています。ここでは一例です:私は、スクリプトを実行したときに別のものを拡張する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 

バーが(プライベート関数setSomethingを継承していないように思わ)。 fooクラスを変更せずにこれを修正するにはどうすればよいですか?

+0

'setSomething()'を 'protected'に変更することはできませんか? – alex

+0

上記のとおり、fooクラスは変更されません。どのように私はこれを行うことができますか? –

+0

ジョブには適切なツールを使用します。つまり、そのツールを「保護」します。 – alex

答えて

4

barを参照してくださいは大丈夫機能を継承ですが、それはそれを呼び出すことはできません。これは、privateメソッドの全体のポイントです。宣言するクラスだけが呼び出すことができます。

+0

私はバークラスで明示的にsetSomething()を再定義する必要がありますか? –

+1

はい、それはこれを行う* sane *メソッドです。 – deceze

+5

より良い方法は、親クラスでprotectedを使用することです;)それは外部から非公開のままですが、 "子"クラスはそれにアクセスできます。 –

6

プライベートメンバーは継承できません。サブクラスでは使用できません。彼らはクラス外ではアクセスできません。

この機能は、保護されているか公開されている必要があります。保護されたメンバは、そのクラスおよび継承されたクラスに対してアクセス可能です。だから、あなたの最善の策は、その機能をProtectedにすることです。

+0

上記のとおり、fooクラスは変更されません。どのように私はこれを行うことができますか? –

+0

@KennethVogt:ここには選択肢がありません。 –

13

いいえでは、fooクラスを変更せずにこれを修正することはできません。 継承されたクラスは親クラスのプライベートメンバーにアクセスできません。これは非常に基本的なルールです。

setSomething()protectedとする。それは解決されます。

manual

+0

上記のとおり、fooクラスは変更できません。どのように私はこれを行うことができますか? –

+0

あなたはoopを維持する限りそれをすることはできません。 –

0

元のクラスを変更せずに、継承したクラスが親クラスのメソッドprivateを直接呼び出す方法はありません。

0

あなたはこれを試してみましたか?

class bar extends foo { 

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

親:: XXX();は公開されているので、静的呼び出しのように見えますが、動作するはずです。