欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP自動加載機制實例詳解

PHP自動加載機制實例詳解

熱門標簽:沈陽人工智能電銷機器人公司 h5 地圖標注 電銷機器人-快迭智能 高識別電銷機器人 哈爾濱400電話辦理到易號網 拉薩打電話機器人 智能外呼電銷系統 寶安400電話辦理 合肥外呼系統app

本文實例講述了PHP自動加載機制。分享給大家供大家參考,具體如下:

在php中,我們一般使用 require, requre_once, include, include_once 這四個命令來加載其他php文件,這在一般小型的php文件中是沒有任何問題的,相信每個初學者都會遇到這樣的應用場景:使用一個 Db.php 來定義數據庫連接,在其他文件中直接引用這個文件,達到代碼復用的效果。

再讓我們考慮這樣一個應用場景,如果我們使用一個框架,或者一個第三方包,里面一般有成百上千個類文件,而我們通常是不用自己去加載這些文件的,此時用的便是php的自動加載機制

定義一種自動加載模式

在傳統的應用中,通常自定義 __autoload()。如下

define("DIR", "/var/www/myWeb/myClass/");
function __autoload($classname) {
  require DIR.$classname.'.class.php';
}
$book = new Book();

上述代碼運作過程如下:

1. 自定義 __autoload 函數,它定義了類文件的加載方式
2. 當我們 new 一個 Book 實例時,它首先看當前是否包含了這個類,如果不存在則自動調用 __autoload 函數并將類名 Book 作為參數傳遞給這個函數。這實際上就是一種動態(tài)加載的方式,只有我們需要的類文件才會被加載。
3. 找到 __autoload 函數后,發(fā)現定義好的加載動作 require DIR.$classname.'.class.php'; 這時候它就會去 DIR 目錄下查找 Book.class.php 文件,如果存在這個文件則加載。
4. 關于類 Book.class.php 的定義必須滿足如下條件:類名和文件名一致;一個文件只定義一個類。

Book.class.php 文件如下

class Book {
  public function __construct() {
    echo "this is Book's construct\n";
  }
}

注冊多種加載模式

對于我們自己的簡單應用,一種加載模式可能夠用了,但是對于較大型的應用,上面的方式存在明顯的缺陷:__autoload函數不能重復定義,也就是說我們只能定義一種加載文件的模式,最終的結果就是我們的類只能放在一個地方,這顯然是不符合實際要求的。因此php使用了函數 spl_autoload_register 來代替 __autolaod

代碼如下:

define("MODEL_DIR", "/var/www/myWeb/myModel/");
define("CONTROLLER_DIR", "/var/www/myWeb/myController/");
// 定義Model類加載方式
function loadModel($classname) {
  $filename = MODEL_DIR.$classname.'.php';
  if (file_exists($filename))
    require $filename;
}
// 定義Controller加載方式
function loadController($classname) {
  $filename = CONTROLLER_DIR.$classname.'.php';
  if (file_exists($filename))
    require $filename;
}
// 注冊兩個加載函數
spl_autoload_register("loadModel");
spl_autoload_register("loadController");
// 自動加載類文件
$bookMode = new BookMode();
$bookController = new BookController();

在上面的代碼中,我們可以看到:

1. 可以使用任意函數名定義多個加載函數
2. 在 spl_autoload_register 對加載函數進行注冊,實際上應該是添加到一個類似雙向隊列的數據結構中。
3. 當我們 new 的對象不存在于當前文件時,它會自動從我們的加載函數中查找,并且是按照我們使用 spl_autoload_register 注冊的順序進行的。
4. 需要注意的是,此時如果我們定義了 __autoload 方法,也必須進行注冊,否則會被忽略。

spl_autoload_register三種注冊函數的方式:

spl_autoload_register(funName); // 直接注冊一個普通加載函數
spl_autoload_register(obj::method); // 注冊一個靜態(tài)加載方法
spl_autoload_regitser(array(obj, method)); // 當obj為類字符串時,只能加載靜態(tài)方法。否則都可以。

