개발! 딱 깔끔하고 센스있게!

PHP 에서 여러 디 렉 터 리 에 어떻게 spl autoload register 를 사용 합 니까? 본문

개발 스크랩 메모/PHP

PHP 에서 여러 디 렉 터 리 에 어떻게 spl autoload register 를 사용 합 니까?

렉사이 2020. 12. 11. 23:54

실제로 나 는 자신 을 위해 MVC 프레임 워 크 를 만 들 려 고 노력 하고 있 지만, Autoload 에 문제 가 있다.

사실 이 건 문제 가 아 닙 니 다.

하지만 전문가 에 게 물 어보 고 싶 습 니 다.

서로 다른 목록 이 있 을 때, 그들 은 어떻게 spl autoload register 함 수 를 사용 하 는 지.

만약 에 우리 가 다음 디 렉 터 리 가 있다 고 가정 하면:

Controllers Libs Models 

폴 더 마다 다른 클래스 가 포함 되 어 있 습 니 다.

예 를 들 어:

Controllers: Main.php File.php About.php Libs: Main.php Front_controller.php Models: Index.php File.php Login.php 

다른 디 렉 터 리 에서 같은 이름 의 파일 이름 을 찾 을 수 있 음 을 알 수 있 습 니 다.

좋아, 이것 이 바로 내 가 현재 시도 하고 있 는 것:

spl_autoload_register(function ($class) { $pathContorllers = 'Controllers/' . $class . '.php'; $pathLibs = 'Libs/' . $class . '.php'; $pathModels = 'Models/' . $class . '.php'; if (file_exists($pathContorllers)) { require_once $pathContorllers; } elseif (file_exists($pathLibs)) { require_once $pathLibs; } elseif (file_exists($pathModels )) { require_once $pathModels ; } }); 

이것 은 아주 좋 은 일이 지만, 나 는 다른 방법 이 있어 서 모든 것 을 더욱 쉽게 할 수 있다 고 믿는다.

누가 나 에 게 이 코드 를 더 좋 거나 더 간단 하 게 할 것 을 건의 할 수 있 습 니까? 이러한 상황 에서 전문가 들 은 무엇 을 사용 하고 있 습 니까?

대답 하 다.

이 답 을 받 을 수 있 는 개인 이 과거 정 보 를 얻 지 못 하도록 저 는 최신 PSR 자동 로 딩 기준 에 따라 업 데 이 트 를 했 습 니 다.

최초의 답 은 역사적 목적 과 PSR - 0 자동 장탄 기 에 만 관심 이 있 는 사람들 을 위 한 것 이 었 다.

업데이트 된 답

PHP - FIG 는 PSR - 0 기준 을 공식 적 으로 거부 하고 대신 사용 하 는 자동 로 딩 프로그램 PSR - 4 를 사용 합 니 다.

둘 은 어떤 면 에서 비슷 하지만 다른 면 에서 도 크게 다르다.

(예 를 들 어: 클래스 의 밑줄 을 처리 합 니 다.

)

"지금 PSR - 0 을 사용 하고 있 습 니 다.

일 을 잘 하고 있 습 니 다.

" 사실 PSR - 0 은 어떤 항목 에서 도 잘 하고 있 습 니 다.

이름 공간 을 사용 하지 않 는 가방 과 의 뒤쪽 호환성 을 고려 할 때 특히 그렇다.

PSR - 0 은 여전히 괜 찮 은 자동 로 딩 원리 이지 만 단점 이 있 습 니 다.

물론 프로 그래 밍 중 에 변 하지 않 는 것 이 있다 면 코드 가 최종 적 으로 바 뀌 고 프로 그래 밍 기술 은 계속 발전 할 것 입 니 다.

오늘 너 는 내일 을 위해 준비 하고, 스스로 를 도 울 수 있다.

따라서 프로젝트 를 시작 하거나 이름 을 사용 할 수 있 는 새로운 버 전의 PHP 에 이 식 를 하려 면 PSR - 4 자동 로 딩 프로그램 을 사용 하 는 것 을 진지 하 게 고려 해 야 합 니 다.

