php中關於require_once用法與相對目錄要謹慎使用

來源:互聯網
上載者:User
wwwroot //網站根目錄 絕對路徑為: F:/wwwroot

-- folder_a // 檔案夾A

  file_a_a.php   file_a_b.php   file_a_c.php

-- folder_b // 檔案夾B

file_b_a.php   file_b_b.php   file_b_c.php

-- index.php

*************************************************************

這個目錄層次已經很清楚了:

wwwroot為根目錄,下面有index.php檔案和folder_a,folder_b兩個檔案夾

這兩個檔案夾分別有3個php檔案

先來看index.php檔案的內容:

<?php     require_once("folder_a/file_a_a.php");     echo "檔案folder_a_a.php被包含成功";?>

再來看folder_a/folder_a_a.php檔案的內容:

<?php     require_once("../folder_b/file_b_a.php");     $x = new X();     $x.printInfo();?>

最後再來看看folder_b/folder_b_a.php檔案的內容:

<?php     class X{          function printInfo(){               echo 'success;          }     }?>

一聚教程網 >Php教程>>常見問題 >

php require_once用法與相對目錄要謹慎

www.111cn.net 更新:2012-06-25 編輯:xiewen 來源:轉載

文章介紹了大家在 php開發中會常常碰到的一個關於require_once用法,有需要的朋友可參考一下。

wwwroot //網站根目錄 絕對路徑為: F:/wwwroot

-- folder_a // 檔案夾A

file_a_a.php

file_a_b.php

file_a_c.php

-- folder_b // 檔案夾B

file_b_a.php

file_b_b.php

file_b_c.php

-- index.php

*************************************************************

這個目錄層次已經很清楚了:

wwwroot為根目錄,下面有index.php檔案和folder_a,folder_b兩個檔案夾

這兩個檔案夾分別有3個php檔案

先來看index.php檔案的內容:

代碼如下 複製代碼

<?php

require_once("folder_a/file_a_a.php");

echo "檔案folder_a_a.php被包含成功";

?>

再來看folder_a/folder_a_a.php檔案的內容:

代碼如下 複製代碼

<?php

require_once("../folder_b/file_b_a.php");

$x = new X();

$x.printInfo();

?>

最後再來看看folder_b/folder_b_a.php檔案的內容:

代碼如下 複製代碼

<?php

class X{

function printInfo(){

echo 'success;

}

}

?>

ok 如果我現在直接運行 floder_a/file_a_a.php

那麼會輸出: success

如果我運行 wwwroot下的index.php

那麼會報錯,原因是找不到包含檔案:file_b_a.php

但是如果我在所有的require_once()中加入 dirname(FILE).'/'

那麼無論運行 file_a_a.php 還是 index.php 都可以正常輸出

*********************************************************

問題:

我第一次使用的是相對路徑,所以重複包含的時候就出錯了

而我第二次使用的是絕對路徑,所以不出錯.可是我還是有點疑惑:

我先分析了以下使用相對路徑會出錯的原因:

我運行index.php,它能找到 folder_a目錄,也能找到該目錄下的file_a_a.php,於是它就把 folder_a/file_a_a.php 裡的內容複寫到了index.php 的第一行(包含語句的那行),然後再繼續運行(也就是運行包含過來的內容),因此此時等於是在index.php中運行 file_a_a.php 中的require_once('../folder_b/file_b_a.php'); 它根據當前index.php的位置去找這個路徑檔案(file_b_a.php),當然找不到啦,所以它出錯了.

可是我使用絕對路徑的時候不是一樣的道理嗎?可為什麼它就不出錯?可能這句話大家有點不解了,我來詳細說明(根據程式的運行順序來說明).

程式先運行 index.php(注意此時我加上了 dirname(FILE),所以當前是絕對路徑),

index.php先運行第一句代碼:require_once(dirname(FILE).'/'.'folder_a/file_a_a.php');

dirname(FILE) 就是 f:/wwwroot/ 所以這句程式碼封裝含的路徑也就是:

f:/wwwroot/folder_a/file_a_a.php

這個路徑是正確的,因此沒問題是吧

ok 第一步正確完成

然後它就把 file_a_a.php 中的代碼複製到的 index.php 的這個地方:

然後仍然繼續運行: 這是也就是在index.php 中運行file_a_a.php 中的所有代碼,那麼我們來看看它運行那些代碼?

<?php     require_once(dirname(FILE).'/'."../folder_b/file_b_a.php");     $x = new X();     $x.printInfo();?>

對就是這些,需要注意的是,這些代碼已經被複製到了index.php,也就是說,現在index.php的內容實際上就變成了:

<?php     require_once(dirname(FILE).'/'."../folder_b/file_b_a.php");     $x = new X();     $x.printInfo();     echo "檔案folder_a_a.php被包含成功";?>

我們來看個注意事項

假設有如下三個檔案, c.php a.php b.php 對應的存放目錄為:localhost/ localhost/ localhost/demo

c.phprequire_once("a.php");require_once("demo/b.php");B::demo();a.phpclass A{}

b.php的內容比較有意思,因為它自己要繼承 CLASS A 所以自己把a.php也引入進去了

require_once("../a.php");class B extends A{    public static function demo()    {    echo "xx";    }}

執行localhost/c.php 系統報錯,報錯資訊如下
Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:wwwdemob.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:php5pear') in F:wwwdemob.php on line 2但是,驚奇的發現,如果去掉b.php裡面的require_once語句,執行正常,那麼一定是require_once語句定義多了嗎?原因就是Class A重定義了兩次?可是不會啊。如果我只在c.php裡面加require_once(‘a.php’);這條語句,哪怕我寫兩遍也是沒錯的,那到底是咋回事呢?
原因就是,b.php定義的目錄和c.php執行檔案的目錄層級不一致,導致在c.php裡面require_once語句有兩條。使其相當於

require_once("a.php");require_once("../a.php");class B extends A{    public static function demo()    {    echo "xx";    }}B::demo();

原因找到了,因為在c.php裡面,其相對目錄 “..”就是 c.php的上一層了,導致檔案找不到報錯。
所以,我們的結論是,在 PHP 裡面,使用require_once的時候,存在不同層級關係,且有相對目錄的使用那麼一定要謹慎,小心。


require_once很簡單用但在使用時大家盡量使用絕對路徑了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.