>  기사  >  백엔드 개발  >  PHP에서 클래스 생성자 _construct()와 _initialize()의 차이점을 생각해 보세요.

PHP에서 클래스 생성자 _construct()와 _initialize()의 차이점을 생각해 보세요.

不言
不言원래의
2018-06-07 11:20:381726검색

이 글은 주로 ThinkPHP의 클래스 생성자 _construct()와 _initialize()의 차이점을 소개합니다. 소개가 매우 자세해서 필요한 분들은 아래에서 확인하실 수 있습니다.

머리말

THINKPHP에 익숙한 PHP 사용자는 기본적으로 _initialize() 메서드에 익숙하고 _construct() 를 거의 사용하지 않는 것 같습니다. >. 플러그인을 직접 작성하지 않는 이상 거의 사용되지 않습니다. _initialize()这个方法,我们似乎也很少去使用_construct() ,除非自己写插件,否则还真是很少用到。

今天查看代码突然看到_construct()这个php自带的构造方法,我的第一感觉是比较陌生,虽然之前学习java时经常遇到,但是很久不用基本忘记。我平时的习惯是将知识的重点写

在我那本小笔记上,但是很久不写字,曾经高中那个那种飘逸灵动的书写笔法彻底丢到异次元。再加上之前的想法,所以就来学习学习技术大牛们写写博客,这不是为了装逼,而只是让自己工作成果的点点滴滴都能不随时间流逝而消散。下面来看看详细的介绍吧。

先贴上代码(我的环境是wamp,使用了TP框架):

创建的FatherAction.class.php文件

<?php


class FatherAction extends Action{
  public function __construct(){
    echo &#39;father&#39;;
  }
}

?>

创建的SonAction.class.php文件

<?php


class SonAction extends FatherAction{
  public function __construct(){
    echo &#39;son&#39;;
  }
function index(){

}
}

?>

运行子类SonAction里的index()可以看到输出的结果:

son

如果将子类改为:

<?php


class SonAction extends FatherAction{
   public function __construct(){
    parent::__construct();
    echo &#39;son&#39;;
   }
  function index(){

  }
}

?>

运行结果为;

fatherson

上面的结果可以得出结论:

在执行子类的构造函数时并不会自动调用父类的构造函数,如果你要调用的话,那么要加上parent::__construct()

当我们把上述的构造方法改为THINKPHP_initialize()方法时运行会发现:结果与前面的一致,若要执行父类的_initialize()方法,也需要使用这一句:parent::_initialize()

那是不是说明php自带的构造函数__construct()与THINKPHP的_initialize()方法一样的呢?

先贴上两段代码:

<?php


class FatherAction extends Action{
  public function __construct(){
    echo &#39;father&#39;;
  }
}

?>

<?php


class SonAction extends FatherAction{
  public function _initialize(){
    echo &#39;son&#39;;
  }


  function index(){

  }

}

?>

当执行子类SonAction的index方法时发现,输出的结果为:father

即子类调用了父类的构造函数,而没有调用子类的_initialize()方法

再贴上两段代码:

<?php


class FatherAction extends Action{
  public function __construct(){
    if(method_exists($this,"hello")){
      $this->hello();
    }
    echo &#39;father&#39;;
  }
}

?>

<?php


class SonAction extends FatherAction{
  public function _initialize(){
    echo &#39;son&#39;;
  }
  function index(){

  }

  function hello(){
    echo &#39;hello&#39;;
  }
}

?>

执行子类SonAction的index方法,发现输入的结果为hellofather

由此可以得出结论:

  当THINKPHP的父类有构造函数而子类没有时,THINKPHP不会去执行子类的_initialize()

  当THINKPHP的父类子类均有构造函数时,要调用父类的构造函数必须使用parent::__construct() ----------------- _initialize()同理;

  当THINKPHP的子类同时存在__construct构造函数和_initialize()方法,只会执行子类的__construct

