PHP 에서 autoload 와 네 임 스페이스 를 자동 으로 불 러 오 는 애플 리 케 이 션 소결
"네 임 스페이스 가 뭐 예요?"넓 은 의미 에서 볼 때 네 임 스페이스 는 사물 을 포장 하 는 방법 이다.많은 곳 에서 이런 추상 적 인 개념 을 볼 수 있다.예 를 들 어 운영 체제 에서 디 렉 터 리 는 관련 파일 을 그룹 으로 나 누 는 데 사용 되 며 디 렉 터 리 에 있 는 파일 에 있어 서 네 임 스페이스 역할 을 합 니 다.구체 적 으로 예 를 들 어 파일 foo.txt 는 디 렉 터 리/home/greg 와/home/other 에 동시에 존재 할 수 있 지만 같은 디 렉 터 리 에 두 개의 foo.txt 파일 이 존재 할 수 없습니다.또한 디 렉 터 리/home/greg 외 에 foo.txt 파일 에 접근 할 때 디 렉 터 리 이름과 디 렉 터 리 구분 자 를 파일 이름 앞 에 두 고/home/greg/foo.txt 를 받 아야 합 니 다."이 원 리 를 프로 그래 밍 분야 에 응용 하 는 것 이 바로 네 임 스페이스 의 개념 이다."
PHP 의 자동 로 딩 은 우리 가 실례 화 클래스 를 불 러 올 때 수 동 으로 require 를 써 서 이 class.php 파일 을 가 져 올 필요 가 없습니다.프로그램 이 자동 으로 불 러 와 서 가 져 옵 니 다.네 임 스페이스 규범 에 맞 춰 우 리 는 복잡 한 시스템 에서 서로 다른 로드 와 호출 문 제 를 쉽게 처리 할 수 있다.
1.자동 로드 의 원리 및autoload 사용
자동 으로 불 러 오 는 원 리 는 클 라 스 를 예화 할 때 PHP 에서 이 종 류 를 찾 지 못 하면 이 파일 의 를 자동 으로 호출 하 는 것 입 니 다.autoload($class_name)방법,우리 new 의 이 classname 은 이 방법의 매개 변수 가 됩 니 다.그래서 우 리 는 이 방법 에서 우리 가 필요 로 하 는 new classname 의 각종 판단 과 구분 은 require 에 대응 하 는 경로 류 파일 을 제거 하여 자동 으로 불 러 옵 니 다.
우리 먼저autoload()의 자동 호출,밤 들 기:
index.php
<?php
$db = new Db();
Db 클래스 를 수 동 으로 가 져 오지 않 으 면 프로그램 이 잘못 보고 할 수 있 습 니 다.이 종 류 를 찾 을 수 없다 고 합 니 다.Fatal error: Uncaught Error: Class 'DB' not found in D:\web\helloweba\demo\2017\autoload\index.php:2 Stack trace: #0 {main} thrown in D:\web\helloweba\demo\2017\autoload\index.php on line 2
그럼,우 리 는 지금 에 가입 합 니 다.autoload()이 방법 다시 보기:
$db = new DB();
function __autoload($className) {
echo $className;
exit();
}
위 에서 자동 으로 불 러 오 는 메커니즘 에 대한 설명 에 따 르 면 출력:Db,즉 new 클래스 의 클래스 이름 이 필요 합 니 다.그래서 이 럴 때 우 리 는autoload()방법 에 서 는 필요 에 따라 라 이브 러 리 파일 을 불 러 옵 니 다.2. spl_autoload_register 자동 로드
작은 프로젝트 라면autoload()는 기본 적 인 자동 로드 를 실현 할 수 있 습 니 다.하지만 하나의 항목 이 크 거나 다른 경로 의 파일 을 자동 으로 불 러 올 필요 가 있다 면 이 럴 때autoload 는 컵 기구 입 니 다.한 항목 에 하나의 만 허용 되 기 때 문 입 니 다.autoload()함수,PHP 에서 함수 이름 을 바 꾸 는 것 을 허용 하지 않 기 때 문 입 니 다.즉,2 개 를 설명 할 수 없습니다.autoload()함수 파일,그렇지 않 으 면 치 명 적 인 오류 가 발생 합 니 다.그럼 어 떡 하지?안심 하 세 요.당신 이 생각 한 것 은 PHP 의 신 이 이미 생각 했 습 니 다.그래서 splautoload_register()와 같은 또 하나의 강요 함수 가 탄생 하여 그것 을 대신 했다.그것 은 집행 효율 이 더욱 높 고 유연 하 다.
먼저 그것 을 어떻게 사용 하 는 지 보고 index.php 에 다음 코드 를 추가 합 니 다.
<?php
spl_autoload_register(function($className){
if (is_file('./Lib/' . $className . '.php')) {
require './Lib/' . $className . '.php';
}
});
$db = new Db();
$db::test();
Lib\\Db.php 파일 에 다음 코드 를 추가 합 니 다.
<?php
class Db
{
public static function test()
{
echo 'Test';
}
}
index.php 를 실행 한 후 new Db()를 호출 할 때 splautoload_register 는 lib/디 렉 터 리 에서 해당 하 는 Db.php 파일 을 자동 으로 찾 습 니 다.성공 하면$db:test()를 실행 할 수 있 습 니 다.마찬가지 로 Lib\\디 렉 터 리 에 phop 류 파일 이 여러 개 있 으 면 index.php 에서 직접 호출 할 수 있 으 며,require 여러 파일 을 사용 하지 않 아 도 됩 니 다.즉,splautoload_register 는 여러 번 반복 해서 사용 할 수 있다 는 점 이 해결 되 었 습 니 다autoload 의 단판,한 페이지 에 여러 개의 spl 이 있다 면autoload_register,실행 순 서 는 등록 순서에 따라 하나씩 찾 고 찾 으 면 멈춘다.
3. spl_autoload_register 자동 로드 와 namespace 네 임 스페이스
매우 복잡 한 시스템 에 대해 디 렉 터 리 구조 도 매우 복잡 할 것 이다.규범 화 된 네 임 스페이스 는 복잡 한 경로 에서 대량의 파일,함수,클래스 이름 을 바 꾸 는 문 제 를 해결 했다.자동 로드 는 현재 PHP 현대 프레임 워 크 의 초석 이 며,기본적으로 spl 입 니 다.autoload_register 는 자동 로 딩 을 실현 합 니 다.그래서 splautoload_register+namespace 가 주류 가 되 었 습 니 다.
PSR 시리즈 규범 에 따라 namespace 이름 은 매우 규범화 되 었 기 때문에 namespace 에 따라 상세 한 경 로 를 찾 아 클래스 파일 을 찾 을 수 있 습 니 다.
우 리 는 복잡 한 시스템 이 클래스 파일 을 자동 으로 불 러 오 는 방법 을 가장 간단 한 예 로 설명 한다.
우선,우 리 는 시스템 디 렉 터 리 구 조 를 준비 합 니 다.
----/Lib //
--Db.php
--Say.php
----autoload.php //
----index.php //
이상 은 기본 적 인 시스템 디 렉 터 리 입 니 다.우리 가 실현 하고 자 하 는 것 은 네 임 스페이스 와 자동 로드 를 사용 하여 홈 페이지 index.php 에서 Lib 디 렉 터 리 의 여러 종 류 를 직접 호출 하 는 것 입 니 다.우 리 는 두 개의 열 파일 을 준비 합 니 다.
Db.php
<?php
namespace Lib;
class Db
{
public function __construct()
{
//echo 'Hello Db';
}
public static function test()
{
echo 'Test';
}
}
Say.php
<?php
namespace Lib;
class Say
{
public function __construct()
{
//echo 'Hello';
}
public function hello()
{
echo 'say hello';
}
}
위의 두 개의 일반적인 클래스 파일 에 네 임 스페이스 를 추 가 했 습 니 다:namespace Lib;이러한 종류의 파일 은 Lib\\디 렉 터 리 이름 아래 에 있 음 을 표시 합 니 다.물론 프로젝트 이름 을 표시 하기 위해 다른 이름 을 마음대로 지 을 수 있 습 니 다.이제 autoload.php 를 보 겠 습 니 다.
<?php
spl_autoload_register(function ($class) {
$prefix = 'Lib\\';
$base_dir = __DIR__ . '/Lib/';
// does the class use the namespace prefix?
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
// no, move to the next registered autoloader
return;
}
$relative_class = substr($class, $len);
// Linux 。Windows (/ \)
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if (file_exists($file)) {
require $file;
}
});
이상 코드 사용 함수 splautoload_register()는 먼저 네 임 스페이스 를 사 용 했 는 지 판단 한 다음 호출 할 클래스 파일 이 존재 하 는 지 확인 하고 존재 하면 require 클래스 파일 을 확인 합 니 다.자,이제 홈 페이지 index.php 에서 이렇게 호출 합 니 다.
<?php
use Lib\Db;
use Lib\Say;
require './autoload.php';
$db = new Db();
$db::test();
$say = new Say;
$say->hello();
우 리 는 하나의 require 를 사용 하여 autoload.php 를 불 러 오고 use 키 워드 를 사용 하여 클래스 파일 경 로 를 절대 경로 로 바 꿀 수 있 습 니 다.물론 클래스 를 호출 할 때 경 로 를 모두 쓸 수 있 습 니 다.예 를 들 어 new Lib\Db();그러나 여러 종류 가 서로 호출 될 때 매우 까다 로 울 수 있 기 때문에 우 리 는 파일 시작 부분 에 use 를 사용 하여 경 로 를 잘 처리 합 니 다.다음은 Lib/디 렉 터 리 에 있 는 여러 종류의 파일 을 직접 호출 합 니 다.Lib/디 렉 터 리 에 여러 종류의 파일 을 배치 하여 시도 할 수 있 습 니 다.
index.php 를 실행 해서 원 하 는 대로 되 는 지 확인 하 세 요.
종결 어
이 글 은 자동 로드 와 네 임 스페이스 의 사용 을 간단하게 소개 합 니 다.실제 개발 에 서 는 autoload 자동 로드 문제 에 관심 이 많 지 않 습 니 다.대부분의 현대 PHP 프레임 워 크 는 파일 자동 로드 문 제 를 처리 하고 있 기 때 문 입 니 다.개발 자 는 업무 코드 에 만 관심 을 가지 고 규범 화 된 네 임 스페이스 를 사용 하면 됩 니 다.물론 대형 프레임 워 크 에 의존 하지 않 거나 phop 프레임 워 크 를 스스로 개발 하려 면 autoload 가 자동 으로 이 좋 은 물건 을 불 러 오 는 것 을 잘 알 아야 합 니 다.왜냐하면 우 리 는 게 으 름 을 피 우 고 일 을 많이 절약 할 수 있 기 때 문 입 니 다.
현대 php 에서 우 리 는 Composer 방식 으로 설 치 된 구성 요 소 를 자주 사용 합 니 다.모두 autoload 를 통 해 자동 으로 로드 할 수 있 기 때문에'게 으 름'자 는 우리 에 게 좋 은 개발 효율 을 가 져 다 주 었 습 니 다.
총결산
위 에서 말 한 것 은 소 편 이 소개 한 PHP 에서 autoload 와 네 임 스페이스 를 자동 으로 불 러 오 는 애플 리 케 이 션 소결 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.