實例

在各種php框架中,也大量用到了自動加載機制,我們通過laravel的一個小例子來看下。

laravel通過 Ioc 容器幫我們管理依賴,讓我們可以通過函數參數的方式愉快地獲得了類實例,但我們也發(fā)現,我們并沒有require文件,那容器又是如何找到我們的文件地址的?下面我們就來解決這個問題。

通過入口文件 index.php 我們一步步搜索,可以找到 /vendor/composer/ClassLoader.php 文件。

部分代碼如下

public static function loadClassLoader($class)
{
  if ('Composer\Autoload\ClassLoader' === $class) {
    require __DIR__ . '/ClassLoader.php';
  }
}
public static function getLoader()
{
  if (null !== self::$loader) {
    return self::$loader;
  }
  spl_autoload_register(array('obj', 'loadClassLoader'), true, true);
  // 通過命名空間的方式使用注冊的加載類
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
  spl_autoload_unregister(array('obj', 'loadClassLoader'));
  if (PHP_VERSION_ID >= 50600) {
    // 該文件定義了包類和用戶類的命名空間和實體文件的映射
    // 以及其他一些東西
    require_once __DIR__ . '/autoload_static.php';
    // 初始化$loader一些屬性。
    // 我們關注autoload_static.php文件的類映射
    // 被賦值在了 $loader的$classMap屬性
        call_user_func(\Composer\Autoload\ComposerStaticInit::getInitializer($loader));
    // ...
  }
  // ...
  $loader->register(true);
  // ...
  return $loader;
}

它調用了 getLoader() 函數,并將 loadClassLoader 函數注冊到加載函數注冊隊列。然后就可以通過命名空間的方式 self::$loader = $loader = new \Composer\Autoload\ClassLoader(); 實例化 ClassLoader 類。

緊接著,他載入了 /autoload_static.php 文件,大致內容如下

// 里面還定義了包類和psr的一些標準
public static $classMap = array (
  'App\\Common\\Collection' => __DIR__ . '/../..' . '/app/Common/Collection.php',
  'App\\Common\\MgDB' => __DIR__ . '/../..' . '/app/Common/MgDB.php',
  'App\\Common\\Redis' => __DIR__ . '/../..' . '/app/Common/Redis.php',
)

看到這里筆者興奮了,因為上面的 Collection, Redis 正是筆者定義的類!
然后就是我們在laravel經常聽到的一個名詞 “register”。查看 ClassLoader 類的 register 方法如下:

