2011-09-15 2 views
8

안녕하세요 저는 기타 코드 용 라이브러리를 개발하고 있습니다. 라이브러리에있는 일부 파일에서 나는 이런 식으로 뭔가를 가지고 :PHP 라이브러리를 만드는 방법, PHP 라이브러리를 독립적으로 만드는 방법은 무엇입니까?

require_once "lib/GuitarChord.php"; 
require_once "lib/Chord.php"; 
require_once "lib/Key.php"; 
require_once "lib/Tuning.php"; 

는 다른 라이브러리 파일이있는 곳알 필요가 없다, 그래서 나는이 라이브러리를 만들 수있는 방법?

이렇게하면 어떤 디렉토리 에든 라이브러리 파일을 가질 수 있습니까?

편집 : 두 번째 질문이 삭제되었습니다.

+2

한 번에 한 가지 질문 만하고 가능한 한 구체적인 질문을하는 것이 좋습니다. – Jon

+0

이 라이브러리를 볼 기회가 있습니까? GitHub에 있나요? – Gordon

답변

7

에 찾고 가치가있다. 당신이 할 때

그런 다음 당신이 Chord 클래스를로드 할 당신이 그것을 당신의 lib 폴더에 알고있는 경우
//AUTOLOADER 
function class_autoloader($class) { 

    // presumes classes are in './classes' 
    $folders = array(
    './', './../', './../../' 
    ); 
    $directories = array(
    'classes','lib', '' 
    ); 
    $dir = dirname(__FILE__); 
    $theClass = '/' . $folderedClass . '.php'; 


    foreach($folders as $folder){ 
     foreach($directories as $directory){ 
      $theInclude = $dir.$folder.$directory.$theClass; 

      if (file_exists($theInclude) && include_once($theInclude)) { 
       return TRUE; 
      } 
     } 
    } 

    trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING); 

    return FALSE; 
} 

spl_autoload_register('class_autoloader'); 

, 오토로더가 당신을 위해 일을 할 것입니다 :

new Chord(); 
예를 들어

spl_autoload_register

+0

다른 파일이 자동으로 어디에 있는지 라이브러리에 알릴 수있는 방법이 있습니까? 다른 파일은 항상 라이브러리 진입 점과 동일한 디렉토리에 있습니다. 예를 들어. require "lib/glib.php"; glib가 엔트리 포인트입니다. 다른 모든 파일은 lib /에 있다고 가정합니다. 이것이 가능한가? – carlosdubusm

+0

@carlos - 이것은'자동으로'자동로드라고합니다. – Neal

1

라이브러리가 포함 된 클래스의 전부 또는 대부분을 사용하는 경우 라이브러리와 관련된 모든 클래스를 동일한 파일에 저장하는 것이 좋습니다. 다른 솔루션은 더 많은 코드를 추가하기 만하면됩니다.이 경우에는 현재 방법을 사용하는 것이 좋습니다.

파일을 개발 목적으로 분리하려면 계속해서 그렇게하십시오. 그러나 사용자가 쉽게 포함 할 수 있도록 프로덕션 용으로 하나의 파일로 패키지 할 수 있습니다.

+0

첫 번째 off - 나는 downvote하지 않았다. 두 번째로 - 내 문제는 ** 당신이 ** BIG ** 클래스 파일 하나를 만들면 ** 당신이 필요로하지 않는 클래스를로드 할 수 있다는 것이다. 및 오토로더 – Neal

1

모든 클래스를 하나의 파일에 포함하지 않으려면 폴더 이름을 포함시켜야합니다. "

$lib_folder = "lib"; 

require_once $lib_folder . "/GuitarChord.php"; 
require_once $lib_folder . "/Chord.php"; 
require_once $lib_folder . "/Key.php"; 
require_once $lib_folder . "/Tuning.php"; 

데이터베이스의 다른 유형을 취급에 관해서는, 당신은 사용자가"MYSQL "을 설정하거나 있음을 $의에서 db_type 같은 다른 설정을 할 수 있습니다 : 당신은 사용자는하지만, 한 번 설정이 어딘가에 그것을 만들 수 있습니다 FILE ","XML "등등. db에 대한 호출을하는 곳에서는 switch 문을 사용하여 사용중인 데이터베이스 메소드를 확인하고 적절하게 호출을 변경하십시오.

편집 : 또한 이러한 클래스가 될 수있는 모든 위치에 대한 자동 로더를 작성 PHP's __autoload feature

0

과 함께 여러 다른 오토로더 콜백을 첨부 할 수 있습니다. Zend AutoLoader.

0

namespacesautoloaders을 확인해야합니다.

당신이 'GuitarChords'네임 스페이스 내의 모든 클래스를 가지고 말할 수 있습니다 - 그래서 당신은 단지 다음과 유사한 자동로드 기능 뭔가를 만들 수 있습니다 (당신이 당신의 자동 로더를 등록 파일을 가정하는 것은 "LIB"의 상위 디렉토리에있는) :

spl_autoload_register(function($class){ 
     $namespace = explode('\\', $class, 2); 
      if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) { 
      include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php'); 
      } 
    }); 

모든 라이브러리 세트/네임 스페이스에 대해 하나의 자동로드 기능을 등록하는 것이 더 좋습니다. 디렉토리를 반복하고 include_once, file_exists 등을 사용하면 시스템의 복잡성에 따라 약간의 불쾌한 IO 오버 헤드가 발생할 수 있습니다.

관련 문제