thinkphp의 __construct()와 _initialize()에 대한 이해
인터넷에 많은 의견과 사용법이 있습니다. 다음은 제가 직접 테스트한 결과와 제가 이해한 내용을 바탕으로 내린 결론입니다. .. 혹시 잘못된 부분이 있으면 수정해주시면 감사하겠습니다! ! !
먼저 Thinkphp와 함께 제공되는 Control 클래스(ThinkPHPLibraryThinkController.class.php)의 내용을 살펴보겠습니다.
생성자를 살펴보세요.
/** * 架构函数 取得模板对象实例 * @access public */ public function __construct() { Hook::listen('action_begin',$this->config); //实例化视图类 $this->view = Think::instance('Think\View'); //控制器初始化 if(method_exists($this,'_initialize')) $this->_initialize(); }
Controller 클래스의 생성자에서 생성자가 다음을 수행한다는 것을 알 수 있습니다. 객체가 있는지 확인합니다. _initialize 메서드가 있으면 _initialize 메서드가 먼저 실행됩니다.
따라서 우리가 직접 정의한 컨트롤러에 있는 경우
1): 재정의된 생성자가 있습니다.
① 재정의된 생성자에는 상위 클래스(parent::construct())를 구현하는 생성자가 있습니다.
컨트롤러에 _initialize() 메서드가 정의되어 있으면 컨트롤러에서 해당 메서드를 호출할 때 먼저 _initialize( ) 메서드를 실행한 다음 필요한 메서드를 실행합니다. 코드를 살펴보세요.
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function __construct() { parent::__construct(); self::b(); echo '我是构造<br />'; } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行index方法时,打印结果: 我先来 bbbb 我是构造 bbbb 这是index */
②: 상위 클래스의 생성자는 재정의된 생성에서 구현되지 않습니다. 메서드가 실행되면 정의된 _initialize()가 실행됩니다. 메소드는 효과가 없습니다(메소드를 실행할 때 먼저 _initialize 메소드를 실행하십시오). 코드를 살펴보십시오.
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function __construct() { // parent::__construct(); self::b(); echo '我是构造<br />'; } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行index方法时,打印结果: bbbb 我是构造 bbbb 这是index */
참고: 여기에 언급된 _initialize() 메소드는 parent::__construct( 이전에 함수 호출이 없음을 의미합니다. );, parent::__construct(); 앞에 self::b()를 추가해야 한다면 b()가 먼저 실행되어야 하는 것은 당연하지만 일반적으로 이렇게 작성되지는 않습니다. 출력 및 구성
게다가 상속인 경우 부모 클래스에 생성자가 있으면 하위 클래스는 일반적으로 생성자에서 부모 클래스의 생성자를 먼저 초기화하여 독창성과 무결성을 보장합니다. 코드
2) 중복 없음 생성자를 작성합니다. 즉, 우리가 정의한 컨트롤러에 선언된 생성자가 없습니다
이 경우 컨트롤러에 _initialize() 메서드가 정의되어 있으면 다른 메서드를 호출할 때 , _initialize가 첫 번째 () 메소드로 호출됩니다. 코드를 살펴보세요:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { // public function __construct() { // // parent::__construct(); // self::b(); // echo '我是构造<br />'; // } public function _initialize() { echo '我先来<br />'; // parent::_initialize(); } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行index方法时,打印结果: 我先来 bbbb 这是index */
또한 _initialize()를 사용하여
<?php namespace Home\Controller; use Think\Controller; class BaseController extends Controller { public function __construct() { parent::__construct(); echo '我是父类<br />'; } public function _initialize() { echo '我先来<br />'; } public function a() { echo 'aaaa<br />'; } }
<?php namespace Home\Controller; use Think\Controller; class IndexController extends BaseController { public function __construct() { parent::__construct(); self::b(); echo '我是构造<br />'; } public function _initialize() { parent::_initialize(); echo '我是子类先来<br />'; } public function index(){ self::b(); echo '这是index'; } public function b() { echo 'bbbb<br />'; } } /* 当执行index方法时,打印结果: 我先来 我是子类先来 我是父类 bbbb 我是构造 bbbb 这是index */
를 상속할 수도 있습니다. 참고: 생성자에 parent::construct()가 없는 경우 상위 클래스에서 정의된 _initialize()도 작동하지 않습니다
그렇다면 __construct()(이 생성자는 상위 클래스의 생성자를 초기화합니다)와 _initialize()가 있는데 어느 것이 먼저 실행됩니까?
답은 - _initialize() 메서드를 먼저 실행하세요. 즉, 조건이 충족되면 생성자를 포함한 모든 메서드가 실행되기 전에 _initialize() 함수를 실행해야 합니다.
물론, 실행할 메소드에 또 다른 메소드가 호출되면 _initialize() 메소드는 다시 실행되지 않습니다. 즉, 메소드에서 수행된 작업은 더 이상 제어할 수 없습니다.
추천 튜토리얼: "thinkphp Framework"
위 내용은 thinkphp의 __construct() 및 __initialize() 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!