public function register($prepend = false)
{
  spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
public function loadClass($class)
{
  if ($file = $this->findFile($class)) {
    includeFile($file);
    return true;
  }
}
public function findFile($class)
{
  // ...
  // class map lookup
  if (isset($this->classMap[$class])) {
    return $this->classMap[$class];
  }
  // ...
}

上面的register方法同樣使用了自動加載機制。并將通過findFile函數和$classMap數組直接找到對應的類的具體位置。這也就是我們不用自己去加載類文件的原因 – 當我們實例化一個代碼中找不到的類時,它便會在這里加載對應的類。

看到這里我們也發(fā)現了它的使用和我們之前講的并不完全一致,我們是注冊函數是為了通過文件夾來尋找類,而laravel注冊函數是為了注冊一個映射數組然后直接調用(整了個映射文件三千多行。。。)具體為什么要這么做得等下次通讀加載源碼部分后再寫一篇博文(本來只想找一個框架的例子,蜜汁尷尬)

筆者實例

兩年前負責學校某個協會線上部分時,主要是做微信開發(fā),因為時不時就要加一個新功能,所以如果用一般的方式寫起來是比較痛苦的,但是用框架又有點大材小用。因為就使用了下面這種簡單的方式:

require "./basic/init.php";
define('WEB_PATH', '');
//聲明自動加載函數并注冊,指示加載路徑與加載方法
  function wechatAutoload($class_name)
  {
    $file_road = './function/'.$class_name.'.class.php';
    if(file_exists($file_road))
    {
      require_once($file_road);
    }
  }
  spl_autoload_register('wechatAutoload');
//----------------------------------------------

初始化好配置之后,我們注冊了一個加載函數,以后每一個新功能都只要在 function 文件夾下新增一個文件即可,其他部分的改動很少或者根本不用(根據業(yè)務場景)。

參考:PHP: spl_autoload_register - Manual

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • 說說PHP的autoLoad自動加載機制
  • PHP的autoload自動加載機制使用說明
  • PHP autoload與spl_autoload自動加載機制的深入理解
  • PHP面向對象自動加載機制原理與用法分析
  • thinkPHP5.0框架自動加載機制分析
  • php自動加載機制的深入分析
  • php _autoload自動加載類與機制分析
  • php自動加載autoload機制示例分享

標簽:梅州 山東 泰州 威海 巴中 成都 林芝 張家口

巨人網絡通訊聲明:本文標題《PHP自動加載機制實例詳解》,本文關鍵詞  PHP,自動,加載,機制,實例,;如發(fā)現本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP自動加載機制實例詳解》相關的同類信息!
  • 本頁收集關于PHP自動加載機制實例詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    一本高清dvd不卡在线观看| 国产av自拍一区| 在线观看黄网址| 日韩一二在线观看| 亚洲综合丝袜美腿| 国产一区二三区| 黄色片视频免费观看| 欧美视频精品在线| 欧美激情综合五月色丁香 | 亚洲国产精品天堂| www.av亚洲| 久久久精品成人| 日韩免费性生活视频播放| 亚洲成年人影院| 国产精品偷伦视频免费观看了| 色综合久久久久久久久久久| 中文字幕巨乱亚洲| 国产一区二区免费在线| 久久精品老司机| 91精品国产综合久久婷婷香蕉 | 欧美午夜视频网站| 亚洲美女少妇撒尿| 9色porny自拍视频一区二区| 91精品国产高清一区二区三蜜臀| 国产精品全国免费观看高清| 国产高清亚洲一区| 三级在线观看免费大全| 亚洲国产精品激情在线观看| 韩国中文字幕2020精品| 国产二级一片内射视频播放| 91精品国产美女浴室洗澡无遮挡| 午夜精品在线看| 97人妻精品一区二区免费| 久久品道一品道久久精品| 国产一区二区三区久久悠悠色av| 日韩在线一卡二卡| 一区二区三区在线视频播放 | 国产精品久久免费看| www..com久久爱| 5月丁香婷婷综合| 久久99深爱久久99精品| 九九精品视频免费| 一区二区三区波多野结衣在线观看| 国产xxxxxxxxx| 久久久久久久久久久电影| 成人一区在线看| 欧美日韩黄视频| 久久国产精品99久久久久久老狼| 中文字幕第69页| 一区二区在线观看视频| 香蕉视频黄色在线观看| 国产日韩欧美高清| av不卡在线播放| 欧美一级夜夜爽| 国产福利不卡视频| 欧美乱妇23p| 国产综合一区二区| 欧美视频三区在线播放| 激情五月激情综合网| 欧美在线不卡视频| 久久激情五月婷婷| 欧美影院一区二区| 狠狠色狠狠色综合系列| 欧美体内she精视频| 久久精品国产精品青草| 色狠狠综合天天综合综合| 丝袜亚洲另类丝袜在线| 波多野结衣喷潮| 肉色丝袜一区二区| 国产极品美女在线| 日韩av高清在线观看| 欧美人禽zoz0强交| 麻豆国产欧美日韩综合精品二区| 色悠悠久久综合| 精品中文字幕一区二区| 欧美视频在线播放| 国产成人午夜高潮毛片| 91精品国产欧美一区二区18| 成人综合日日夜夜| 欧美哺乳videos| 日本人dh亚洲人ⅹxx| 亚洲精品一区二区三区影院| 国产又黄又嫩又滑又白| 中文字幕乱码亚洲精品一区| 国产精品1000部啪视频| 亚洲精品日韩一| 老司机精品免费视频| 日本不卡免费在线视频| 欧美三级中文字幕| 国产成人鲁色资源国产91色综| 欧美一区二区在线不卡| 99久久婷婷国产综合精品 | 欧美不卡在线视频| 午夜影院福利社| 国产精品久久久久久久岛一牛影视 | 午夜精品福利一区二区蜜股av| 青青青在线免费观看| 国产一区日韩二区欧美三区| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲综合精品自拍| 色综合网色综合| 国产风韵犹存在线视精品| 欧美大片一区二区| 国产精品果冻传媒| 亚洲精品第一国产综合野| 丁香花五月激情| 国产高清成人在线| 久久久天堂av| 欧美大波大乳巨大乳| 日韩vs国产vs欧美| 精品粉嫩aⅴ一区二区三区四区| 91玉足脚交白嫩脚丫| 亚洲成av人片在www色猫咪| 欧美在线视频全部完| 99国产精品久久久久| 1024成人网色www| 午夜剧场免费在线观看| 国产尤物一区二区在线| 久久久综合精品| 久久久久久亚洲中文字幕无码| 日韩和欧美的一区| 4hu四虎永久在线影院成人| 日本r级电影在线观看 | 不许穿内裤随时挨c调教h苏绵| 中文字幕一区二区三区在线播放| 强制高潮抽搐sm调教高h| 国产老女人精品毛片久久| 久久久久久久久久电影| 少妇的滋味中文字幕bd| 国产精品99久久久久久宅男| 国产亚洲精品aa| 中国1级黄色片| 国产成人丝袜美腿| 国产精品九色蝌蚪自拍| 欧美卡一卡二卡三| av激情成人网| 一区二区三区.www| 7777精品久久久大香线蕉| 国产一级二级视频| 美女视频一区二区三区| 亚洲精品一区二区精华| 色婷婷国产精品免| 国产成人av一区二区| 国产精品美女久久久久av爽李琼| 无码人妻精品一区二区三区夜夜嗨| 不卡av在线网| 洋洋av久久久久久久一区| 88在线观看91蜜桃国自产| 波多野结衣福利| 国产在线视频一区二区| 国产精品区一区二区三区| 在线观看国产精品网站| 男人女人拔萝卜视频| 日韩高清在线一区| 国产日韩欧美综合一区| 国产高潮流白浆| av电影中文字幕| 欧美aaa在线| 欧美国产一区二区在线观看| 色综合久久久网| 逼特逼视频在线观看| 麻豆精品新av中文字幕| 国产精品美女www爽爽爽| 精品视频999| 干b视频在线观看| 成人久久久精品乱码一区二区三区| 亚洲自拍另类综合| 精品美女一区二区三区| 免费精品在线视频| 精品人妻在线视频| 极品销魂美女一区二区三区| 国产精品不卡视频| 欧美一区二区成人| 亚洲女人久久久| 丰满岳乱妇一区二区 | 337p亚洲精品色噜噜噜| 国产男女猛烈无遮挡a片漫画| 国产91在线观看| 亚洲一区二区av在线| 久久综合久久综合久久| 日本福利一区二区| 亚洲国产欧美视频| 成人高清在线视频| 免费观看在线综合色| 国产精品美女久久久久久| 91精品国产综合久久精品app| 国产无遮挡在线观看| 亚洲熟女一区二区三区| 国产揄拍国内精品对白| 亚洲成人av福利| 国产农村妇女精品| 欧美一区二区三区啪啪| 国产a免费视频| 91成人破解版| 日本少妇一级片| 国产精品小仙女| 偷拍一区二区三区四区| 国产精品无圣光一区二区| 欧美一二三四在线| 在线国产亚洲欧美|