1.不要使用相對路徑php
經常會看到:
1
|
require_once('../../lib/some_class.php');
|
該方法有不少缺點:
它首先查找指定的php包含路徑, 而後查找當前目錄.
所以會檢查過多路徑.
若是該腳本被另外一目錄的腳本包含, 它的基本目錄變成了另外一腳本所在的目錄.
另外一問題, 當定時任務運行該腳本, 它的上級目錄可能就不是工做目錄了.
所以最佳選擇是使用絕對路徑:
1
|
define('ROOT' , '/var/www/project/');
|
|
2
|
require_once(ROOT . '../../lib/some_class.php');
|
3
|
|
|
4
|
//rest of the code
|
咱們定義了一個絕對路徑, 值被寫死了. 咱們還能夠改進它. 路徑 /var/www/project 也可能會改變, 那麼咱們每次都要改變它嗎? 不是的, 咱們可使用__FILE__常量, 如:
1
|
//suppose your script is /var/www/project/index.php
|
|
2
|
//Then __FILE__ will always have that full path.
|
3
|
|
|
4
|
define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
|
5
|
require_once(ROOT . '../../lib/some_class.php');
|
|
6
|
|
7
|
//rest of the code
|
如今, 不管你移到哪一個目錄, 如移到一個外網的服務器上, 代碼無須更改即可正確運行.
2. 不要直接使用 require, include, include_once, required_once
能夠在腳本頭部引入多個文件, 像類庫, 工具文件和助手函數等, 如:
1
|
require_once('lib/Database.php');
|
|
2
|
require_once('lib/Mail.php');
|
3
|
|
|
4
|
require_once('helpers/utitlity_functions.php');
|
這種用法至關原始. 應該更靈活點. 應編寫個助手函數包含文件. 例如:
1
|
function load_class($class_name)
|
|
2
|
{
|
3
|
//path to the class file
|
|
4
|
$path = ROOT . '/lib/' . $class_name . '.php');
|
5
|
require_once( $path );
|
|
6
|
}
|
7
|
|
|
8
|
load_class('Database');
|
9
|
load_class('Mail');
|
有什麼不同嗎? 該代碼更具可讀性.
將來你能夠按需擴展該函數, 如:
01
|
function load_class($class_name)
|
|
02
|
{
|
03
|
//path to the class file
|
|
04
|
$path = ROOT . '/lib/' . $class_name . '.php');
|
05
|
|
|
06
|
if(file_exists($path))
|
07
|
{
|
|
08
|
require_once( $path );
|
09
|
}
|
|
10
|
}
|
還可作得更多:
爲一樣文件查找多個目錄
能很容易的改變放置類文件的目錄, 無須在代碼各處一一修改
可以使用相似的函數加載文件, 如html內容.
3. 爲應用保留調試代碼
在開發環境中, 咱們打印數據庫查詢語句, 轉存有問題的變量值, 而一旦問題解決, 咱們註釋或刪除它們. 然而更好的作法是保留調試代碼.
在開發環境中, 你能夠:
01
|
define('ENVIRONMENT' , 'development');
|
|
02
|
|
03
|
if(! $db->query( $query )
|
|
04
|
{
|
05
|
if(ENVIRONMENT == 'development')
|
|
06
|
{
|
07
|
echo "$query failed";
|
|
08
|
}
|
09
|
else
|
|
10
|
{
|
11
|
echo "Database error. Please contact administrator";
|
|
12
|
}
|
13
|
}
|
在服務器中, 你能夠:
01
|
define('ENVIRONMENT' , 'production');
|
|
02
|
|
03
|
if(! $db->query( $query )
|
|
04
|
{
|
05
|
if(ENVIRONMENT == 'development')
|
|
06
|
{
|
07
|
echo "$query failed";
|
|
08
|
}
|
09
|
else
|
|
10
|
{
|
11
|
echo "Database error. Please contact administrator";
|
|
12
|
}
|
13
|
} |