본문 바로가기
FrameWork/CodeIgniter

CodeIgniter에서 controller와 method명으로 php 언어 구조명 쓰기

by 백룡화검 2010. 4. 24.

개인적으로 즐겨쓰는 php 프레임워크 중 codeigniter 라는 녀석이 있다.

 

php4와 php5를 지원하는데다 여러 라이브러리 등과도 효과가 좋아 얼마전 진행했었던 국회의원 사이트 제작에도 썼었다(지금 결과는 그다지 좋지 않지만)

 

그런데 이 프레임워크를 사용하다 보면 2가지 이상한 걸 발견하게 된다.

 

가령 페이지의 처음을 말하는 index 라는 단어는 이렇게 controller 디렉토리에 파일이 있다고 가정하면

 

index.php

 

이 파일의 클래스명은 index가 되어야 하고 상속받는 클래스는 controller 클래스가 된다.

 

여기서 자세히 봐야 할 건 index 이다. codeigniter의 class 구조에서 index 메소드는 메소드명이 url에 들어가 있지 않을 경우 기본 실행되는데, 이때 php class 구조는 class의 생성자 메소드가 클래스명이 되어야 한다는 것이다.

 

여기서 문제가 발생한다.  만약 여기서 다음과 같이 index.php 파일이 작성되어 있다면

 

class index extends Controller {

    function index () {

        parent::Controller();

        echo "Class 생성자";

    }

 

    function index () {

        echo "메소드가 지정되어 있지 않으면 기본적으로 실행되는 메소드";

    }

}

 

이 경우 에러가 발생한다. 왜냐면 php는 클래스를 상속했을때 메소드를 중복해서 정의할 수 있지만 상속된 클래스가 아닌 경우는 중복해서 정의할 수 없다.

 

위와 같은 경우 내가 말했던 것처럼 codeigniter 구조에 따르면 index 클래스 파일을 찾고 메소드 명이 지정되어 있지 않으면 index 메소드가 실행되어야 하는데 이때 index 메소드가 클래스 생성자가 되버리는 것이 문제다.

 

또 굳이 이런 문제가 아니더라도 list 등의 php 언어 구조를 메소드명으로 사용할 수 없다. 물론 define 등의 함수는 상관없지만 php 언어 구조만큼은 그게 안된다. 따라서 같이 올린 첨부파일을 보면 이와 같은 사례에 대해 직접 만들어서 diff로 떠놨으니 이런게 필요한 분이라면 다운받아 쓰시길 바란다.

 

첨부파일을 받아 적용하게 되면 다음과 같이 재 정의되어야 한다.

 

class indexController extends Controller {

    function indexController () {

        parent::Controller();

        echo "Class 생성자";

    }

 

    function indexMethod () {

        echo "메소드가 지정되어 있지 않으면 기본적으로 실행되는 메소드";

    }

 

    function listMethod () {

        echo "이것은 언어 구조입니다";

    }

}

 

파일명은 동일하게 사용한다. 후에 조금 여지가 된다면 index 만큼은 좀 예외로 남겨두고 싶다.(할까..)

 

출처 : 그가 눈을 통해 보는 삶