多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > php教程 > PHP include_path 用法詳解

PHP include_path 用法詳解

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-06-04 11:31:32 閱讀次數(shù):4016次

ini_set('include_path', CAKE_CORE_INCLUDE_PATH . PATH_SEPARATOR . ROOT . DS . APP_DIR . DS . PATH_SEPARATOR . ini_get('include_path'));

我們看到這個(gè)程序動(dòng)態(tài)修改include_path,不過(guò)cake在這兒是把 CAKE_CORE_INCLUDE_PATH 和 APP_DIR 加到 include_path里,并且優(yōu)先在這兩個(gè)目錄下找包含程序.

注意到它這里用到了PATH_SEPARATOR這個(gè)變量,這樣這段代碼在windows和linux下能通用.

從中受到啟發(fā),我們可以根據(jù)自己的需要把一些include目錄動(dòng)態(tài)的加入進(jìn)來(lái),比如說(shuō)我們有很多l(xiāng)ibs:lib1,lib2,lib3等等,我們不必把這些libs都加到include_path里,因?yàn)樗鼈冎g可能沖突.

可以建立一個(gè)inc_dir,并把這個(gè)目錄加入到include_path,在inc_dir下,分別建立inc_path1.php inc_path2.php inc_path3.php,分別寫入:

  1. <?php 
  2. ini_set('include_path'ini_get('include_path').PATH_SEPARATOR.$dirToLib1); 
  3. <?php 
  4. ini_set('include_path'ini_get('include_path').PATH_SEPARATOR.$dirToLib2); 
  5. <?php 
  6. ini_set('include_path'ini_get('include_path').PATH_SEPARATOR.$dirToLib3); 

在寫程序的時(shí)候,比如要用lib2的functions.php,就可以這么寫:

  1. <?php 
  2. require 'inc_path2.php'
  3. require 'functions.php'
  4. ?> 

當(dāng)時(shí)候函數(shù)include(),require(),fopen_with_path()函數(shù)來(lái)尋找文件時(shí)候.在不設(shè)置include_path的情況下,這些函數(shù)打開文件時(shí)候默認(rèn)的是以web根目錄去尋找.當(dāng)設(shè)置include_path以后,這些php函數(shù)就會(huì)先在指定的include_path目錄下面去搜索尋找.

其原理和window系統(tǒng)的環(huán)境變量相似,在window運(yùn)行cmd命令的時(shí)候,輸入一些cmd的命令之后系統(tǒng)會(huì)在其設(shè)定的環(huán)境變量里面去搜索這些命令是否存在,存在就可以執(zhí)行.

2.include_path的設(shè)置

第一種方法:修改php.ini文件中的include_path項(xiàng)。

include_path = .:/usr/local/lib/php:./include 

第二個(gè)方法:使用ini_set方法。 

ini_set("include_path", ".:../:./include:../include");     

3.注意 

zendframework include 設(shè)置 index.php,代碼如下:

  1. set_include_path('.' .PATH_SEPARATOR.'../library/'  
  2. .PATH_SEPARATOR.'./application/models/'  
  3. .PATH_SEPARATOR.'./application/lib/'  
  4. .PATH_SEPARATOR.get_include_path()); 

PATH_SEPARATOR是一個(gè)常量,在Linux系統(tǒng)中是一個(gè)" : "號(hào),Windows上是一個(gè)";"號(hào),所以編寫程序時(shí)最好用常量 PATH_SEPARATOR 代替,否則如果系統(tǒng)從linux移植到win系統(tǒng)或反過(guò)來(lái)移植會(huì)出錯(cuò).

get_include_path取得當(dāng)前已有的環(huán)境變量,加上前面的設(shè)置就是新的系統(tǒng)include

include_path是怎么起作用的?

如果有多個(gè)include_path順序是怎么樣的?什么情況下include_path不起作用?今天,我就全面的介紹下這個(gè)問題,先從一個(gè)例子開始吧.如下的目錄結(jié)構(gòu):

  1. root  
  2.   ├ 1.php  
  3.   ├ 3.php  
  4.   └ subdir  
  5.        ├ 2.php  
  6.         └ 3.php 

在1.php中:

  1. <?php  
  2. ini_set(“include_path”, “.:path_to_subdir”);  
  3. require(“2.php”);  
  4. ?> 

而在2.php中:

  1. <?php  
  2. require(“3.php”);  
  3. ?> 

而在root目錄下的3.php打印出”root”,在subdir目錄下的3.php打印出”subdir”;現(xiàn)在,我的問題來(lái)了:

1. 當(dāng)在root目錄下運(yùn)行1.php,會(huì)得到什么輸出?

2. 在subdir下運(yùn)行上一級(jí)目錄的1.php,有會(huì)得到什么輸出?

3. 當(dāng)取消include_path中的當(dāng)前目錄path(也就是include_path=”path_to_subdir”),上面?zhèn)z個(gè)問題又會(huì)是什么輸出?

PHP中的include_path

PHP在遇到require(_once)/include(_once)的指令的時(shí)候,首先會(huì)做如下的判斷:

要包含的文件路徑是絕對(duì)路徑么? 

如果是, 則直接包含, 并結(jié)束. 

如果不是, 進(jìn)入另外的邏輯(經(jīng)過(guò)多次調(diào)用,宏展開后進(jìn)入_php_stream_fopen_with_path)尋找此文件 

