1. 程式人生 > >php自動載入機制

php自動載入機制

為什麼要實現自動載入機制?
在大專案中,就不用每次include/require檔案,省心又高效,只要你不嫌累的話,就可以不使用。

一、spl_autoload_register

語法

  1. sql_autoload_register(callback $function_name)
  2. __autoload(callback $function_name)

為什麼不使用__autoload?而使用spl_autoload_register?

  1. __autoload因為是一個全域性函式,所以只能定義一次,使用多個會衝突報錯;而 sql_autoload_register可定義多個,它有效地建立一個佇列的自動裝載函式並按順序依次定義。
  2. spl_autoload_register是觸發異常,可被catch捕捉到,而__autoload不可以。
  3. 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;
    }
}

可以推出自動載入的習慣

  1. 目錄名==空間名(採用小寫)。
  2. 檔名==類名(採用大駝峰法)。
  3. 類方法名(採用小駝峰法)。
  4. 函式名(採用下劃線)。