本文實例講述了PHP命名空間與自動加載類。分享給大家供大家參考,具體如下:
今天我要給大家介紹的是PHP的命名空間 和 自動加載類
我先簡單的分開演示 在放在一起
大家請看:
想必大家都應該知道__autoload
這個魔術方法
$db = new DB();function __autoload($className){echo $className;exit();//在這個里面引用類}
在運用這個類只能加載一次 ,在很多時候我們要引入的不止一個類這個時候怎么辦呢!
牛逼的php大神們 出了個新方法 來解決 這個問題 請看就是這個函數
spl_autoload_register()
滿足了此類需求。 它實際上創建了 autoload 函數的隊列,按定義時的順序逐個執行。相比之下, __autoload()
只可以定義一次。
這個函數的用法有很多 這里先給大家介紹一種使用方法
如下:
function load1($className){echo 1;require $className . '.php';}spl_autoload_register('load1'); //將load1函數注冊到自動加載隊列中。$db = new DB(); //找不到DB類,就會自動去調用剛注冊的load1函數了//php 5.3之后,也可以像這樣支持匿名函數了。spl_autoload_register(function($className){if (is_file('./lib/' . $className . '.php')) {require './lib/' . $className . '.php';}});
spl_autoload_register
的使用判斷是否有此文件
如果有引入 如果沒有 沒有如果了,哪來的如果
function load1($className){ echo 1; if (is_file($className . '.php')) { require $className . '.php'; }}function load2($className){ echo 2; if (is_file('./app/' . $className . '.php')) { require './app/' . $className . '.php'; }}function __autoload($className){ echo 3; if (is_file('./lib/' . $className . '.php')) { require './lib/' . $className . '.php'; }}//注冊了3個spl_autoload_register('load1');spl_autoload_register('load2');spl_autoload_register('__autoload');$db = new DB(); //DB就在本目錄下$info = new Info(); //Info 在/lib/Info.php
我們可以打印spl_autoload_functions()
函數,來顯示一共注冊了多少個自動加載:
var_dump(spl_autoload_functions());//數組的形式輸出array (size=3)0 => string 'load1' (length=5)1 => string 'load2' (length=5)2 => string '__autoload' (length=10)
一個php文件里 是不支持 new
兩個名字的
這個時候我們就能用的到命名空間了
namespace app;class new{public function ten(){echo "85";}}namespace hii;class new{public function ten(){echo "85";}}
spl_autoload_register
自動加載+namespace命名空間 的使用廢話不多數 看例子
AutoLoading/loading
<?phpnamespace AutoLoading;class loading {public static function autoload($className){ //把 / 轉換層 / , 便于兼容Linux文件找。Windows 下是通用的 //由于namspace 很規格,所以直接很快就能找到 $fileName = str_replace('//', '/', DIR . '//'. $className) . '.php'; if (is_file($fileName)) { require $fileName; } else { echo $fileName . ' is not exist'; die; } }}
上面就是一個自動加載的核心思想方法。下面我們就來spl_autoload_register
來注冊這個函數:
index.php
<?php//定義當前的目錄絕對路徑define('DIR', dirname(__FILE__));//加載這個文件require DIR . '/loading.php';//采用`命名空間`的方式注冊。php 5.3 加入的//也必須是得是static靜態方法調用,然后就像加載namespace的方式調用,注意:不能使用usespl_autoload_register("//AutoLoading//loading::autoload");// 調用三個namespace類//定位到Lib目錄下的Name.phpLib/Name::test();//定位到App目錄下Android目錄下的Name.phpApp/Android/Name::test();//定位到App目錄下Ios目錄下的Name.phpApp/Ios/Name::test();
由于我們是采用PSR-O方式來定義namespace
的命名的,所以很好的定位到這個文件的在哪個目錄下了。很爽。對不對。
APP/Android/Name
namespace App/Android;class Name{public function __construct(){echo __NAMESPACE__ . "<br>";}public static function test(){echo __NAMESPACE__ . ' static function test <br>';}}
所以就會很容易找到文件,并輸出:
Lib static function test
App/Android static function test
App/Ios static function test
好了?;镜臇|西就講完了.
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選