머리말
_initialize() 이 메소드는 공식 매뉴얼에 나와 있습니다:
컨트롤러 클래스가 thinkController 클래스를 상속하는 경우 컨트롤러 초기화 메소드 _initialize를 정의할 수 있습니다. 여기서 컨트롤러 메소드보다 먼저 실행됩니다. 호출됩니다.
사실 5개 이상이 있는데, 이전 버전에서도 등장한 적이 있습니다. 구현 과정에 대해 말씀드리겠습니다.
예제
다음은 공식 매뉴얼에 나오는 예입니다.
namespace app\index\controller; use think\Controller; class Index extends Controller { public function _initialize() { echo 'init<br/>'; } public function hello() { return 'hello'; } public function data() { return 'data'; } }
http://localhost/index.php/index/Index/에 접속하시면 hello
는
init hello
을 출력합니다.
http://localhost/index.php/index/Index/data
에 접속하면
init data
을 출력합니다. 분석
사용은 thinkController 클래스를 상속해야 하며 이는 초기화이므로 먼저 thinkController 클래스의 __construct()를 생각해 보겠습니다.
/** * 架构函数 * @param Request $request Request对象 * @access public */ public function __construct(Request $request = null) { if (is_null($request)) { $request = Request::instance(); } $this->view = View::instance(Config::get('template'), Config::get('view_replace_str')); $this->request = $request; // 控制器初始化 if (method_exists($this, '_initialize')) { $this->_initialize(); } // 前置操作方法 if ($this->beforeActionList) { foreach ($this->beforeActionList as $method => $options) { is_numeric($method) ? $this->beforeAction($options) : $this->beforeAction($method, $options); } } }
주의하세요. 전체 생성자에는 컨트롤러 초기화에 대한 주석이 있으며, 다음 코드는 이 초기화를 달성하는 열쇠입니다.
// 控制器初始化 if (method_exists($this, '_initialize')) { $this->_initialize(); }
진실이 드러났나요? !
실제로 자식 클래스가 부모 클래스를 상속하면 생성자를 재정의하지 않고 자연스럽게 부모 클래스의 생성자를 상속하게 됩니다. 이에 따라 현재 클래스에 _initialize 메서드가 있는지 여부가 판단됩니다. 이것이 바로 컨트롤러 초기화의 원리입니다.
확장
하위 클래스가 상위 클래스를 상속하고 생성자 메서드를 다시 작성하는 경우 상위 클래스의 __construct()를 호출할 때 주의하세요. 그렇지 않으면 코드는 다음과 같습니다. 🎜>
public function __construct() { parent::__construct(); ...其他代码... }요약
간단한 작은 디자인, 간략한 분석입니다. 모든 분들께 도움이 되길 바랍니다.