## 開發規范
#### 目錄和文件
* 目錄使用小寫+下劃線;
* 類文件采用大駝峰法命名,其它文件采用小寫+下劃線命名;
* 類名和類文件名保持一致,統一采用大駝峰法命名;
#### 函數和類、屬性命名
* 類的命名采用駝大峰法 , 例如 UserType
* 函數的命名使用小寫字母和下劃線的方式,例如 get_client_ip
* 方法的命名使用小駝峰法 , 例如 getUserName
* 屬性的命名使用駝峰法 , tableName
#### 常量和配置
* 常量以大寫字母和下劃線命名,例如 APP_PATH;
* 配置參數以小寫字母和下劃線命名,例如 url_route_on
#### 數據表和字段
* 數據表和字段采用小寫加下劃線方式命名,并注意字段名不要以下劃線開頭,例如 tp_user 表和 user_name字段
* * * * *
## 高質量實用技巧
#### 1.不要使用相對路徑
常常會看到:
~~~
require_once('../../lib/some_class.php');
~~~
該方法有很多缺點: 它首先查找指定的php包含路徑, 然后查找當前目錄。因此會檢查過多路徑。如果該腳本被另一目錄的腳本包含, 它的基本目錄變成了另一腳本所在的目錄.
推薦寫法:
~~~
define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');
~~~
#### 2. 不要直接使用 require, include, include_once, required_once
可以在腳本頭部引入多個文件, 像類庫, 工具文件和助手函數等, 如:
~~~
require_once('lib/Database.php');
require_once('lib/Mail.php');
require_once('helpers/utitlity_functions.php');
~~~
推薦寫法:
~~~
function load_class($class_name)
{
$path = ROOT . '/lib/' . $class_name . '.php');
if(file_exists($path))
{
require_once( $path );
}
}
~~~
#### 3. 靈活編寫函數
~~~
function add_to_cart($item_id , $qty)
{
$_SESSION['cart']['item_id'] = $qty;
}
add_to_cart( 'IPHONE3' , 2 );
~~~
使用上面的函數添加單個項目. 而當添加項列表的時候,只要稍加留意不同類型的參數, 就會更靈活. 如:
推薦寫法:
~~~
function add_to_cart($item_id , $qty)
{
if(!is_array($item_id)) {
$_SESSION['cart']['item_id'] = $qty;
} else {
foreach($item_id as $i_id => $qty) {
$_SESSION['cart']['i_id'] = $qty;
}
}
}
add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' => 2 , 'IPAD' => 5) );
~~~
#### 4. 寫文件前, 檢查目錄寫權限
~~~
$contents = "All the content";
$file_path = "/var/www/project/content.txt";
file_put_contents($file_path , $contents);
~~~
這大體上正確. 但有些間接的問題. file_put_contents 可能會由于幾個原因失敗:
1. 父目錄不存在
2. 目錄存在, 但不可寫
3. 文件被寫鎖住?
所以寫文件前做明確的檢查更好.
推薦寫法:
~~~
$contents = "All the content";
$dir = '/var/www/project';
$file_path = $dir . "/content.txt";
if(is_writable($dir))
{
file_put_contents($file_path , $contents);
} else {
die("Directory $dir is not writable, or does not exist. Please check");
}
~~~
#### 5. 更改應用創建的文件權限
在linux環境中, 權限問題可能會浪費你很多時間. 從今往后, 無論何時, 當你創建一些文件后, 確保使用chmod設置正確權限
推薦寫法:
~~~
chmod("/somedir/somefile", 0755);
~~~
#### 6. 將工具函數封裝到類中
假如你在某文件中定義了很多工具函數:
~~~
function utility_a()
{
//This function does a utility thing like string processing
}
function utility_b()
{
//This function does nother utility thing like database processing
}
function utility_c()
{
//This function is ...
}
~~~
這些函數的使用分散到應用各處. 你可能想將他們封裝到某個類中:
推薦寫法:
~~~
class Utility
{
public static function utility_a()
{
}
public static function utility_b()
{
}
public static function utility_c()
{
}
}
//and call them as
$a = Utility::utility_a();
$b = Utility::utility_b();
~~~
顯而易見的好處是, 如果php內建有同名的函數, 這樣可以避免沖突.
另一種看法是, 你可以在同個應用中為同個類維護多個版本, 而不導致沖突. 這是封裝的基本好處, 無它.
#### 7.一些建議
~~~
1. 使用echo取代print
2. 使用str_replace取代preg_replace, 除非你絕對需要
3. 不要使用 short tag
4. 簡單字符串用單引號取代雙引號
5. head重定向后記得使用exit
6. 不要在循環中調用函數
7. isset比strlen快
8. 始中如一的格式化代碼
9. 不要刪除循環或者if-else的括號
10. 不要嘗試省略一些語法來縮短代碼. 而是讓你的邏輯簡短.
~~~
#### 8. 使用array_map快速處理數組
比如說你想 trim 數組中的所有元素. 新手可能會:
~~~
foreach($arr as $c => $v)
{
$arr[$c] = trim($v);
}
~~~
但使用 array_map 更簡單:
推薦寫法:
~~~
$arr = array_map('trim' , $arr);
~~~
這會為$arr數組的每個元素都申請調用trim. 另一個類似的函數是 array_walk. 請查閱文檔學習更多技巧.
#### 9. 小心處理大數組
對于大的數組和字符串, 必須小心處理. 常見錯誤是發生數組拷貝導致內存溢出,拋出Fatal Error of Memory size 信息:
當導入或導出csv文件時, 常常會這么做。
推薦寫法:
確保通過引用傳遞, 或存儲在類變量中:
~~~
$a = get_large_array();
pass_to_function(&$a);
~~~
這么做后, 向函數傳遞變量引用(而不是拷貝數組). 查看文檔.
~~~
class A
{
function first()
{
$this->a = get_large_array();
$this->pass_to_function();
}
function pass_to_function()
{
//process $this->a
}
}
~~~
盡快的 unset 它們, 讓內存得以釋放,減輕腳本負擔.