질문/조언질답게시판

stdClass() 는 뭔가요?

Extra Form
PHP PHP 7.2
CMS Rhymix 2.x

최근 php의 객체에 대해서 초입 부분을 공부하다가 한가지 궁금한게 XE,라이믹스에서 

$args = new stdClass();

 

와 같이 인스턴스를 생성하는 코드가 자주 등장했다는 것이 생각이 났습니다.

 

최근 php에서는 이것이 없이 객체화? 된 코드 진행이 되면 에러를 발생시킨다? 대충 이런 이유로 누락된 곳에 

 

$args = new stdClass(); 를 모두 시작점에 추가해 주는 패치를 해야 했던 것이 기억납니다. 에러가 뜨니까 뜨는 근처 찾아서 저 코드를 열심히 넣었던 것이 대충 객체와 관련이 있는 것 같다는 생각이 들었네요.

 

 

특별히 stdClass 클래스? 명을 가진 코드(오브젝트?)가 보이지 않아 구글에 검색을 해보니 

빈 Class 라고 하는 글들이 검색되어지는 것 같습니다.

 

$args->module_srl = $module_srl;

executeQuery("document.deleteAlias", $args);

 

 

위와 같이 $args->module_srl 객체화?? 형식을 쓰기 위해서

$args = new stdClass(); 이렇게 더미??? 인스턴스를 생성해주는 건가요???

 

$args = new stdClass(); 를 먼저 생성해주지 않아도 문제가 없었던 것 같은데 이게 꼭 있어야 하는 이유가....

 

 

  • profile

    stdClass 는 빈 클래스를 뜻합니다.

    저희가 클래스를 호출할때 보통

    $oModuleModel = getModel('module');

    이렇게 쓰지만 원래는

    $oModuleModel = new moduleModel();

    이렇게 호출하는게 PHP에서는 정석이거든요

    이 부분 자세한 부분은 나중에 알려달라 하시면 드리도록 하고, stdClass 는 저런 클래스가 없는 빈 클래스를 뜻합니다.

    보통 오브젝트가 필요할 경우 빈 오브젝트를 생성할때 쓰이죠. $args = new stdClass() 는 $args 에 빈오브젝트를 선언한다 하고..

    $args->module = '';

    이렇게 오브젝트안에 내용을 추가하는 방식이죠.

     

    즉 말씀하신대로 더미 객체를 선언하는 것으로 생각하시면 됩니다.

     

    PHP 5.4 이후로 변수가 오브젝트를 가지지 않는 경우부터 워닝에러를 띄어와서 해당 오브젝트를 만드는 경우라면 이제는 빈 오브젝트를 생성하는게 정석으로 바뀌었다고 생각하시면 됩니다.

     

    실제로, C# 같은 다른곳에서는 일반적으로 클래스를 호출하여 오브젝트 값을 추가하는 방향으로 많이 사용됩니다. (거기에서는 빈 오브젝트 선언이라는 항목이 없는것으로 알고 있습니다. 오브젝트를 가져오고 싶으면 해당 부분에 따라 레퍼런스(반환클래스)를 만들어야 합니다.

     

    PHP도 마찬가지로 오브젝트용 클래스를 만들어서 쓰고요 (ex document.item.php 파일의 documentItem()이 반환 클래스가 됩니다. )

  • profile profile

    마지막 줄은 제가 더 공부를 해야 무슨 의미인지 알 수 있을 것 같네요.
    나머지는 제가 대략 생각했던 거와 비슷한데 인스턴트 생성이 꼭 필요해진 이유가 규칙이 그렇게 된거라면 작동에 꼭 선행되어야 하는 무언가가 생긴게 아닌 거군요.

  • profile profile
    이런 규칙이 까다로워 질수록 성능상 더 좋아지는 겁니다.

    예를들어

    $args[1] 을 가져오는건 실제로 $args 가 배열이라는 가정하에 인덱스값 1 에 해당되는 값을 가져오면 되기 때문에 성능상 문제가 안되지만

    $args->module
    이렇게 선언된거라면 $args 가 클래스인지 오브젝트인지 그런 부분을 검사한뒤 거기에 맞는 값을 가져오기 때문에 미리 앞에서 $args = new stdClass 을 선언하게 되면 성능상 유리해집니다.

    PHP7.0 에서 지원하는

    public static function funcName(string $string): array
    이런형태도 해당 함수의 리턴값(array)을 선언하고 매개변수를 string을 선언하엿기 때문에 그거에 대한 다른 조건을 검사할 필요 없이 깔끔하게 실행 할 수 있어 성능향상에 도움되었죠.

    이런 부분에서 php5.4 부터 빈 오브젝트 선언 부터 점차 시작된 것으로 생각하시면 좋습니다.
  • profile profile
    아.. 성능에 크게 관련이 있는 부분을 타이트하게 바꿔가는 거군요.
  • profile

    빈 문자열: '' 또는 ""
    빈 배열: array() 또는 []
    빈 오브젝트: new stdClass 또는 new stdClass() 또는 (object)[]
    ※ 클래스 직후에 괄호는 필수가 아닙니다

    오브젝트를 먼저 선언하지 않고 사용하려고 하면
    PHP 7에서는 워닝, PHP 8에서는 치명적인 오류가 납니다.

    선언하지 않은 변수의 값은 NULL인 것으로 가정하는데,

    NULL에다가 -> 문법을 사용하는 것이 더이상 허용되지 않기 때문입니다.

  • profile profile
    한가지 더 궁금한게 있습니다.

    class documentController extends document

    extends 가 무언지 궁금한데요. 이게 XE,라이믹스에서 들어가는건가요? 그리고 그 뒤에 모듈명이 오는 경우도 있고 다른게 오는 경우도 있기도 하던데요.
  • profile profile

    extends 는 PHP에서 지원합니다.

    documentController extends document 하면

    클래스네임이 documentController 이고 실제로 document 클래스를 가진 document.class.php 파일안에 있는 함수들도 이용할 수 있습니다.

    document.class.php 에서는 moduleOBject인가 그게 extends 으로 선언되어 있으니 거기에 맞는 $this->module_srl 같은 맴버변수들도 사용할 수 있는거고요 ㅎㅎ

     

    위로 점점 상속 관계를 가진다고 생각하시면 됩니다.

     

    ModuleObject.php -> document.class.php -> document.controller.php 

  • profile profile

    모듈명과 클래스명이 같은 경우가 많아서 헷갈릴 수 있는데, 항상 클래스명입니다.

    상속을 받으면 document는 부모클래스, documentController는 자식클래스가 되고, 부모클래스에 포함된 기능을 자식이 모두 끌어다 쓸 수 있습니다. (상속세는 없습니다. ㅎㅎ)

    그런데 document는 ModuleObject를 상속받고, ModuleObject는 BaseObject를 상속받으니 할아버지도 있고 증조할아버지도 있는 셈이지요. 문서 모듈에서 $document->get(), $this->add(), $this->setRedirectUrl() 등 조상님들이 선언하신 함수를 막 끌어다 쓸 수 있는 것은 그 덕분입니다. 이게 없었다면 각 모듈마다 굉장히 많은 기능을 중복으로 구현해야 했겠지요.