php自動載入機制
阿新 • • 發佈:2018-11-03
為什麼要實現自動載入機制?
在大專案中,就不用每次include/require檔案,省心又高效,只要你不嫌累的話,就可以不使用。
一、spl_autoload_register
語法:
sql_autoload_register(callback $function_name)
__autoload(callback $function_name)
為什麼不使用__autoload?而使用spl_autoload_register?
- __autoload因為是一個全域性函式,所以只能定義一次,使用多個會衝突報錯;而 sql_autoload_register可定義多個,它有效地建立一個佇列的自動裝載函式並按順序依次定義。
- spl_autoload_register是觸發異常,可被catch捕捉到,而__autoload不可以。
- SPL函式很豐富,有更多的操作空間:如spl_autoload_unregister()登出已經注。冊的函式、spl_autoload_functions()返回所有已經註冊的函式等
二、程式碼實現
<?php
/*
test.php
*/
error_reporting(0); // 抑制指令碼錯誤
define('DS',DIRECTORY_SEPARATOR); // 定義目錄分隔符常量
use test1\Test1;
use test2\Test2;
Class Test
{
public function __construct()
{
echo __CLASS__.PHP_EOL;
new Test1();
new Test2();
new Test3();
}
}
// 自定義載入器
function autoload($name){
$file = $name.'.php';
if (is_file($name.'.php')){
require_once $file;
}
else{
print_r ('已經註冊的載入器: ');
print_r(spl_autoload_functions());
print_r($name.'不存在');die;
}
}
// $class_name = __namespace__/__class__
try{
spl_autoload_register('autoload', true);
// spl_autoload_register('autoload1', true); //觸發異常
spl_autoload_register('autoload1', false); //無觸發異常
}catch (Exception $e){
print_r($e->getMessage());
}
new Test();
/* result:
Test
test1\Test1
test2\Test2
已經註冊的載入器: Array
(
[0] => autoload
)
Test3不存在
*/
// 由此可以看出,目錄名==空間名(採用小寫),檔名==類名(採用大駝峰法),類方法名(採用小駝峰法),函式名(採用下劃線)
<?php
/*
test1/Test1.php
*/
namespace test1;
class Test1
{
public function __construct()
{
echo __CLASS__.PHP_EOL;
}
}
<?php
/*
test2/Test2.php
*/
namespace test2;
class Test2
{
public function __construct()
{
echo __CLASS__.PHP_EOL;
}
}
可以推出自動載入的習慣:
- 目錄名==空間名(採用小寫)。
- 檔名==類名(採用大駝峰法)。
- 類方法名(採用小駝峰法)。
- 函式名(採用下劃線)。