## 3-2 類自動載入
最早的PHP是通過手動的 `include` 或 `require` 來載入依賴的文件的。如果依賴的文件越來越多,比如需要依賴幾十個類文件,就需要手動 `include` 或 `require` 幾十行。這樣管理起來其實很不方便,而且某個類如果刪除了,也會導致致命的錯誤。
因此,在PHP5.1.2之后就提供了類的自動載入功能。
出處:[PHP:類的自動加載](http://php.net/manual/zh/language.oop5.autoload.php)
### 1. 準備: 手動載入實例
*D:\wamp\www\demo\oop\test1.php*
~~~
<?php
namespace Test1;
class Test
{
static function test()
{
echo __METHOD__;
}
}
~~~
*D:\wamp\www\demo\oop\test2.php*
~~~
<?php
namespace Test2;
class Test
{
static function test()
{
echo __METHOD__;
}
}
~~~
*D:\wamp\www\demo\oop\test.php*
~~~
<?php
require "./test1.php";
require "./test2.php";
Test1\Test::test();
echo "</br>";
Test2\Test::test();
~~~
輸出結果:
~~~
Test1\Test::test
Test2\Test::test
~~~
我們使用的`require`引入了類,下面我們將不再使用`require`手動引入類文件,而是使用`__autoload__`自動加載類文件。
[`__autoload__`嘗試加載未定義的類](http://php.net/manual/zh/function.autoload.php)
### 2. 使用__autoload__實現自動加載
> 注意:PSR-0 規定類名要和文件名一致,所以下面我們也將類文件的首字母大寫了,因為我們在自動加載時,會自動獲取未定義的類名作為參數,來載入對應的類。
*D:\wamp\www\demo\oop\test.php*
~~~
<?php
Test1::test();
echo "</br>";
Test2::test();
function __autoload($class)
{
require __DIR__ . '/' . $class . '.php';
}
~~~
*D:\wamp\www\demo\oop\Test1.php*
~~~
<?php
class Test1
{
static function test()
{
echo __METHOD__;
}
}
~~~
*D:\wamp\www\demo\oop\Test2.php*
~~~
<?php
class Test2
{
static function test()
{
echo __METHOD__;
}
}
~~~
輸出結果:
~~~
Test1::test
Test2::test
~~~
可以看到,我們現在不需要手動加載類了,就自動加載到文件中。
但該方法后面慢慢廢棄了,因為如果1個文件都重復定義了`__autoload__`,就會報2個函數重名的錯誤。
于是出現了 [spl_autoload_register()](http://php.net/manual/zh/function.spl-autoload-register.php) 取代 `__autoload__` 。它的特點是允許在1個PHP文件中出現多次。
### 3. spl_autoload_register()實現自動載入
*D:\wamp\www\demo\oop\test.php* 改進后:
~~~
<?php
spl_autoload_register('autoload'); // 該函數可以在1個PHP文件中出現多次
Test1::test();
echo "</br>";
Test2::test();
function autoload($class)
{
require __DIR__ . '/' . $class . '.php';
}
~~~
- 序言
- 第1章 課程簡介
- 1-1 大話PHP設計模式課程簡介
- 第2章 開發環境準備
- 2-1 關于PHPStorm使用
- 2-2 關于編程字體選擇
- 2-3 關于運行環境搭建
- 第3章 命名空間與Autoload
- 3-1 關于命名空間
- 3-2 類自動載入
- 3-3 開發一個PSR-0的基礎框架
- 第4章 PHP面向對象
- 4-1 SPL標準庫簡介
- 4-2 PHP鏈式操作的實現
- 4-3 PHP魔術方法的使用
- 第5章 三種基礎設計模式
- 5-1 工廠模式
- 5-2 單例模式
- 5-3 注冊樹模式
- 第6章 適配器模式
- 6-1 適配器模式
- 第7章 策略模式
- 7-1 策略模式的實現和使用
- 7-2 策略模式的控制反轉
- 第8章 數據對象映射模式
- 8-1 數據對象映射模式之簡單案例實現
- 8-2 數據對象映射模式之復雜案例實現
- 第9章 觀察者模式
- 第10章 原型模式
- 第11章 裝飾器模式
- 第12章 迭代器模式
- 第13章 代理模式
- 第14章 綜合實戰
- 14-1 面向對象設計基本原則
- 14-2 MVC結構
- 14-3 自動加載配置
- 14-4 從配置中生成數據庫連接
- 14-5 裝飾器模式在MVC中的使用
- 14-6 觀察者模式在MVC程序中的使用
- 14-7 代理模式在MVC程序中的使用
- 14-8 課程小結