PHP寫法注意

2021-09-10 22:04:28 字數 3809 閱讀 6061

**場景一:遍歷乙個陣列獲取新的資料結構**

也許你會這樣寫:

```// 申明乙個新的陣列,組裝成你想要的資料

$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 示...