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

php中autoload的用法總結(jié)

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

為什么要使用 Autoload

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

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

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

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

一般情況下,有很多種方法來解決加載時(shí)到相應(yīng)位置查找文件的方法。用的最多的就是指定特定的命名標(biāo)準(zhǔn)。

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文件

這種方法的缺點(diǎn)是在編碼過程中,我們必須明確的知道代碼文件應(yīng)當(dāng)所處的位置,而且由于

將文件路徑硬編碼在了類名中,如果需要修改文件夾的結(jié)構(gòu)時(shí),我們必須手工修改所有的類名。

'Include All'方法

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

例如:
復(fù)制代碼 代碼如下:
<?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;
    }
  }
?>

關(guān)聯(lián)文件和位置

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

調(diào)用的文件
復(fù)制代碼 代碼如下:
<?php
  require 'autoload_generated.php';

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

  $x = new A();
?>

當(dāng)然,如果文件特別多的時(shí)候,維護(hù)起來會是一件麻煩事,但是與在類名中硬編碼位置,哪個(gè)更好呢?

我們當(dāng)然不希望手工來維護(hù)這個(gè)列表,那么可以使用自動生成這個(gè)文件來實(shí)現(xiàn),這個(gè)對應(yīng)關(guān)系的文件可以是php/xml/json等等。原文的作者實(shí)現(xiàn)了一個(gè)這樣的工具,仔細(xì)考慮一下的話,這個(gè)不是很難實(shí)現(xiàn),原文作者甚至發(fā)展了一個(gè)小型的 Autoload 框架,值得學(xué)習(xí)。

php技術(shù)php中autoload的用法總結(jié),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 窝窝色资源站 | 杨幂被视频在线观看 | 亚洲VA欧美VA天堂V国产综合 | 亚洲AV无码一区二区三区乱子伦 | 国产精品视频免费视频 | 九九热这里有精品 | 虫族bl文全肉高h | 在线A亚洲老鸭窝天堂AV高清 | 欧美精品中文字幕亚洲专区 | 国产免费变态视频网址网站 | 暖暖日本大全免费观看 | 金发欧美一区在线观看 | 哇嘎在线精品视频在线观看 | 老师系列高H文 | 美女脱18以下禁止看免费 | 伊人久久大香线蕉综合色啪 | 亚洲熟妇AV乱码在线观看 | 日韩欧美亚洲精品综合在线 | ass亚洲熟妇毛耸耸pics | 试看做受120秒免费午夜剧场 | 美丽的姑娘BD在线观看 | 日本中文字幕巨大的乳专区 | 18禁无遮挡羞羞污污污污免费 | 国产永久免费高清在线观看 | 欧美最猛黑人AAAAA片 | 两百磅美女 | 精品久久香蕉国产线看观看麻豆 | 美女打开双腿扒开屁股男生 | 欧美激情视频二区 | 欧洲video60 | 公交车被CAO到合不拢腿 | 野花韩国中文版免费观看 | 97在线视频免费人妻 | 一个人在线观看的视频 | 漂亮的av女演员 | 国产精品免费大片 | 超嫩校花被灌醉在线观看 | 国产精品一区第二页 | 日本熟妇乱妇熟色在线电影 | 在线亚洲精品福利网址导航 | 尤物久久99国产综合精品 |