CI 묻고 답하기

제목 선배님들 라이브러리 호출 관련 질문합니다 ㅠ_ㅠ..
카테고리 CI 2, 3
글쓴이 아리 작성시각 2016/11/08 17:49:14
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 14946   RSS

PHP VERSION : 5.3.26

CI VERSION : 3.1.1

 

* 컨트롤러

__construct 내부에서 선언한 라이브러리는 전역변수로 동작합니다 ( function 내부에서 호출해도 정상적으로 사용이 가능)

function 내부에서 지역변수로 호출한 라이브러리는 불러오지 못합니다 ㅠㅠ (생성자 내부에 있는 코드 그대로 자르기 붙여넣기해도..)

 

*라이브러리 내부 사용시

$this->_ci = & get_instance();

$this->_ci->load->library('라이브러리파일명');

$변수 = $this->_ci->라이브러리파일명;

 

A라는 파일명이 있고, B라는 파일명이 있으면 A는 불러오기에 성공하고, B는 못불러옵니다

(두 파일 모두 컨트롤러의 생성자에서 호출시 호출가능..왜죠?ㅠㅠ)

ㅠ_ㅠ.............안될거면 둘 다 안되던가..

 

 

도와주세요 ㅠㅠㅠㅠ...

 다음글 페이지네이션 attribute 관련 질문입니다. (4)
 이전글 전 CI 2.2 버전인데.. 404 Not Found ... (3)

댓글

한대승(불의회상) / 2016/11/08 18:09:20 / 추천 0
뭐가 문제인지 모르겠어요
아리 / 2016/11/08 18:49:50 / 추천 0
그쵸..!
뭐 오류있는 버전이라던지 그런건 아닌거죠?
ㅠㅠㅠㅠ 왜이러는걸까요..
한대승(불의회상) / 2016/11/09 08:59:54 / 추천 0
@아리 전역이 아닌 지역으로 선언한 변수를 다른 함수에서 참조할 수 없는게 지극히 정상인데 왜 문제라는건지 모르겠어요.
아리 / 2016/11/09 11:14:59 / 추천 0

@한대승(불의회상)

아! 당연히 그건..안되는거 잘 알고있습니다.. 

그정도로 모르면 여기 질문을 ㅠ_ㅠ..안올렸을...것 같은데 여튼 글이 좀 모호했다면 죄송합니다 :)

그런뜻이 아니구요.. 해당 함수 내에서 지역변수로 선언한 변수를 해당 함수내에서 못쓴다구요!

 

제가 질문하는내용은! 예를들면

* 컨트롤러질문내용

 

function __construct() {
	parent::__construct();
}
function test(){
	$this->load->library('testlib');
	print_r($this->testlib);
}

라고 쳤을때, (라이브러리 내용에 변수들이라던지가 있다고 가정)

아무것도 안나온다는 뜻입니다

 

__construct 내부에서 load하고 다른환경은 동일할 시

function __construct() {
	parent::__construct();
	$this->load->library('testlib');
}
function test(){
	print_r($this->testlib);
}

를 했을경우 잘 나오구요

변종원(웅파) / 2016/11/09 12:03:22 / 추천 0

testlib 라는 라이브러리가 이상한거 같네요. (내부에서 ci 인스턴스를 호출하고 그걸 외부에서 또 $this로 호출하니....)

3rd party library인 tank_auth를 대상으로 위와 같이 테스트해봤을때 둘다 정상적으로 출력이 됐습니다. (2점대 기준, 3버전도 테스트 완료)

kaido / 2016/11/09 12:12:18 / 추천 0

CI 라이브러리로 구현해서  CI 방식으로 객체 접근 할때 몇가지 규칙이 있습니다.

기본적인거긴 하다만.

1. 대소문자 구문이 확실해야합니다. [캬멜케이스 적용되어있어야함]

2. 파일명도 대소문자 영문파일명으로만 구성되어야함.

3. 파일명과 대표하는 클래스명이 동일해야함.

4. 맴버에 접근이 가능해야함.

 

그렇지 않으면 그냥 new 해서 객체를 생성해서 꺼내다 쓰시면 됩니다.

아리 / 2016/11/09 13:43:11 / 추천 0

@한대승(불의회상) 님

 

라이브러리 파일명은 임의로 적은것이며 실제 파일명이 아닙니다!

또한 해당 오류가 발생하는 (인스턴스 호출했던) 라이브러리와 컨트롤러에서 불러오는 라이브러리는 다른 파일입니다 :)

일단 라이브러리 내부 호출부는 어찌저찌 해결된것같습니다.. ㅠㅠ 

 

컨트롤러의 경우에도.. 사용하고자 하면 construct에서 선언하고 전역변수로 사용하는데에는 문제가 없으므로

크게 문제삼을 일은 아니지만.. 왜 함수 내부 호출시에는 안되는건지 이유를 알고저 질문했었습니다 ㅠ.ㅠ

 

그동안 잘 되다가 신규 프로젝트(대략 일주일 전쯤 환경구축후 시작) 서버에서 안되길래 여쭤본거구요 ㅠ_ㅠ

일단 음.. 회사에서 (다른프로젝트) 몇년간 잘 사용중인코드이니 코드에 큰 문제는 없을것같습니다..!

그래도 혹시 싶어서 코드를 다 지우고 빈 내용에 변수만 하나 선언해서 출력해보았으나, 동일합니다

ㅠㅠ 저는 이유를 잘 모르겠어요.. 여하튼 테스트까지 해주시고 정말 감사합니다..!

 

kaido 님

1234 다 해당되는줄 알았는데! 지금보니 3번은 통과 못하는것같습니다..! 파일명에 _가 들어갑니다.

 

제 질문이.. 요약하면

 

전역변수로는 ( __construct 에서 load ) 사용이 가능하고,

지역변수로는 ( __construct 에서 호출x, 해당 라이브러리를 사용할 특정 함수 내부에서 load ) 사용이 불가능한 이유가 무엇인가요?

 

정도 될것같은데 ㅠ_ㅠ 제생각에는 안될거면 두 군데 다 안되는게 맞지 않나 싶어서..

_ 한번 빼보겠습니다..! 답변 주셔서 감사합니다

kaido / 2016/11/09 14:46:21 / 추천 0

처음에 보고 저는 이렇게 판단 되었습니다.

[어디까지나 예상입니다.]

 

생성자 __construct 에서 load 를 하면 obj가 생성자 영역에서 로드가 되고

지역에서 호출 하면 지역에만 obj가 로드가 되는데

$this 접근자를 사용하면 자연적으로 __construct 에 로드된것만 찾아오는것이 아닌지?

라는 예상은 해보았습니다.

 

CI4로 가면 오토로드로 관리가 되니, 지역 로드 자체를 안하게 될것 같습니다.

설령 지역에서 로드해도 오토로드를 거쳐서 로드를 해야하니, 자동으로 인식을 할테구요.