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

深入理解PHP之require/include順序 推薦

也就有了如下的疑問:

include_path是怎么起作用的?

如果有多個include_path順序是怎么樣的?

什么情況下include_path不起作用?

今天, 我就全面的介紹下這個問題, 先從一個例子開始吧.

如下的目錄結構:

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

在1.php中:
復制代碼 代碼如下:
<?php
ini_set("include_path", ".:path_to_subdir");
require("2.php");
?>

而在2.php中:
復制代碼 代碼如下:
<?php
require("3.php");
?>

而在root目錄下的3.php打印出”root”, 在subdir目錄下的3.php打印出”subdir”;

現在, 我的問題來了:
1. 當在root目錄下運行1.php, 會得到什么輸出?
2. 在subdir下運行上一級目錄的1.php, 有會得到什么輸出?
3. 當取消include_path中的當前目錄path(也就是include_path=”path_to_subdir”), 上面倆個問題又會是什么輸出?
php中的include_path
php在遇到require(_once)/include(_once)的指令的時候, 首先會做如下的判斷:
復制代碼 代碼如下:
要包含的文件路徑是絕對路徑么?
如果是, 則直接包含, 并結束.
如果不是, 進入另外的邏輯(經過多次調用, 宏展開后進入_php_stream_fopen_with_path)尋找此文件

接下來, 在_php_stream_fopen_with_path中, 會做如下判斷:
復制代碼 代碼如下:
要包含的文件路徑是相對路徑么(形如./file, ../dir/file, 以下用"目錄相對路徑代替")?
如果是, 則跳過include_path的作用邏輯, 直接解析相對路徑(隨后單獨介紹)

會根據include_path,和當前執行文件的path組成一個待選的目錄列表, 比如對于文章前面的例子來說, 會形成一個如下的待選列表
復制代碼 代碼如下:
".:path_to_subdir:current_script_dir

然后, 依次從待選列表頭部開始, 根據DEFAULT_DIR_SEPARATOR(本文的環境是”:”)取出待選列表中的一個路徑, 然后把要包含的文件名附加在這個路徑后面, 進行嘗試. 如果成功包含, 則返回, 否則繼續下一個待選路徑.
到現在為止, 我們已經可以回答我開頭提出的3個問題了.
1. 因為在root目錄下執行, 所以在1.php中包含2.php的時候, include_path的第二個待選路徑起了作用(path_to_subdir), 找到了path_to_subdir/2.php, 而在2.php包含3.php的時候, 當前工作目錄是root下, 所以在包含3.php的時候, include_path的第一個待選路徑”.”(當前工作目錄)下就找到的匹配的文件, 所以得到的輸出是”root”.
2. 同1, 只不過當前的路徑是subdir, 所以得到的輸出是”subdir”.
3. 因為沒有了當前路徑為include_path, 所以在root目錄下運行的時候2.php中包含3.php的時候, 是path_to_subdir起了作用, 所以無論在root還是subdir都將得到”subdir”的輸出.
而如果在2.php中清空include_path,
復制代碼 代碼如下:
<?php
ini_set("include_path", '');
require("3.php");
?>

那么將會是current_script_dir起作用, 而這個時候current_script_dir是2.php的路徑, 所以還是會得到”subdir”的輸出.
目錄相對路徑
在使用目錄相對路徑的情況下, 相對路徑的基點, 永遠都是當前工作目錄.
為了說明在目錄相對路徑下的情況,我們再看個列子, 還是上面的目錄結構, 只不過1.php變成了:
復制代碼 代碼如下:
<?php
ini_set("include_path", "/");
require("./subdir/2.php");
?>

2.php變成了:
復制代碼 代碼如下:
<?php
require("./3.php");
?>

如果在root目錄下執行, 2.php中尋找3.php將會在當前目錄的相對路徑下尋找, 所以得到的輸出是”root”, 而如果是在subdir下執行上一級目錄的1.php(php -f ../1.php), 將會因為在subdir下找不到”./subdir/2.php”而異常退出.
后記
1. 因為使用include_path和相對路徑的情況下, 性能會和尋找的次數有關, 最壞的情況下, 如果你有10個include_path, 那么最多可能會重試11次才能找到要包含的文件, 所以, 在能使用絕對路徑的情況下最好使用絕對路徑.
2. 因為目錄相對路徑的basedir, 永遠都是當前工作路徑, 如果要使用, 需要和實際部署路徑相關, 所以實際使用的很少(當然, 也有借助chdir來完成的模塊).
3. 在模塊化的系統設計中, 一般應該在模塊內, 通過獲取模塊的部署路徑(dirname(__FILE__), php5.3以后更是提供了__DIR__常量)從而使用絕對路徑.

php技術深入理解PHP之require/include順序 推薦,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 情浓野战台湾三级 | 51精品少妇人妻AV一区二区 | 床伴在线观看免费高清完整泰剧第四集 | 亚洲AV中文字幕无码久久 | 久久亚洲精品专区蓝色区 | 亚洲国产日韩制服在线观看 | 精品国产mmd在线观看 | 我半夜摸妺妺的奶C了她 | 国产成人在线小视频 | 久久99国产精品二区不卡 | 国产精品视频在线自在线 | 高h肉文合集 | 国产精品JIZZ在线观看A片 | 欧美午夜特黄AAAAAA片 | 在线免费观看国产精品 | 女人麻豆国产香蕉久久精品 | ping色堂| 果冻传媒在线观看完整版免费 | 国产高清国内精品福利色噜噜 | 亚洲九九视频 | 爱暖暖1000部免费 | 国产69精品久久久久乱码韩国 | 久久99久久成人免费播放 | 日韩欧美视频一区二区在线观看 | 高h 纯肉文| 久久精品国产亚洲AV忘忧草蜜臀 | 亚洲乱色视频在线观看 | a4you销魂gogo人体 | 免费精品国偷自产在线 | 色婷婷激婷婷深爱五月小蛇 | 亚洲综合春色另类久久 | 娇妻玩4P被三个男人伺候电影 | 精品区2区3区4区产品乱码9 | 69夫妇交友群 | 亚洲色爽视频在线观看 | 把腿张开老子CAO烂你动态图 | 最近最新中文字幕MV高清在线 | 免费看片A级毛片免费看 | 高冷师尊被CAO成SAO货 | 大稥焦伊人一本dao 大香伊人中文字幕精品 | www.久久久 |