2012-02-24 9 views
6

私はPHP OOPマニュアルhttp://www.php.net/manual/en/language.oop5.visibility.phpでこれを見て説明することができ、出力がない理由私の周り私の頭を取得することはできません:フー:: testPrivateはFoo :: testPublicPHPマニュアルOOPの可視性の例は、 - 誰かがそれは

class Bar 
{ 
    public function test() { 
     $this->testPrivate(); 
     $this->testPublic(); 
    } 

    public function testPublic() { 
     echo "Bar::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Bar::testPrivate\n"; 
    } 
} 

class Foo extends Bar 
{ 
    public function testPublic() { 
     echo "Foo::testPublic\n"; 
    } 

    private function testPrivate() { 
     echo "Foo::testPrivate\n"; 
    } 
} 

$myFoo = new foo(); 
$myFoo->test(); // Bar::testPrivate 
       // Foo::testPublic 
+1

ヒント: 'private'を' protected'に変更すると、望ましい出力が得られます。両方のアクセス修飾子について読んでください。 –

+0

このスレッドをチェックしてください。最初の答えは私を助けます。 http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

+0

このスレッドをチェックしてください。最初の答えは私を助けます。 http://stackoverflow.com/questions/12794290/php-manual-visibilty-example-confused – Sam

答えて

11

これはすべて変数/メソッドの可視性に関するものです。

クラスtestPrivate()はです。つまり、それだけでそのメソッドにアクセスできます。子供はいない。

だからFooBarを拡張して、test()方法を実行するように要求したとき、それは2つのことを行います。それは公共のだから

  1. それはtestPublic()メソッドをオーバーライドして、Fooは、それ自身でそれを無効にする権利を有しますバージョン。
  2. Bar()にはtest()が存在するため、test()Barと呼びます。

testPrivate()は上書きないあり、かつtest()を保持しているクラスの一部です。したがって、Bar::testPrivateが印刷されます。
testPublic()は、であり、継承するクラスの一部です。したがって、Foo::testPublicが印刷されます。いくつかのケースでは

+0

権利。きれいな説明のために@rockerestありがとう。 –

+0

しかし 'Foo:testPublic'の中から' $ this-> testPrivate() 'をエコーすると' Foo :: testPrivate'がエコーされます。したがって、このコンテキストから呼び出されたときにはオーバーライドされたように見えます。今私は混乱している! – bfavaretto

+0

@bfavaretto '$ this'は、コードが入っているクラスを参照する動的変数です。' test() 'を処理している間、' $ this'は 'Bar'クラスの一時コピーを参照します'Bar :: testPrivate()')、 'Foo'クラス内の' $ this'は 'Foo'クラス(' Foo :: testPrivate() ')を参照します。 – rockerest

1

は、あなたがバークラスのプライベート方法を望んでいることに気づくのは簡単ですが、あなたもそれにアクセスするためにのFooクラスを望んでいます。
しかし、それは公開されているかプライベートですか?
ここでは保護の修飾語があります。
メソッドがプライベートの場合、クラス自体がメソッドを呼び出すことができます。
方法が公開の場合、誰もが自由なパーティーのように呼び出すことができます。
メソッドがである場合、が呼び出されます。クラス自体はそれを呼び出すことができます。また、このメソッド(子)を継承した者は、それを自分のメソッドとして呼び出すことができます。

-1

私は数日前に同じ質問を投稿しました。この行動は私にとっても論理的ではなかったからです。 $これは、現在使用されているオブジェクトに常に参照されます。私の意見では、このような例では、エラーや警告などがスローされます。上記の例では、実際にプライベートメンバーにアクセスしているため、アクセス不能になったSSSを使用しています。

+1

建設的な答えではありません。あなたは何か建設的で暴言ではなく、コメントを残すことができます。 –

関連する問題