先給大家說下什么是命名空間。
“什么是命名空間?從廣義上來說,命名空間是一種封裝事物的方法。在很多地方都可以見到這種抽象概念。例如,在操作系統中目錄用來將相關文件分組,對于目錄中的文件來說,它就扮演了命名空間的角色。具體舉個例子,文件 foo.txt 可以同時在目錄/home/greg 和 /home/other 中存在,但在同一個目錄中不能存在兩個 foo.txt 文件。另外,在目錄 /home/greg 外訪問 foo.txt 文件時,我們必須將目錄名以及目錄分隔符放在文件名之前得到 /home/greg/foo.txt。這個原理應用到程序設計領域就是命名空間的概念。”
PHP的自動加載就是我們加載實例化類的時候,不需要手動去寫require來導入這個class.php文件,程序自動幫我們加載導入進來。配合命名空間規范,我們可以在復雜系統中很輕松的處理不同類的加載和調用問題。
1. 自動加載的原理以及__autoload的使用
自動加載的原理,就是在我們實例化一個 class 的時候,PHP如果找不到這個類,就會去自動調用本文件中的 __autoload($class_name) 方法,我們new的這個class_name 就成為這個方法的參數。所以我們就可以在這個方法中根據我們需要new class_name的各種判斷和劃分就去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大神早已經想到。 所以 spl_autoload_register() 這樣又一個牛逼函數誕生了,并且取而代之它。它執行效率更高,更靈活。
先看下它如何使用,在index.php中加入以下代碼。
<?php spl_autoload_register(function($className){ if (is_file('./Lib/' . $className . '.php')) { require './Lib/' . $className . '.php'; }});$db = new Db();$db::test();
新聞熱點
疑難解答
圖片精選