안녕하세요.
php에 입문하여, CondeIgniter를 배우고 있는 3개월된 신입입니다.
CondeIgniter를 공부하면서 객체에 접근할 때는 ->를
배열에 접근할 때는 []을 사용했었는데요.
그러다 의문점이 생겼습니다. 흔히 사용하는
$this->load->model('a');
$this->db->insert() 등은
현재 class에서 load라는 객체 참조변수를 타고 a라는 이름을 가진 model을 실행시킨다.
현재 class에서 db라는 객체 참조변수를 통해 insert()이라는 메서드를 실행시키는 것이 맞나요?
그런데 db 나 load는 어디에 존재하나요?
아래는 제가 ci_controller API(?)를 찾아봤는데 전혀 이런 내용은 없길래 너무 궁굼합니다.
30: class CI_Controller {
31:
32: private static $instance;
33:
34: /**
35: * Constructor
36: */
37: public function __construct()
38: {
39: self::$instance =& $this;
40:
41: // Assign all the class objects that were instantiated by the
42: // bootstrap file (CodeIgniter.php) to local class variables
43: // so that CI can run as one big super object.
44: foreach (is_loaded() as $var => $class)
45: {
46: $this->$var =& load_class($class);
47: }
48:
49: $this->load =& load_class('Loader', 'core');
50:
51: $this->load->initialize();
52:
53: log_message('debug', "Controller Class Initialized");
54: }
55:
56: public static function &get_instance()
57: {
58: return self::$instance;
59: }
60: }
그리고 $this->load->helper('c'); <-- 이 경우는 c라는 helper를 객체로 만들어서 접근하는 것인가요?
ci의 기본원리에 대해 너무나 궁굼합니다.
알려주세요!
model 을 로드 선언 하면 CI_Controller 는 CI_Model 을 상속 받습니다.
내부 Model [사용자가 정의한 model 말고 CI 모델] 이 로드가 된거라서 객체 선언으로 사용이 가능합니다.
어딘가에서 불러오지 않고 객체 맴버를 호출 할 수는 없습니다 ㅎㅎ
아래 함수를 호출해서 확인해보세요. 생각보다 많은 클래스를 호출 하고 있음을 알게 될것입니다 ㅎㅎ
print_r(get_declared_classes());
헬퍼와 라이브러리는 구조가 다릅니다.
헬퍼는 전역 사용자 정의 함수이고 라이브러리는 클래스죠.
$this->load->helper('c');
이 로드 명령어는 application/helper/c_helper.php 를 include 하라는 뜻입니다.
include APPPATH . 'helper/c_helper.php';
이 코드와 거의 동일하다고 생각하시면 됩니다.
정확한 로더의 구조는 웅파님 의견대로 CI_Loder를 분석해 보시는게 좋습니다.
세 분 모두 많은 도움이 됐습니다.
그냥 뭣모르고 사용하던
CI의 원리에 조금 알게 되서 너무나 기쁩니다.
감사합니다.
index.php부터 Codeigniter.php -> 기타 등등 파일을 따라 가보시면 ci의 작동구조를 알 수 있습니다.
load나 db는 ci core에서 제어합니다.
클래스들인데 명시적으로 그렇게 사용하겠다라고 프레임워크 core에 정의를 한 것이죠.
load는 말 그대로 include_once or require_once 의 개념이라고 보시면 됩니다. core/Loader.php 한번 열어보세요.