**場景一:遍歷乙個陣列獲取新的資料結構**
也許你會這樣寫:
```// 申明乙個新的陣列,組裝成你想要的資料
$tmp = ;
foreach ($arr as $k => $v)
...}
// 最後得要你想要的陣列$tmp
// 也許你覺著上面的寫法不是很好,那我們下面換種寫法
foreach ($arr as $k => $v)
...// 乾掉你不想要的結構
unset($arr[$k]['youwantdel']);
}// 最後我們得到我們的目標陣列$arr
```接下來我們使用引用值:
```foreach ($arr as &$v)
...// 乾掉你不想要的結構
unset($v['youwantdel']);
}unset($v);
// 最後我們得到我們的目標陣列$arr
```使用引用是不是使我們的**更加的簡潔,除此之外相對於第一種寫法,我們節省了記憶體空間,尤其是再操作乙個大陣列時效果是及其明顯的。
**場景二:傳遞乙個值到乙個函式中獲取新的值**
基本和陣列遍歷一致,我們只需要宣告這個函式的這個引數為引用即可,如下:
```function decorate(&$arr = )
$arr = [
....
];// 呼叫函式
decorate($arr);
// 如上即得到新的值$arr,好處還是節省記憶體空間
### 使用try...catch...
假如有下面一段邏輯:
```class usermodel
code...
if (...)
code...}}
class usercontroller
if ($res === -2)
code...}}
```我們用try...catch...改寫後:
```class usermodel
code...
if (...)
code...}}
class usercontroller
catch (exception $e) }}
```通過使用try...catch...使我們的**邏輯更加清晰,try...裡只需要關注業務正常的情況,異常的處理統一在catch中。所以,我們在寫上游**時異常直接丟擲即可。
### 使用匿名函式
** 構建函式或方法內部的**塊 **
假如我們有一段邏輯,在乙個函式或者方法裡我們需要格式化資料,但是這個格式化資料的**片段出現了多次,如果我們直接寫可能會想下面這樣:
```function dosomething(...)
```我相信大多數的人應該不會像上面這麼寫,可能都會像下面這樣:
```function dosomething(...)
// 再宣告乙個格式花**的函式或方法
function format()
```上面這樣的寫法沒有任何的問題,最小單元化我們的**片段,但是如果這個format函式或者方法只是dosomething使用呢?我通常會像下面這麼寫,為什麼?因為我認為在這種上下文的環境中format和dosomething的乙個子集。
```function dosomething() ;
...package(...);
...package(...);
...}
```** 實現類的【懶載入】和實現設計模式的【最少知道原則】 **
假如有下面這段**:
```class one
public function dosomething()
...}
}...
$instance = new one();
$instance->dosomething();
...```
上面的寫法有什麼問題?
- 不符合設計模式的最少知道原則,類one內部直接依賴了類two
- 類two的例項不是所有的上下文都會用到,所以浪費了資源,有人說搞個單例,但是解決不了例項化了不用的尷尬
所以我們使用匿名函式解決上面的問題,下面我們這麼改寫:
```class one
public function dosomething()
...}
}...
$instance = new one(function () );
$instance->dosomething();
...```
### 減少對if...else...的使用
如果你碰見下面這種型別的**,那一定是個黑洞。
```function dosomething() esle
} else esle }}
** 提前return異常 **
細心的你可能會發現上面這種情況,可能絕大多數else**裡都是在處理異常情況,更有可能這個異常**特別簡單,通常我會這麼去做:
```// 如果是在乙個函式裡面我會先處理異常的情況,然後提前return**,最後再執行正常的邏輯
function dosomething()
if (...)
// 正常邏輯
...}
// 同樣,如果是在乙個類裡面我會先處理異常的情況,然後先丟擲異常
class one
if (...)
// 正常邏輯
...}
}** 關聯陣列做map **
如果我們在客戶端做決策,通常我們會判斷不同的上下文在選擇不同策略,通常會像下面一樣使用if或者switch判斷:
```class one
elseif (...) else
$instance->dosomething(...);
...}
}```
上面的寫法通常會出現大量的if語句或者switch語句,通常我會使用乙個map來對映不同的策略,像下面這樣:
```class one
}```
### 使用介面
為什麼要使用介面?極大的便於後期的擴充套件和**的可讀性,例如設計乙個優惠系統,不同的商品只是在不同的優惠策略下具備不同的優惠行為,我們定義乙個優惠行為的介面,最後對這個介面程式設計即可,偽**如下
```inte***ce promotion
class onepromotion implement promotion
}class twopromotion implement promotion
}```
### 控制器拒絕直接的db操作
最後我想說的是永遠拒絕在你的controller裡直接操作db,為什麼?我們的程式絕大多數的操作基本都是增刪改查,可能是查詢的where條件和字段不同,所以有時候我們可以抽象的把對資料庫增刪改查的方法寫到model中,通過引數暴露我們的where,fields條件。通常這樣可以很大程度的提高效率和**復用。比如像下面這樣:
```class demomodel implement model
}```
## 常用正規表示式
```php
郵箱驗證
pattern=′/\w+([−+.]\w+)∗@\w+([−.]\w+)∗\.\w+([−.]\w+)∗/』;
url匹配
手機驗證
pattern=′/1[3458]\d10/』;
```
Velocity寫法注意
1.proerty與 的區別 比如 簡單的key value資料格式情況下 物件資料格式情況下 點評 建議採用a寫法,既然是物件,會遇到很多想得到物件某個屬性值的時候,有引用關係存在,所以採用a,重要一點是由於這裡是 a物件.a物件的屬性物件b.b物件.b屬性.多級引用關係一定要用 寫法才能獲取到 ...
高效php的寫法
1.單引號代替雙引號來包含字串 2.銷毀變數去釋放記憶體,特別是大的陣列 陣列和物件在php特別佔記憶體的,這個由於php的底層的zend引擎引起的,一般來說,php陣列的記憶體利用率只有 1 10,也就是說,乙個在c語言裡面100m 記憶體的陣列,在php裡面就要1g。特別是在php作為後台伺服器...
php注釋前面 php標準注釋寫法
php標準注釋的寫法 name 名字 abstract 申明變數 類 方法 access 指明這個變數 類 函式 方法的訪問許可權 author 函式作者的名字和郵箱位址 category 組織packages const 指明常量 deprecate 指明不推薦或者是廢棄的資訊 example 示...