接下來(lái),在_php_stream_fopen_with_path中,會(huì)做如下判斷:

要包含的文件路徑是相對(duì)路徑么(形如./file, ../dir/file, 以下用”目錄相對(duì)路徑代替”)? 

如果是,則跳過(guò)include_path的作用邏輯,直接解析相對(duì)路徑(隨后單獨(dú)介紹),會(huì)根據(jù)include_path,和當(dāng)前執(zhí)行文件的path組成一個(gè)待選的目錄列表,比如對(duì)于文章前面的例子來(lái)說(shuō),會(huì)形成一個(gè)如下的待選列表.

“.:path_to_subdir:current_script_dir 

然后,依次從待選列表頭部開始,根據(jù)DEFAULT_DIR_SEPARATOR(本文的環(huán)境是”:”)取出待選列表中的一個(gè)路徑,然后把要包含的文件名附加在這個(gè)路徑后面,進(jìn)行嘗試,如果成功包含,則返回,否則繼續(xù)下一個(gè)待選路徑.

到現(xiàn)在為止,我們已經(jīng)可以回答我開頭提出的3個(gè)問題了:

1. 因?yàn)樵趓oot目錄下執(zhí)行, 所以在1.php中包含2.php的時(shí)候, include_path的第二個(gè)待選路徑起了作用(path_to_subdir), 找到了path_to_subdir/2.php, 而在2.php包含3.php的時(shí)候, 當(dāng)前工作目錄是root下, 所以在包含3.php的時(shí)候, include_path的第一個(gè)待選路徑”.”(當(dāng)前工作目錄)下就找到的匹配的文件, 所以得到的輸出是”root”.

2. 同1, 只不過(guò)當(dāng)前的路徑是subdir, 所以得到的輸出是”subdir”.

3. 因?yàn)闆]有了當(dāng)前路徑為include_path,所以在root目錄下運(yùn)行的時(shí)候2.php中包含3.php的時(shí)候,是path_to_subdir起了作用,所以無(wú)論在root還是subdir都將得到”subdir”的輸出.

而如果在2.php中清空include_path:

  1. <?php  
  2. ini_set(“include_path”, ”);  
  3. require(“3.php”);  
  4. ?> 

那么將會(huì)是current_script_dir起作用,而這個(gè)時(shí)候current_script_dir是2.php的路徑,所以還是會(huì)得到”subdir”的輸出.

目錄相對(duì)路徑

在使用目錄相對(duì)路徑的情況下,相對(duì)路徑的基點(diǎn),永遠(yuǎn)都是當(dāng)前工作目錄.為了說(shuō)明在目錄相對(duì)路徑下的情況,我們?cè)倏磦€(gè)列子,還是上面的目錄結(jié)構(gòu),只不過(guò)1.php變成了:

  1. <?php  
  2. ini_set(“include_path”, “/”);  
  3. require(“./subdir/2.php”);  
  4. ?> 

2.php變成了:

  1. <?php  
  2. require(“./3.php”);  
  3. ?> 

如果在root目錄下執(zhí)行,2.php中尋找3.php將會(huì)在當(dāng)前目錄的相對(duì)路徑下尋找,所以得到的輸出是”root”,而如果是在subdir下執(zhí)行上一級(jí)目錄的1.php(php -f ../1.php), 將會(huì)因?yàn)樵趕ubdir下找不到”./subdir/2.php”而異常退出.

后記:1.因?yàn)槭褂胕nclude_path和相對(duì)路徑的情況下,性能會(huì)和尋找的次數(shù)有關(guān),最壞的情況下,如果你有10個(gè)include_path,那么最多可能會(huì)重試11次才能找到要包含的文件,所以,在能使用絕對(duì)路徑的情況下最好使用絕對(duì)路徑.

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 精品国产一区二区三区19 | 国产精品入口免费麻豆 | 国产视频久久久久 | 亚洲午夜久久影院 | 动漫一级毛片 | 在线精品国精品国产不卡 | 97精品国产福利一区二区三区 | 成人亚洲视频在线观看 | 国产免费高清视频在线观看不卡 | 欧美日韩aa一级视频 | 一区二区三区高清在线 | 69国产成人精品视频软件 | 美女福利视频国产免费观看 | 欧美国产成人精品一区二区三区 | 日本xxxⅹ色视频在线观看网站 | 亚洲爽 | 麻豆视传媒一区二区三区 | 免费一级淫片aaa片毛片a级 | 亚洲欧美日韩综合 | 久久久久久久久久久久久久久久久久久久 | 精品久久久久久久一区二区伦理 | 国产一区三区二区中文在线 | 日本欧美一区二区免费视 | 亚洲成a人不卡在线观看 | 亚洲欧美日韩精品久久亚洲区色播 | 亚洲jjzzjjzz在线播放 | 日韩中文字幕精品一区在线 | 在线啪 | 女人18毛片a级毛片免费视频 | 日产高清卡一卡二无卡三区 | 国产精品极品美女免费观看 | 亚洲页码| 中文字幕乱码一区三区免费 | 亚洲性色永久网址 | 免费xx| 国产精品99一区二区三区 | 亚洲国产aaa毛片无费看 | 经典三级一区二区三区视频 | 国产精品自拍在线 | 欧美美女free | 国产精品久久久久三级 |