CI 묻고 답하기

제목 Undefined property 에러에 대해서
글쓴이 밉스 작성시각 2010/05/08 09:47:14
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 36071   RSS

난데 없는 에러때문에 죽겠습니다.

아래와 같은 소스가 있을 경우 왜 이러한 경우가 생기는 지 궁금합니다.

library 폴더에서 불러올리는 clean.php와 cl.php를 로드할 경우에 clean는 정상적으로 불러지나, cl는 그렇지 않습니다.

clean 을 로드하여 $this->clean-메소드() 를 사용하는 데 아무런 문제가 없습니다.

그러나

cl은 $this->cl-메소드() 를 사용할 수 없습니다.

아래와 같은 에러메세지만 뜰 뿐입니다.
 

A PHP Error was encountered

Severity: Notice
Message:  Undefined property: Zipc::$cl
Filename: controllers/zipc.php

get_class_methods()  함수를 사용하여 살펴보면 clean은 아래와 같이 정상적으로 나타납니다.

 

THIS  ------   Array
(
    [0] => __construct
    [1] => index
    [2] => Controller
    [3] => _ci_initialize
    [4] => _ci_scaffolding
    [5] => CI_Base
    [6] => get_instance
)
Clean  ------   Array
(
    [0] => __construct
    [1] => cryp
    [2] => encoder
    [3] => decoder
    [4] => SQL_Injection
    [5] => Controller
    [6] => _ci_initialize
    [7] => _ci_scaffolding
    [8] => CI_Base
    [9] => get_instance
)

그러나 cl 은 그렇지 않고 에러 메세지만 뜹니다.

그런데 로드한 cl을 too 로 객체생성을 하여보면 아래와 같이 정상적으로 됩니다. 
TOO ------   Array
(
    [0] => __construct
    [1] => cryp
    [2] => encoder
    [3] => decoder
    [4] => SQL_Injection
    [5] => Controller
    [6] => _ci_initialize
    [7] => _ci_scaffolding
    [8] => CI_Base
    [9] => get_instance
)

질문을 하기 위하여 clean.php와 cl.php 코드는 동일합니다. 다만 cl.php은 editplus를 이용하여 clean.php를 카피하여 복사한 것입니다.  파일 저장시 ANSI 또는 UTF-8 형식인가 하여 여러가지로 시험하여 봤으나, 발생하는 현상은 동일합니다.  

물론 제가 실제로 작성하는 코드는 다른 것이지만 이와 같은 현상과 다름없습니다.  

zipc.php(controller)

<?php
class Zipc extends Controller {

  function Zipc()
   {
        parent::Controller();	
        $this->load->library('clean');
        $this->load->library('cl') ;
   }

   function index()  
   {
      $too = new cl ;

       echo "<pre>" ;

       echo "THIS  ------  <br> " ;
       print_r(get_class_methods($this)) ;
 
       echo "Clean  ------  <br> " ;
       print_r(get_class_methods($this->clean)) ;
       
       echo "CL ------  <br> " ;
       print_r(get_class_methods($this->cl)) ;

       echo "TOO ------  <br> " ;
       print_r(get_class_methods($too)) ;

       echo "</pre>" ;
    }
}
?>
clean.php

<?php

class Clean extends Controller {
   
    function Clean()
    {
       parent::Controller();	
    }


    function cryp($get_str) // DATA 암호화
    { 

    }

    function encoder($get_str) // 쿼리문을 배열화한 후 암호화하여 전달
    { 

    }  

    function decoder($get_str) // 암호화된 쿼리문을 다시 배열화
    { 

    }

    function SQL_Injection($get_Str)
    { 

    } 
}
?>
사용환경은 윈도우에서 APM 6에서 실행하여 보고 있습니다.

위의 코드는 질의하기 위하여 임의로 작성하여 제시한 코드이니 이해바랍니다(실행결과는 동일합니다)

작성방법과 클래스명, 생성자 등은 CI의 메뉴얼에 따라 했습니다.

왜 이런 현상이 발생할까요? 어떤 것은 정상적으로 로드되나, 어떤 것은 그렇지 아니한지... 어떠한 이유가 있어서 인지 궁급합니다.

너무 두서 없이 질의하여 죄송합니다.
 다음글 View단의 php파일에서 하위 디렉토리의 html파일... (1)
 이전글 로그아웃시 경고창을 발생시키면 에러가 발생합니다. (5)

댓글

변종원(웅파) / 2010/05/08 16:25:03 / 추천 0
cl 이름을 다른걸로 바꿔보세요.
밉스 / 2010/05/08 21:06:54 / 추천 0

파일명과 클래스 명을 다른 것으로 바꾸어 보아도 마찬가지 현상입니다.

구글에서도 "Undefined property" 관련 에러가 많은 것 같은데 마땅한 답이 없네요.

다른 클래스를 붙여보아도 같은 현상입니다. editplus의 문제가 있는 것인지....

어떤 클래스를 그냥 Library 폴더에 넣고 로딩할 경우에는 이상이 없는데, 이를 editplus로 열어서 재 저장하면 이와 같은 현상이 나타납니다. 무엇이 문제인지 원....

변종원(웅파) / 2010/05/08 21:11:21 / 추천 0

전에 회원중 한명도 동일한 증상이 있었는데 헥사에디터로 editplus로 작성한 파일을 열어보시면
파일 제일 처음에 눈에 보이지않는 코드가 삽입되어 있을 겁니다.
그 코드를 삭제하고 저장하시면 될겁니다.
(utf-8 붐이었던 것 같은데..)
editplus의 설정중 캐릭터셋관련 설정이 어떻게 되어있으신지?


http://codeigniter-kr.org/qna/view/2005/page/1/q/utf

밉스 / 2010/05/10 12:03:14 / 추천 0
파일의 인코딩 문제는 아닌 것 같습니다.

여러가지로 테스트 해보다가 아래와 같은 문제점이 있었습니다.

class Zipc extends Controller { 
  function Zipc()
   { 
     parent::Controller();    
     $this->load->library('clean'); 
     $this->load->library('cl') ; 
   } 

   .. 이하 생략 
}
위와 같이 $this->load->library('clean') 과 $this->load->library('cl') 과 같이 여러 클래스를 로딩할 경우에 최초의 클래스만 정상적으로 되고, 이후 나머지 클래스는 정상적으로 로딩이 되지 않았습니다. 

위의 코드에서는 ㅠClean은 정상적으로, Cl은 제가 문의한 것처럼 비정상적으로 나타납니다

Cl과 Clean의 로딩 순서를 바꿔보면 Cl은 정상적으로,  Clean은 비정상적으로 되어집니다.

예를 들어 최초의 $this->load->class 다음의 $this->load->기타  Class 는 죄다 비정상으로...

로딩하는 규칙이 따로 있는 지 궁금합니다. 한 콘트롤러에서 "$this->load->"를 사용할 수 있는 제약이 있는 것인지.....   

하여간 미치고 있습니다.

변종원(웅파) / 2010/05/10 12:50:19 / 추천 0
 한개의 컨트롤러안에서 몇개의 라이브러리를 로딩하던지 상관없습니다.

위 clean 이라는 라이브러리 소스가 실제 소스 맞는지요?
말씀은 라이브러리라고 하셨는데 소스형식은 컨트롤러입니다.
기존 라이브러리 열어보시고 어떤 형식으로 구성되어 있는지 확인하시기 바랍니다.
밉스 / 2010/05/10 17:23:39 / 추천 0
해결되었습니다.  감사합니다,