2013-03-20 2 views
2

오토로더를 등록하는 방법과 오토로더를 작성하는 방법을 이해합니다. 이는 전혀 문제가되지 않습니다. 주요 문제는 어떻게 적 - 어떻게 같은 뭔가를 나란히 실행이 자동 로더합니까 : 당신은 자식 클래스가 밖으로 도달하는 프로젝트에 속한다는 것을 알 수 있습니다PHP로 오토로더 - 한 번에 2 개씩 실행

class project_one_folder_class extends project_two_folder_class{} 

를 부모 클래스를 호출 다른 프로젝트에서 찾습니다.

프로젝트가 연결된 방법 2의 클래스는 자동 로더에서 항상 보입니다. 프로젝트의 클래스가 보이지 않는 방법.

그래서 제가 생각한 방법은 두 개의 자동 로더를 작성하고 PHP를 등록한 다음에 등록 할 것이기 때문입니다. 어떻게 PHP는 하나만 찾고 다른 하나는 보이지 않는 것 같습니다.

어떻게 해결할 수 있습니까?

편집

프로젝트 두 부모, 프로젝트 하나는 아이입니다. 이것은 What was posted on this question보다 더 확장 된 질문입니다.

더 확장하려면 내 수업이 필요합니다.

class AisisCore_Loader_AutoLoader{ 

    protected static $_instance; 

    public function get_instance(){ 
     if(null == self::$_instance){ 
      self::$_instance = new self(); 
     } 

     return self::$_instance; 
    } 

    public function reset_instance(){ 
     self::$_instance = null; 
    } 

    public function register_auto_loader(){ 
     spl_autoload_register(array($this, 'load_class')); 
     spl_autoload_register(array($this, 'load_child_class')); 
    } 

    public function load_class($class){ 
     $path = str_replace('_', '/', $class); 
     if(file_exists(get_template_directory() . '/' . $path . '.php')){ 
      require_once(get_template_directory() . '/' . $path . '.php'); 
     } 
    } 

    public function load_child_class($class){ 
     $path = str_replace('_', '/', $class); 
     if(file_exists(get_stylesheet_directory() . '/' . $path . '.php')){ 
      require_once(get_stylesheet_directory() . '/' . $path . '.php'); 
     } 
    } 
} 

현재이 클래스는 상위 프로젝트에있는 모든 것을로드합니다. 자식 프로젝트에서 부모 프로젝트 개체를로드합니다. 이 클래스를 사용하여 하위 객체를 찾을 수 없으면 어떻게로드 할 수 있습니까?

워드 프레스에 익숙한 즉시 말할 것이다, 그래 그 당신이 get_stylesheet_directory을 할 때 당신은 어떻게 이제까지 get_template_directory을 가지고 있기 때문에 -이 알면 - 그때 아이가 get_stylesheet_directory 다음 중 하나를 사용하여 개체 프로젝트로드 2 가지 자동 로더, 하나를 작성하려는 그 그래서 get_stylesheet_directory 것을 통해 부모 객체를로드 : 초과 오류와

class project_one_folder_class extends project_two_folder_class{}

작품과 부하를.

+0

