这段代码为何会输出father?
Jun 06, 2016 pm 08:33 PM
<code><?php class father { public function __construct() { $this->init(); } private function init() { echo "father\n"; } } class son extends father { public function init() { echo "son\n"; } } $son = new son(); </code>
回复内容:
<code><?php class father { public function __construct() { $this->init(); } private function init() { echo "father\n"; } } class son extends father { public function init() { echo "son\n"; } } $son = new son(); </code>
因为son里的init方法是public,而father的init方法是private,这个其实表示你son里的init方法并没有重写父类里的方法。那自然调用的仍然是父类自己的实现了
<code>$son.init(); // son </code>
<code>php</code><code><br>class father { public function __construct() { // $this->init(); static::init();//php5.6 } private function init() { echo "father\n"; } } class son extends father { /*public function __construct() { $this->init(); }*/ public function init() { echo "son\n"; } } </code>
后期静态绑定
Reference: http://docs.php.net/manual/en/language.oop5.late-static-bindings.php
Note:
In non-static contexts, the called class will be the class of the object instance. Since$this->
will try to call private methods from the same scope, using static:: may give different results. Another difference is that static:: can only refer to static properties.
<code>class father { public function __construct() { $this->init(); } private function init() { echo "father\n"; } } class son extends father { public function __construct() { parent::__construct(); $this->init(); } private function init() { echo "son\n"; } } new son(); </code>
输出
<code>father son </code>
建议查看__construct基础知识,想告诉楼主踏实一点,我就不信你弄清了里面的方法还会来问
授之以渔
private方法无法被重写
father中的init如果是public或protected,那么是会输出son;但是现在是private,所以在father中调用init是不会输出son的,而是调father的int输出father。

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법
