天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php中autoload的用法總結

php中提供了Autoload來幫助我們方便的進行文件的包含,但是autoload并非想象的那樣能夠處理所有的情況,今天就來記錄一下前幾天遇到的autoload存在的一些問題。

為什么要使用 Autoload

php中使用類時,我們必須在使用前加載進來,不管是通過 require 的方式還是 include 的方式,但是會有兩個問題影響我們做出加載的決定。

首先是不知道這個類文件存放在什么地方,另外一個就是不知道什么時候需要用到這個文件。特別是項目文件特別多時,不可能每個文件都在開始的部分寫很長一串的 require ….

php5之后,我們可以通過 __autoload來解決這個問題。 而且在php5.1之后,還提供了 spl_autoload_register() 來提供更完善的加載機制。

通過閱讀了 Autoloading in php 這篇文章,我理解的 Autoload 的加載機制,當通過 new 來實例化一個類時,php會通過定義的__autoload 函數加載相應的文件,如果這個類文件使用了 extends 或者 implements 需要用到其他的類文件,php會重新運行 autoload 去進行類文件的查找和加載,如果發生了兩次對同一類文件的請求,就會報錯。原文作者提供了三個很有趣的例子來說明這個問題,可以通過 這里 下載源碼查看。

一般情況下,有很多種方法來解決加載時到相應位置查找文件的方法。用的最多的就是指定特定的命名標準。

Zend的方法

zend推薦了一種最流行的辦法,在文件名中包含路徑。例如下面的例子:

// Main.class

function __autoload($class_name) {
    $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
    require_once $path.'.php';
}

$temp = new Main_Super_Class(); 所有的下劃線都會被替換成路徑中的分隔符,上例中就會去 Main/Super/Class.php文件

這種方法的缺點是在編碼過程中,我們必須明確的知道代碼文件應當所處的位置,而且由于

將文件路徑硬編碼在了類名中,如果需要修改文件夾的結構時,我們必須手工修改所有的類名。

'Include All'方法

如果是在一個開發環境中,并且對于速度不是很在意的話,使用這個方法是非常方便的。通過將所有類文件放在一個或幾個特定文件夾中,然后通過遍歷的方式查找加載。

例如:
復制代碼 代碼如下:
<?php
  $arr = array (
    'Project/Classes',
    'Project/Classes/Children',
    'Project/Interfaces'
  );

  foreach($arr as $dir) {
    $dir_list = opendir($dir);

    while ($file = readdir($dir_list)) {
      $path = $dir.DIRECTORY_SEPARATOR.$file;
      if(in_array($file, array('.', '..')) || is_dir($path))
        continue;

      if (strpos($file, ".class.php"))
        require_once $path;
    }
  }
?>

關聯文件和位置

另外一個方法是在類文件和他的位置之間建立關聯的配置文件,例如:
復制代碼 代碼如下:
// configuration.php
array_of_associations = array(
  'MainSuperClass' = 'C:/Main/Super/Class.php',
  'MainPoorClass' = 'C:/blablabla/gy.php'
);

調用的文件
復制代碼 代碼如下:
<?php
  require 'autoload_generated.php';

  function __autoload($className) {
    global $autoload_list;
    require_once $autoload_list[$className];
  }

  $x = new A();
?>

當然,如果文件特別多的時候,維護起來會是一件麻煩事,但是與在類名中硬編碼位置,哪個更好呢?

我們當然不希望手工來維護這個列表,那么可以使用自動生成這個文件來實現,這個對應關系的文件可以是php/xml/json等等。原文的作者實現了一個這樣的工具,仔細考慮一下的話,這個不是很難實現,原文作者甚至發展了一個小型的 Autoload 框架,值得學習。

php技術php中autoload的用法總結,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 麻豆精品无码久久久久久久久 | 亚洲AV久久久噜噜噜久久 | 野花日本完整版在线观看免费高清 | 中文字幕亚洲无限码 | 全黄h全肉细节全文 | 亚洲成A人片在线观看中文L | 亚洲AV 无码AV 中文字幕 | 538视频这里只有精品 | 久久国产视频网站 | 娇妻让壮男弄的流白浆 | 国语对白老女人8av 国语对白刺激真实精品 | 久久精品国产欧美成人 | 麻豆免费版 | 国产麻豆精品人妻无码A片 国产麻豆精品久久一二三 国产麻豆精品传媒AV国产在线 | 影音先锋 av天堂 | 亚婷婷洲AV久久蜜臀无码 | 怡春院院日本一区二区久久 | asmr淫语| 国厂精品114福利电影 | 果冻传媒 在线播放观看 | 先锋资源av | 国产精品2020观看久久 | 末班车动漫无删减免费 | 99re久久热最新地址一 | 成人天堂婷婷青青视频在线观看 | 免费看片A级毛片免费看 | 成人毛片免费播放 | 日韩欧无码一区二区三区免费不卡 | 国产久爱青草视频在线观看 | 欧美久久无码AV麻豆 | 蜜桃狠狠色伊人亚洲综合网站 | 后式大肥臀国产在线 | 纯肉合集(高H) | 国产69精品久久久久APP下载 | 99er4久久视频精品首页 | 成人国内精品久久久久影 | 亚洲乱亚洲乱妇13p 亚洲乱色视频在线观看 | 5566精品资源在线播放 | 亚洲AV无码影院在线播放 | 久久99视频免费 | 成人精品在线视频 |