다음 composer 튜토리얼 칼럼에서는 작곡가 자동 로딩 메커니즘을 더 얕은 것부터 더 깊은 것까지 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!
머리말
작곡가의 자동 로딩 메커니즘에 남은 유일한 메모리는 "spl_auto???"와 "네임스페이스 기반 파일 경로 파생"뿐입니다. . . 아직 불완전합니다. .
온라인에서 자세한 설명을 모으고 싶었지만 내 의견에 맞는 "단순한 것부터 깊은 것까지" 기사를 찾을 수 없었습니다. 그래서 이 메모를 가지고 왔습니다.
다음 지식 포인트가 곧 제공될 예정입니다. 1. spl_autoload_register에 대해 알아보기 2. 작곡가 업데이트 이야기
Text1. spl_autoload_register에 대해 알아보기
(게으른 분들은 빨간 부분만 보시면 됩니다)
잘 모르셨나요?
현지어로 번역해 보겠습니다.
새 클래스를 생성하는 경우 먼저 클래스 파일을 요구하거나 포함해야 합니다. 로드되지 않으면 오류가 보고됩니다. 이로 인해 문제가 발생합니다. 이 경우 파일의 헤더는 요구 사항과 포함으로 가득 차 있는데, 이는 분명히 프로그래머의 "게으른" 요구 사항과 일치하지 않습니다.
클래스 파일을 요구하거나 포함하지 않고 정상적으로 새 클래스를 생성하기 위해 자동 로딩 메커니즘이 등장했습니다. spl_autoload_register 함수는 이를 위해 특별히 설계되었습니다.
스크린샷에서 우리는 이 함수에 세 개의 매개변수가 있다는 것을 알 수 있습니다:
Parameters
자세한 설명
autoload_function
여기에 채워진 것은 ***"함수"*의 이름입니다 **, 문자 문자열 또는 배열, 이 기능의 기능은 새로운 경우 오류 보고를 피하기 위해 가능한 한 새로운 파일이 필요한 파일을 요구하거나 포함하는 것입니다. 간단히 말해서 ***파일을 자동으로 로드하는 함수를 캡슐화해야 합니다***
throw
자동으로 로드되는 함수를 등록할 수 없을 때 예외를 발생시킬지
prepend
여부 함수 대기열의 헤드에 함수를 추가하려면 true이면 헤드이고, 그렇지 않으면 테일입니다
来一波代码,印象深刻一些:
//文件 testClass.php ,即将new的类
class TestClass{
public function __construct() {
echo '你已经成功new了我了';
}
}
//文件autoloadDemo.php文件
spl_autoload_register('autoLoad_function', true, true);
function autoLoad_function($class_name){
echo "所有的require或者include文件工作都交给我吧!\r\n";
$class_filename = "./{$class_name}.php";
echo "我来加载{$class_filename}文件\r\n";
require_once("./{$class_name}.php");
}
$obj_demo = new TestClass();
public function loadClass($class) {
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
大概可以看出,是做了文件的include。 继续跟踪下是怎么查找文件的,看findFile函数:
public function findFile($class) {
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}