오늘 코드를 보다가 갑자기 PHP에 포함된 생성 메소드인 _construct()가 눈에 들어왔습니다. 예전에 Java를 배웠었는데, 기본적으로 오랫동안 잊어버렸어요. 지식의 핵심을 작은 노트에 적는 것이 평소 습관인데, 오랫동안 글을 쓰지 않았고, 고등학교 시절의 우아하고 스마트한 글쓰기 스타일은 완전히 다른 차원으로 사라졌습니다. 이전 생각들과 더불어 기술 전문가들에게 블로그 작성 방법을 배우게 되었습니다. 이는 자랑을 하려는 것이 아니라 시간이 지나면서 제가 작업한 결과물이 모두 사라지는 것을 방지하기 위함입니다. 아래에서 자세한 소개를 살펴보겠습니다.


먼저 코드를 붙여넣습니다(내 환경은 wamp, TP 프레임워크 사용).

FatherAction.class.php 파일 생성됨

rrreee

🎜🎜 SonAction을 생성했습니다. class.php 파일🎜🎜

🎜rrreee🎜🎜🎜하위 클래스 SonAction에서 index()를 실행하여 출력을 확인하세요. 🎜

🎜rrreee 🎜🎜🎜🎜하위 클래스를 다음과 같이 변경하면:🎜🎜

🎜rrreee🎜🎜🎜🎜실행 결과는;🎜🎜

🎜rrreee 🎜🎜🎜🎜🎜The 위의 결과는 다음과 같습니다. 🎜🎜🎜🎜상위 클래스의 생성자는 하위 클래스의 생성자를 실행할 때 자동으로 호출되지 않습니다. 호출하려면 parent ::__construct()를 추가하세요. >🎜🎜위 구성 메서드를 THINKPHP_initialize() 메서드로 변경하면 결과가 이전 클래스의 _initialize()를 실행하는 것과 일치함을 알 수 있습니다. code> 메서드를 사용하려면 다음 문장도 사용해야 합니다: <code>parent::_initialize()🎜🎜이것은 PHP가 생성자 __construct()와 함께 제공된다는 뜻인가요? THINKPHP의 _initialize() 메소드로요? 🎜🎜🎜먼저 두 개의 코드를 붙여넣습니다:🎜🎜

🎜rrreee🎜🎜

🎜rrreee🎜🎜🎜하위 클래스 SonAction의 인덱스 메소드를 실행할 때 발견됩니다. 그 출력 결과는 다음과 같습니다. father🎜🎜즉, 하위 클래스가 상위 클래스의 생성자를 호출했지만 하위 클래스의 _initialize() 메서드를 호출하지 않았습니다🎜🎜🎜그리고 두 조각을 붙여 넣습니다. 코드:🎜🎜

🎜rrreee🎜🎜

🎜rrreee🎜🎜🎜SonAction 하위 클래스의 인덱스 메서드를 실행하고 입력 결과가 hellofather🎜🎜🎜By 다음과 같이 결론을 내릴 수 있습니다: 🎜🎜🎜🎜 THINKPHP의 상위 클래스에 생성자가 있지만 하위 클래스에 없으면 THINKPHP는 _initialize() 를 실행하지 않습니다. 🎜🎜 THINKPHP의 상위 클래스에 두 하위 클래스 모두 생성자가 있는 경우 상위 클래스의 생성자를 호출하려면 parent::__construct() 를 사용해야 합니다.--------- --------- _initialize()는 동일합니다. 🎜🎜 THINKPHP의 하위 클래스에 __construct 생성자와 _initialize()가 모두 있는 경우 메서드를 사용하면 하위 클래스의 만 실행됩니다. >__construct생성자(개인적으로 테스트해 본 결과 위 코드에는 없습니다.) 🎜🎜관련 권장 사항: 🎜🎜🎜🎜ThinkPHP🎜🎜🎜🎜🎜🎜🎜🎜🎜을 사용하여 업로드 클래스 UploadFile 사용

위 내용은 PHP에서 클래스 생성자 _construct()와 _initialize()의 차이점을 생각해 보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.