Extra Form
PHP PHP 7.4
CMS Rhymix

그저 단순히 궁금해져서 질문을 올려봅니다!

 

예를들어 module.model.php가 이렇게 되어있습니다.

class ModuleModel extends Module

{

    public function myFunction() {}

}

 

그리고 RXE에서는 아래와 같이 호출합니다

$oModuleModel = getModel('module');

$oModuleModel->myFunction();

 

그런데 기본적인 호출 방식을 사용하여 아래와 같이 호출해도 되지 않나요?

$oModuleModel = new ModuleModel();

$oModuleModel->myFunction();

 

어차피 autoloader도 작동하고 있는데, 위와같이 사용하지 않는건 XE에서부터 이어져오던 관습때문인가요?

아니면 특별한 이유때문에 저렇게 쓰고 있는건가요?

  • profile

    첫째, getModel(), getController() 등의 함수를 사용하면 해당 모듈의 설정이나 언어파일 같은 것들을 코어에서 자동으로 로딩해 줍니다. 클래스를 직접 참조하더라도 오토로딩은 되겠지만, 설정이나 언어파일이 제대로 로딩되지 않아서 모듈이 오작동할 수도 있습니다. 클래스 생성자를 엉성하게 만들어 놓은 서드파티 자료도 종종 눈에 띄는데, 이런 경우에는 더 심한 문제가 생길 가능성도 있고요.

     

    둘째, getModel(), getController() 등의 함수는 오래 전부터 각 모듈의 인스턴스를 싱글턴으로 관리해 왔습니다. new ModuleModel(); 처럼 매번 새로운 인스턴스를 만들어 사용한다면 자원 낭비일 뿐더러, 싱글턴이라고 가정하고 만들어진 자료에서 문제가 될 수도 있습니다. 예를 들어 제가 만든 모듈들 중 before 트리거에서 특정한 인스턴스 속성에 값을 저장한 후, after 트리거에서 그 값을 다시 받아오도록 만든 것이 있습니다. 싱글턴이니까 가능한 거죠. 이런 모듈은 갑자기 싱글턴이 아니게 되면 오작동할 확률이 무척 높습니다.

     

    물론 전역함수를 사용하지 않고도 위의 두 가지를 구현할 수 있지만, XE가 처음 만들어졌을 때는 PHP 4.4를 지원했습니다. PHP 4.4에서는 자연스러운 문법으로 싱글턴 디자인 패턴을 구현하기 쉽지 않았지요. 그래서 이상한 문법이 굳어져 버렸습니다.

     

    라이믹스 2.0부터는 두 가지 변화가 예정되어 있습니다.

     

    첫째, ModuleModel, MemberModel, DocumentModel, CommentModel 등 자주 사용하는 코어 모듈에서 단순히 데이터를 불러오는 함수들은 대부분 static으로 호출할 수 있게 되었습니다. 예를 들어 회원정보나 문서를 불러올 때 기존에는

     

        $oMemberModel = getModel('member');

        $member_info = $oMembeModel->getMemberInfoByMemberSrl($member_srl);

     

        $oDocumentModel = getModel('document');

        $document = $oDocumentModel->getDocument($document_srl);

     

    이렇게 지저분한 코드를 작성해야 했지만, 라이믹스 2.0에서는

     

        $member_info = MemberModel::getMemberInfo($member_srl);

        $document = DocumentModel::getDocument($document_srl);

     

    이렇게 간편하게 불러올 수 있습니다. 인스턴스를 생성할 필요성 자체가 많이 줄어드는 것입니다.

     

    둘째, 사용하려는 기능이 static이 아니어서 인스턴스를 직접 생성해야 하는 경우, 모듈 인스턴스는 모두 싱글턴이라는 불문율을 깨뜨리지 않기 위해 new가 아니라 아래와 같이 싱글턴 디자인 패턴에 부합하는 문법을 지원합니다.

     

        $oDocumentController = DocumentController::getInstance();

        $oPointController = PointController::getInstance();

     

    변수명을 저렇게 길게 써야 한다는 법도 없으니, 혼란을 주지 않는 범위 내에서 줄여쓰셔도 무방합니다.


        $mm = MemberModel::getInstance();

     

    한 번만 쓰고 말 거라면 곧바로 메소드 호출하고 인스턴스는 버려도 됩니다.

     

        FileController::getInstance()->setFilesValid($upload_target_srl);


    단, 이런 문법을 사용하여 만든 서드파티 자료는 라이믹스 2.0+에서만 사용할 수 있게 됩니다. 코어 소스부터 새 문법으로 점점 바꿔가고 있으니 서드파티 자료들도 슬슬 따라오시기를 권해드립니다.^^

  • profile profile
    와우 이해되었습니다!

    역시 라이믹스 짱짱입니다 ㅎㅎ
  • profile profile
    와 좋네요 :)