最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

請(qǐng)離開include_once和require_once

 更新時(shí)間:2013年07月18日 11:08:55   投稿:jingxian  
盡量使用include, 而不是include_once, 理由是 include_once需要查詢一遍已加載的文件列表, 確認(rèn)是否存在, 然后再加載

誠然, 這個(gè)理由是對(duì)的, 不過, 我今天要說的, 是另外一個(gè)的原因.
我們知道, PHP去判斷一個(gè)文件是否被加載, 是需要得到這個(gè)文件的opened_path的, 意思是說, 比如:

復(fù)制代碼 代碼如下:

    <?php
    set_include_path("/tmp/:/tmp2/");
    include_once("2.php");
    ?>

當(dāng)PHP看到include_once “2.php”的時(shí)候, 他并不知道這個(gè)文件的實(shí)際路徑是什么, 也就無法從已加載的文件列表去判斷是否已經(jīng)加載, 所以在include_once的實(shí)現(xiàn)中, 會(huì)首先嘗試解析這個(gè)文件的真實(shí)路徑(對(duì)于普通文件這個(gè)解析僅僅類似是檢查getcwd和文件路徑, 所以如果是相對(duì)路徑, 一般是不會(huì)成功), 如果解析成功, 則查找EG(include_files), 如果存在則說明包含過了, 返回, 否則open這個(gè)文件, 從而得到這個(gè)文件的opened_path. 比如上面的例子, 這個(gè)文件存在于 “/tmp2/2.php”.

然后, 得到了這個(gè)opened_path以后, PHP去已加載的文件列表去查找, 是否已經(jīng)包含, 如果沒有包含, 那么就直接compile, 不再需要open file了.

1. 嘗試解析文件的絕對(duì)路徑, 如果能解析成功, 則檢查EG(included_files), 存在則返回, 不存在繼續(xù)
2. 打開文件, 得到文件的打開路徑(opened path)
3. 拿opened path去EG(included_files)查找, 是否存在, 如果存在則返回, 不存在繼續(xù)
4. 編譯文件(compile_file)

這個(gè)在大多數(shù)情況下, 不是問題, 然而問題出在當(dāng)你使用APC的時(shí)候…

但是, 很可惜, 如我所說, APC的include_once_override實(shí)現(xiàn)的一直不好, 會(huì)有一些未定義的問題, 比如:

復(fù)制代碼 代碼如下:

    <?php
    set_include_path("/tmp");
    function a($arg = array()) {
        include_once("b.php");
    }
    
    a();
    a();
    ?>

然后, 我們的b.php放置在”/tmp/b.php”, 內(nèi)容如下:
復(fù)制代碼 代碼如下:

    <?php
      class B {}
    ?>

那么在打開apc.include_once_override的情況下, 連續(xù)訪問就會(huì)得到如下錯(cuò)誤:
Fatal error - include() : Cannot redeclare class

排除這些技術(shù)因素, 我也一直認(rèn)為, 我們應(yīng)該使用include, 而不是include_once, 因?yàn)槲覀兺耆茏龅阶约阂?guī)劃, 一個(gè)文件只被加載一次. 還可以借助自動(dòng)加載, 來做到這一點(diǎn).

你使用include_once,只能證明, 你對(duì)自己的代碼沒信心.
所以, 建議大家, 不要再使用include_once

相關(guān)文章

最新評(píng)論

高雄市| 天峨县| 嫩江县| 毕节市| 修文县| 广宁县| 常熟市| 昌平区| 商洛市| 甘谷县| 保山市| 明光市| 北京市| 阿鲁科尔沁旗| 泽州县| 昌平区| 宜兴市| 伽师县| 金山区| 芦溪县| 东莞市| 金沙县| 盈江县| 关岭| 北川| 凤台县| 银川市| 大同县| 精河县| 大厂| 砚山县| 疏附县| 珠海市| 四会市| 玉田县| 玛多县| 永善县| 汪清县| 永宁县| 增城市| 高雄市|