[PHP] 자동 require 또는 include되는 함수(spl_autoload_register)


Study/PHP  2019. 9. 30. 09:00

안녕하세요. 명월입니다.


이 글은 PHP에서 자동 require 또는 include되는 함수(spl_autoload_register)에 대한 글입니다.


제가 PHP를 작성하면서 가장 불변한점이 무엇이라고 하면 아마 require 또는 include 선언입니다.

작은 프로젝트라면 그렇게 크게 느껴지지는 않겠지만, 큰 프로젝트라면 여기저기서 클래스를 불러와야 하기 때문에 require가 엄청 많아 질 것입니다.

Java와 C#의 경우도 같은 패키지 단위가 아니면 위에 import선언이 꽤 많습니다. (같은 패키지의 클래스라면 import가 필요없습니다.) 하물면 클래스 단위로 페이지를 require를 해야하는 PHP라면 라이브러리 가져다 쓰고, 여러가지 기능별로 namespace나 디렉토리를 나누어 놓은 상태라면 소스코드의 절반 이상이 require로 가득찰 것입니다. 실제 그런 경우도 많이 봤습니다.


이걸 해결하는 함수로 spl_autoload_register가 있습니다. 사실 이 함수는 PHP5.3부터 제공을 했는데 저의 경우는 7.0부터 이런 함수가 있다고 인식해서 이전에는 PHP가 다 좋은데 이 패키지 관리가 안된다고 생각했습니다.

실제로 그래서 예전에 PHP언어는 다 좋은데 큰 프로젝트에서는 부적합하다고 생각을 많이 헀습니다. 실무에서는 완성도도 중요하지만 생산성을 무시할 수 없기 때문에, 소스 찾느라 시간을 많이 보내게 되면 개인 생산성도 떨어지고 전체적으로 팀 생산성이 내려가는 영향이 있기 때문에 좋지는 않습니다.


링크 - https://www.php.net/manual/en/function.spl-autoload-register.php

<?php
  // Class를 new하면 호출되는 함수
  spl_autoload_register(function($class) {
    try {
      // Class이름에 .class.php를 붙힌다.
      $filename = $class . ".class.php";
      // 디버깅 출력
      var_dump($filename);
      // include한다.
      include_once $_SERVER ["DOCUMENT_ROOT"] ."/". $filename;
    } catch ( Exception $e ) {
      // 에러가 발생하면 에러 메시지를 표시하자.
      ob_clean();
      var_dump($e);
      die();
    }
  });
  // require나 include 없이 Class1과 Class2를 호출한다.
  $class1 = new Class1();
  $class2 = new Class2();
?>
<!DOCTYPE html>
<html>
  <head><title>title</title></head>
  <body>
    <?=$class1->run()?>
    <br />
    <?=$class2->run()?>
  </body>
</html>

<?php
  abstract class AbstractClass {
    public function run() {
      return $this->getData();
    }
    protected abstract function getData();
  }
?>
<?php
  class Class1 extends AbstractClass {
    protected function getData() {
      return "This is Class1";
    }
  }
?>
<?php
  class Class2 extends AbstractClass {
    protected function getData() {
      return "This is Class2";
    }
  }
?>

위 소스를 보면 제가 클래스만 있는 php 파일은 확장명을 class.php라고 만들었습니다. 이건 정해진 규약은 아니고 개인적으로 구분하기 쉽게 작성하는 방법입니다.

위 index.php를 보시면 require나 include는 시작할 때 하지 않았습니다.

그러나 Class1를 할당하면 spl_autoload_register함수가 호출이 되고 안에서 Class1.class.php 파일을 include하는 구분이 있습니다. 여기에 제가 include_once를 사용했기 때문에 php파일이 중복으로 호출은 되지 않습니다.다시 Class1에서는 제가 extends함수로 AbstractClass를 상속받았네요. 그러니 AbstractClass.class.php도 include되는 형태를 var_dump로 확인할 수 있습니다.


여기까지 PHP에서 자동 require 또는 include되는 함수(spl_autoload_register)에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.