본문 바로가기
프로그래밍/PHP

PHP 오토로드(Auto Load) - 클래스 자동로드 사용하기

by pentode 2018. 4. 20.
반응형

이제 PHP 에서도 클래스를 사용해서 객체지향 프로그래밍을 하는 것이 일반적이 되어 가고 있습니다. 보통 클래스는 하나의 파일에 정의하고 클래스를 사용할때 include 해서 사용하게 됩니다. 이 때 클래스가 많아지면 include 하는 코드가 많아지게 됩니다. PHP 5에서 부터는 이러한 클래스를 자동으로 로드하는 기능을 제공합니다. spl_autoload_register() 함수를 사용하여 처리할 수 있습니다.



1. 이번 예제는 폴더 구조는 다음과 같습니다.


폴더 구조는 예제를 위해서 임의로 정한 것이므로 자신이 편한 곳에 사용하면 되겠습니다.




- /comm/classes/Apple.php, Banana.php : 샘플 클래스 파일 입니다.

- /comm/lib/autoload.php : 클래스를 자동으로 로드 하는 코드 입니다. 클래스를 사용하는 파일에서 이 파일을 include 하면 됩니다.

- /page/page.php : 클래스를 사용하는 샘플 PHP 코드 입니다.



2. 샘플 클래스 파일 입니다. 


간단히 하기 위해서 Apple.php 와 Banana.php 파일을 클래스 이름만 다르고 내용은 같습니다.


<?php

class Apple {

    private $name;

    

    public function __construct($name) {

        $this->name = $name;

    }

    

    public function setName($name) {

        $this->name = $name;

    }

    

    public function getName() {

        return $this->name;

    }

}

?>



3. 클래스를 자동으로 로딩하는 코드 입니다.


spl_autoload_register() 함수의 인자로 클래스 이름을 받아서 로드하는 익명 함수를 제공합니다.


<?php

spl_autoload_register(function($className) {

    include __DIR__ . '/../classes/' . $className . '.php';

});

?>



4. 클래스를 사용하는 파일에서는 이제 autoload.php  파일만 include 하면 됩니다.


<?php include_once('../comm/lib/autoload.php'); ?>

<!DOCTYPE html>

<html lang="ko">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<title>페이지</title>

</head>

<body>

<h3>오토로드 테스트</h3>

<?php

$banana = new Banana('바나바');

$apple = new Apple('사과');


echo $banana->getName();

echo "<br />";

echo $apple->getName();

?>

</body>

</html>



5. 클래스가 있는 폴더가 여러곳이라면 다음과 같이 처리할수 있겠습니다.


<?php

spl_autoload_register(function($className) {

    $dirs = array(

        'classes/',

        'classes2/'

    );


    foreach($dirs as $dir) {

        if(file_exists(__DIR__ . '/../' . $dir. $className . '.php')) {

            require_once(__DIR__ . '/../' . $dir. $className . '.php');

            return;

        }

    }


    throw new Exception('Can not load class : ' . $className);

});

?>

※ 예제소스

projectAutoload.zip


반응형

댓글0