和Python用module來區分代碼塊不同,PHP按照命名空間來區分,開始學PHP的時候一心認定了如果想用 use 關鍵字來導入(Python的習慣說法)一個類或者函數或者其他對象的話,必須先include該對象所在的文件,或者require該文件.相當於是把該文件代碼加載到內存代碼塊中,從而能夠搜索代碼塊並使用.
但是看了thinkPHP框架和guthub上一些項目后發現他們的代碼挺瀟灑的,居然不用include/require.這讓我對自己的認識產生了質疑...
少廢話了,自動加載使用的是PHP的
spl_autoload_register
函數,該函數的作用是用於注冊一些搜索規則*
當代碼需要引用某些變量,類等的時候,如果當前內存代碼塊中沒有,那么就會從這些注冊的規則中取挨個的套用匹配,直到找不到,然后報錯.
函數使用方式:
spl_autoload_register(function, throw, prepend) // throw 全都找不到是否拋錯 prepend 是否將規則加在隊列最前面(如果你的規則十分個性獨特,就可以放在最前面)
也可以用匿名函數的方式:
<?php namespace spa; spl_autoload_register(function ($class) { echo "wanted " . $class . "\n"; if ($class == "spa\Space") { $class = "Space.php"; } elseif ($class == "spa\Ele") { $class = __DIR__."/../learn_php/Ele.php"; } include_once $class; });
通過測試發現,每次需要執行本文件本命名空間不存在的代碼塊的時候,都會執行一遍如上注冊的函數,然后echo出的信息,當然項目框架最好是按照嚴格的命名規范來,這樣也容易寫出匹配規則,然后把該函數在項目的必經之路上執行一遍,就可以和那些瀟灑的代碼一樣,直接 use ,不用include/require 文件了.
*注意:
注冊規則的代碼一定要最先執行,或者至少要在你本應當執行include/require之前被執行.
