實現代碼
<?php namespace app\index\controller; class Index { # 獲取應用根目錄 public function index() { # 這裏是判斷命令行執行,仍是瀏覽器執行 if ('cli' == PHP_SAPI) { $scriptName = realpath($_SERVER['argv'][0]); } else { # 獲取文件的絕對路徑 $scriptName = $_SERVER['SCRIPT_FILENAME']; } # dirname是獲取目錄,reapath返回絕對路徑 $path = realpath(dirname($scriptName)); # 檢測是否是文件 if (!is_file($path . DIRECTORY_SEPARATOR . 'think')) { $path = dirname($path); } return $path . DIRECTORY_SEPARATOR; } }
步驟詳解
(1)分析 if ('cli' == PHP_SAPI) { php
先來看這一行代碼,這裏有個常量是PHP_SAPI,而後進行打印出來是cgi-fcgi,因此會走elsenginx
這裏會有三種狀況:apache
nginx訪問是fast-cgi瀏覽器
apache訪問是apache2handlerapp
命令行訪問是cli函數
(2)執行$scriptName = $_SERVER['SCRIPT_FILENAME'];spa
$_SERVER['SCRIPT_FILENAME']是訪問的是哪一個文件,它就獲取這個文件的絕對路徑命令行
打印出來的是:code
C:/phpStudy/PHPTutorial/WWW/tp5.1learn/public/index.phpip
(3)執行$path = realpath(dirname($scriptName));
這行進行了兩個操做:
dirname()函數返回路徑中的目錄部分。
realpath() 函數返回絕對路徑。
打印結果:
dirname($scriptName):C:/phpStudy/PHPTutorial/WWW/tp5.1learn/public
realpath(dirname($scriptName)):C:\phpStudy\PHPTutorial\WWW\tp5.1learn\public
(4)執行is_file($path . DIRECTORY_SEPARATOR . 'think',
打印結果:C:\phpStudy\PHPTutorial\WWW\tp5.1learn\public\think
這一步不會執行,由於在public的目錄下沒有think這個目錄
這裏須要注意一個點就是define ('DIRECTORY_SEPARATOR', "/"),在PHP這個是定義斜槓的常量
(5)執行$path . DIRECTORY_SEPARATOR;
執行結果:C:\phpStudy\PHPTutorial\WWW\tp5.1learn\
(6)完結:這個也就是tp5.1獲取項目根目錄的一個完整過程