[PSR-0] (https://github.com/php-fig/fig-standards/blob/master/acc)을 살펴보십시오. epted/PSR-0.md) 표준을 준수합니다. –

+0

자동로드 설정을위한 PHP 코드를 보여줄 수 있습니까? – Travesty3

+0

@ Travesty3 추가 정보를 추가했습니다. – TheWebs

답변

1

이 조금 거친,하지만 당신은 실제로 단지 여러 디렉토리에서 검사 한 자동 로더가 필요합니다

abstract class Hakre_Theme_AutoLoader 
{ 
    public static $directories; 

    public static function init() 
    { 
     // configure paths 
     self::$directories = array(
      get_template_directory(), // current theme, parent in case of childtheme 
      get_stylesheet_directory(), // current theme, child in case of childtheme 
     ); 

     // please double check if you really need to prepend 
     return spl_autoload_register('Hakre_Theme_AutoLoader::autoload', true, true); 
    } 

    public static function autoload($class) 
    { 
     $filename = str_replace('_', '/', $class) . '.php'; 

     foreach (self::$directories as $directory) { 
      $path = $directory . '/' . $filename; 
      if (is_file($path)) { 
       require($path); 
       return; # leave because the class has been loaded 
      } 
     } 
    } 
} 


Hakre_Theme_AutoLoader::init(); 

## If you're unsure all worked out properly: 
var_dump(Hakre_Theme_AutoLoader::$directories); 

이 실제로는, 그러나 나는 그것을 테스트하지했습니다 않는해야합니다. var_dump을 참조하십시오. 올바른 디렉토리가 등록되었는지 여부를 디버깅 할 수 있습니다. 두 개의 디렉토리를 체크인하려고하기 때문에 다중 콜백을 가질 필요가 없습니다.

+0

- 무엇이 : : 자동로드?, 그냥 ithoery해야한다. : spl_autoload_register (array ($ this, 'load_class'), true, true); – TheWebs

+0

오류가 발견되었습니다. 그것을'load_class'로 바꾸거나 함수의 이름을'autoload'로 바꾸십시오 (지금 답안에서 그렇게 할 것입니다). 당신의 시나리오에서'var_dump' 출력은 무엇입니까? PHP 포함 경로를 구성하고 spl autoload가 나머지를 수행하도록 할 수도 있습니다 (PHP 채팅에서 나에게 말한 것뿐입니다). 어쩌면 능숙 해지는 것이 덜 복잡할까요?! – hakre

+0

내 코드에서 맞춤법 오류를 수정 한 후 작동합니다. – TheWebs

1

물론, 동일한 autoloader에서 첫 번째 file_exists가 false를 반환 할 때 두 번째 경로를 찾을 수 있습니다.

두 번째 경로에 두 번째 오토로더를 등록 할 수도 있습니다.

PHP docs 주소이 :

여러 자동로드 기능이 있어야하는 경우, spl_autoload_register()이 가능합니다. 이 함수는 자동로드 함수의 큐를 효과적으로 만들고 정의 된 순서대로 각 함수를 실행합니다. 반대로 __autoload()은 한 번만 정의 할 수 있습니다.

+0

두 번째 경로에서 어떻게 보이게합니까? 나는 하나 이상의 자동 로더를 등록했다. (필요한 경우 코드를 업데이트 할 수있다.) 어떻게 한 번만 사용하고 한 곳에서 보려고 했는가? – TheWebs

1

자동 로딩 프로세스를 분리하십시오!

PHP는 다음과 같이 작동합니다. 어떤 시점에서 코드가 실행되지 않아 아직로드되지 않은 클래스 참조가 발생합니다. $obj = new project_one_folder_class()

이제 등록 된 오토로더 함수가 먼저 추가됩니다 (나중에 추가 된 것들이 "prepend"매개 변수를 사용하지 않는 한).

첫 번째 (및 모든 후속) 자동로드 함수는로드해야하는 클래스의 이름을 가져옵니다. 함수에 이제 결정할 작업이 있습니다.

  1. 이 클래스를로드하는 작업입니까? 그렇지 않다면 아무 것도하지 말고 다른 함수가로드하려고합니다.
  2. 클래스를로드 할 책임이있는 경우 알려진 클래스 이름에서 경로와 파일 이름을 만들어이 파일을 필요로하십시오.

1 단계는 일반적으로로드 할 클래스 이름이 특정 접두어로 시작하는지 확인하여 해결됩니다. 귀하의 경우, "project_one_"로 시작하는 클래스를로드하는 책임이있는 오토로더는 다른 것으로 시작하는 다른 클래스를로드하려고 시도해서는 안됩니다.

자동 로더가 자동 로딩을 수행해야한다는 것을 알고 있으면 2 단계가 수행됩니다. 이제 클래스 이름을 상대 경로와 파일 이름으로 변환하고 기본 디렉토리를 추가 한 다음 파일을 필요로합니다.

다른 클래스를 확장하거나 인터페이스를 구현하는 클래스를 정의하는 파일을 요구하면 아직 알 수없는 클래스로 자동로드를 다시 실행할 수 있습니다. 귀하의 경우에는 autoload 프로세스가 "project_two_folder_class"클래스 이름으로 다시 시작됩니다. "project_one_"클래스의 첫 번째 오토로더는이 두 번째 클래스 이름으로 다시 호출되지만이 클래스를로드하는 방법을 모르기 때문에 아무 것도해서는 안됩니다. 이것은 "project_two_"클래스에 대해 알고있는 오토로더에 달려 있습니다.

등록 순서는 다른 오토로더에 상관 없습니다. 자동 로더가 작동하면 오작동합니다.

클래스 이름의 밑줄 문자를 DIRECTORY_SEPARATOR 및 네임 스페이스의 백 슬래시로 간단히 변환하고 끝에 ".php"를 추가 한 다음 정의 된 기준에서이 파일을로드하는 일반적인 패턴이므로 디렉토리에서 이러한 오토로더 중 두 개에 대한 코드는 동일 할 것이므로이 두 가지 경우에 하나의 자동로드 기능 만 구성하면 문제가 줄어 듭니다. 어떤 접두사가 있어야하고 어떤 기본 디렉토리가 있어야하는지 클래스 이름은 파일에 대한 상대 경로로 변환 될 수 있습니다.

파일이 특정 디렉토리에 존재하는지 여부를 항상 확인하는 것은 성능에 적합하지 않습니다. 결국 클래스 이름을보고로드 할 수 없다는 것을 알 수있는 파일 검사를 많이하게 될 것입니다.

그런데 : 오토로더 기능은 싱글 톤일 필요가 없습니다. 실제로, 싱글 톤 구현은 손상되고 쓸모가 없습니다. new으로 오토로더를 인스턴스화하고 구성 값을 생성자에 전달하고 spl_autoload_register()으로 호출하면 완료해야합니다.

0

하나 이상의 로더를 추가 할 수 있으며 각 기능을 spl_autoload_register()로 등록하면됩니다.

절차 스타일 :

spl_autoload_register('loader_function1')); 
// your second class location 
spl_autoload_register('loader_function2')); 

또는 OO 스타일

그러나 귀하의 질문에 따라
spl_autoload_register(array($this, 'loader_function1')); 
spl_autoload_register(array($this, 'loader_function2')); 

은 : 당신은 아마 더 유연한 자동 로더 을함으로써 같은 일을 수행 할 수있는 내 대답을 참조 여기 다른 질문 : Class autoloader in wordpress plugin

관련 문제