2014-09-10 3 views
0

В документации этот пример и понять его без проблемПочему php позволяет переписать частный метод?

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

Но теперь заново метод test() в классе foo

class Bar{ 
    public function test() { 
     echo '<br>Im Bar::test'; 
     $this->testPrivate(); 
     $this->testPublic(); 
    } 
    public function testPublic() { 
     echo "<br>Bar::testPublic\n"; 
    } 
    private function testPrivate() { 
     echo "<br>Bar::testPrivate\n"; 
    } 
} 
class Foo extends Bar{ 
    public function test() { 
     echo '<br>Im Foo::test'; 
     $this->testPrivate(); 
     $this->testPublic(); 
    } 
    public function testPublic() { 
     echo "<br>Foo::testPublic\n"; 
    } 
    private function testPrivate() { 
     echo "<br>Foo::testPrivate\n"; 
    } 
} 
$myFoo = new Foo(); 
$myFoo->test(); 

Результат:

  • Im Foo :: тест
  • Foo :: testPrivate
  • Foo :: testPublic

PHP позволяет мне переопределить метод частного testPrivate() , Зачем?

ответ

0

Почему нет? Трудно ответить на этот вопрос, поскольку именно так работает PHP. Если вы хотите запретить ваши методы быть перезаписанными, вы можете использовать ключевое слово final.

Кроме того, в вашем примере, если вы не объявляете частный метод в Foo, вы получите сообщение об ошибке, поскольку Foo технически не имеет определения для этого метода. Расширение классов не имеет видимости каких-либо частных свойств или методов в их родительском классе.

+0

но документация говорит 'Члены, объявленные как частные, могут быть доступны только классом, который определяет member.' – ramboRam

+0

также переопределяет частные функции, только если я переопределять метод испытания – ramboRam

+0

В вашем примере, вы вызываете' Foo: : тест(); '. Когда вы вызываете метод с использованием '$ this', он будет пытаться вызвать методы внутри своего собственного определения, возвращаясь к родительскому, если у него нет определения. В вашем примере вы по существу создали новый класс ('Foo'), потому что вы перезаписали все методы. 'Foo :: test' вызывает' Foo :: testPrivate' и 'Foo :: testPublic' – Scopey