thinkphp의 __construct() 및 __initialize() 소개

풀어 주다: 2020-04-24 09:22:45
앞으로
1930명이 탐색했습니다.

thinkphp의 __construct() 및 __initialize() 소개

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 &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行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 &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行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 &#39;我是构造<br />&#39;;
	// }
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
		// parent::_initialize();
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
bbbb
这是index
*/
로그인 후 복사

또한 _initialize()를 사용하여

<?php
namespace Home\Controller;
use Think\Controller;
class BaseController extends Controller {
	public function __construct() {
		parent::__construct();
 
		echo &#39;我是父类<br />&#39;;
	}
 
	public function _initialize() {
		echo &#39;我先来<br />&#39;;
	}
 
	public function a() {
		echo &#39;aaaa<br />&#39;;
	}
}
로그인 후 복사
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends BaseController {
 
	public function __construct() {
		parent::__construct();
		self::b();
		echo &#39;我是构造<br />&#39;;
	}
	public function _initialize() {
		parent::_initialize();
		echo &#39;我是子类先来<br />&#39;;
	}
    public function index(){
    	self::b();
    	echo &#39;这是index&#39;;
    }
 
    public function b() {
    	echo &#39;bbbb<br />&#39;;
    }
}
 
/*
当执行index方法时,打印结果:
我先来
我是子类先来
我是父类
bbbb
我是构造
bbbb
这是index
*/
로그인 후 복사

를 상속할 수도 있습니다. 참고: 상위::construct()가 없는 경우 상위 클래스의 생성자에서 정의된 _initialize()는 Function

그렇다면 __construct()(이 생성자는 상위 클래스의 생성자를 초기화합니다)와 _initialize()가 둘 다 있는데 어느 것이 먼저 실행됩니까?

답은 - _initialize() 메서드를 먼저 실행하세요. 즉, 조건이 충족되면 생성자를 포함한 모든 메서드가 실행되기 전에 _initialize() 함수를 실행해야 합니다.

물론, 실행할 메소드에 또 다른 메소드가 호출되는 경우 해당 메소드를 별도로 호출하면 _initialize() 메소드는 처음 호출한 메소드와 연관되지 않습니다. 메서드에서 완료되었으면 더 이상 제어할 수 없습니다.

추천 튜토리얼:

thinkphp 튜토리얼

위 내용은 thinkphp의 __construct() 및 __initialize() 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