주의해 야 할 것 은 이름 이 사용 되 지 않 는 공간 을 개발 하고 있다 면 PSR - 4 는 사용자 에 게 적용 되 지 않 습 니 다.

이 경우, PSR - 0 또는 사용자 정의 자동 장 치 를 사용 합 니 다.


정 답

클래스 에서 이름 공간 을 사용 하 시 려 면 PSR - 0 로 케 이 터 는 아주 좋 은 자동 로 딩 방법 입 니 다.

기본적으로 이름 공간 은 디 렉 터 리 구 조 를 나타 내 며, 약속대로 로드 클래스 를 표시 합 니 다.

만약 PSR - 0 방법 이 모든 요 구 를 만족 시 키 지 못 한다 면 (또는 기 존 코드 를 잘 처리 하지 못 한다) spl autoload register 에 더 많은 함 수 를 추가 할 수 있 습 니 다.

PHP 는 이 함수 들 을 검사 하여 로드 를 시도 할 것 입 니 다.

예제 사용 방법:

먼저, PHP 의 이름 공간 에 익숙 하지 않 으 면 이 테마 에 대한 PHP 매 뉴 얼 에 도움 이 됩 니 다.

처음에 그들 은 약간 혼 란 스 러 웠 을 지 모 르 지만, 그들의 좋 은 점 은 처음에는 당 혹 스 러 웠 을 것 이다.

그래서 나 는 PSR - 0 이라는 명칭 공간 과 디 렉 터 리 구조 와 연 결 된 작업 을 한다 고 말 했다.

목록 을 예 로 들 자.루트 폴 더 (어디 든) 에 다음 내용 이 포함 되 어 있 습 니 다:

Project directory: <- Let's call this directory "MyProject" Controllers: Main.php File.php About.php Libs: Main.php Front_controller.php Models: Index.php File.php Login.php index.php <- Let's say this is your entry point file, this is where you will be autoloading stuff from. 

이제 콘 트 롤 메 인 팝 을 보 여 주세요.두 가 지 를 기억 하 십시오. 같은 이름 은 파일 이름 이 어야 합 니 다.

같은 이름 의 공간 은 파일 의 디 렉 터 리 경로 입 니 다.

그래서 Main. phop 은 다음 과 같다.

 

로그 인 모델 에 대해 서 같은 작업 을 수행 할 것 입 니 다.

 

현재 index. phop 파일 (루트 디 렉 터 리 - My Project) 에서 spl autoload 레지스터 를 호출 하여 PSR - 0 autoloader 에 게 보 냅 니 다.

spl_autoload_register( function ($className) { $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strrpos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; }); //Now you can make your call to your objects without a bunch of include/require statements $main = new \MyProject\Controllers\Main(); //Instantiates your 'Main' controller $login = new \MyProject\Models\Login(); //Instantiates your 'Login' model 

더 나 은 지리 적 으로 그것 을 이해 하 는 데 도움 이 되 기 를 바 랍 니 다.

또한, 이름 공간 을 사용 하지 않 으 려 면 닫 은 가방 을 SPL 자동 으로 스 택 에 추가 할 수 있 습 니 다.

필요 하 다 면 10 개의 서로 다른 자동 으로 장 치 를 추가 할 수 있 습 니 다.

PHP 는 각 함 수 를 사용 하여 클래스 를 하나씩 불 러 옵 니 다.

그러나 두 가지 약속 을 바탕 으로 한 자동 로 딩 절차 가 좀 더 깔끔 해 지 는 것 이 최선 의 방법 이 라 고 할 수 있 습 니 다.

또한, Autoloader 는 이름 공간 구분자 와 밑줄 을 디 렉 터 리 구분자 로 바 꾸 는 것 을 기억 해 야 합 니 다.

따라서 당신 의 Front contrller. phop 은 당신 이 예상 한 것 처럼 자동 으로 로 딩 되 지 않 습 니 다.

Comments