首頁  >  文章  >  後端開發  >  php中關於require_once用法與相對目錄要謹慎使用

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

黄舟
黄舟原創
2017-06-25 11:11:151880瀏覽

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 &#39;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.

-- index.php

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

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

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

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

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

 程式碼如下   複製程式碼   

32bc326a3801bc6b13425f2c3e040b58

   

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

 程式碼如下   複製程式碼   

 程式碼如下   複製程式碼   

#a7f7b8b6f44111f0065acc878120675a

   

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

 程式碼如下   複製程式碼   

 程式碼如下   複製程式碼   

 程式碼如下   複製程式碼   

##ec61887e0fc95982adc43a00fe0f60d3

   

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).&#39;/&#39;."../folder_b/file_b_a.php");
     $x = new X();
     $x.printInfo();
?>

对就是这些,需要注意的是,这些代码已经被复制到了index.php,也就是说,现在index.php的内容实际上就变成了:

<?php
     require_once(dirname(FILE).&#39;/&#39;."../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.php
require_once("a.php");
require_once("demo/b.php");
B::demo();a.php
class 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很简单用但在使用时大家尽量使用绝对路径了。

以上是php中關於require_once用法與相對目錄要謹慎使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn