高效率的PHP寫法(語句+函式)

語句
2.1 最好不用@
用@掩蓋錯誤會降低指令碼執行速度,並且在後臺有很多額外操作。
用@比起不用,效率差距 3 倍。特別不要在迴圈中使用@。
在 5 次迴圈的測試中,即使是先用error_reporting(0)關掉錯誤,迴圈完成後再開啟,都比用@快。
2.2 避免使用魔術方法
對於__開頭的函式就命名為魔術函式,它們都在特定的條件下觸發。
這些魔術函式包括:__construct()、__get()、__call()、__autoload()等等。
以__autoload()為例,如果不能將類名與實際的磁碟檔案對應起來,將不得不做大量的檔案存在判斷。
而判斷檔案存在需要磁碟I/O操作,眾所周知,磁碟I/O操作的效率很低,因此這才是使得autoload機制效率降低的原因。
因此,在系統設計時,需要定義一套清晰的、將類名與實際磁碟檔案對映的機制。
這個規則越簡單越明確,__autoload()機制的效率就越高。
autoload機制並不是天然的效率低下,只有濫用autoload、設計不好的自動裝載函式,才會導致其效率的降低.
所以說,儘量避免使用__autoload等魔術方法,有待商榷。
2.3 別在迴圈裡用函式
例如:

這種寫法在每次迴圈的時候都會呼叫 count() 函式,效率大大降低,建議這樣:

讓函式在迴圈外面一次獲得迴圈次數。
2.4 使用三元運算子
在簡單的判斷語句中,三元運算子?:更簡潔高效。
2.5 使用選擇分支語句
switch、case好於使用多個if、elseif語句,並且程式碼更加容易閱讀和維護。
2.6 遮蔽敏感資訊
使用 error_reporting() 函式來預防潛在的敏感資訊顯示給使用者。
理想的錯誤報告應該被完全禁用在php.ini檔案裡。
如果用的是共享虛擬主機,php.ini不能修改,最好新增 error_reporting() 函式。
放在每個指令碼檔案的第一行,或者用require_once()來載入,能有效的保護敏感的SQL查詢和路徑,在出錯時不被顯示。
2.7 不實用段標籤 <?
不要使用開始標誌的縮寫形式,你正在使用這樣的符號嗎<?,應該用完整的<?php開始標籤。
當然,如果是輸出變數,用<?= $value?>這種方式是鼓勵的,可以是程式碼更加簡潔。
2.8 純PHP程式碼不加結束標記
如果檔案內容是純 PHP 程式碼,最好在檔案末尾刪除 PHP 結束標記?>。
這可以避免在 PHP 結束標記之後萬一意外加入了空格或者換行符,會導致 PHP 開始輸出這些空白,而指令碼中此時並無輸出的意圖。
2.9 永遠不要使用register_globals和magicquotes
這是兩個很古老的功能,在當時(十年前)也許是一個好方法,但現在看來並非如此。
老版本的PHP在安裝時會預設開啟這兩個功能,這會引起安全漏洞、程式設計錯誤及其他的問題。
如只有使用者輸入了資料時才會建立變數等。
PHP5.4.0開始這兩個功能都被捨棄了,所以每個程式設計師都應該避免使用。
如果你過去的程式有使用這兩項功能,那就儘快將其剔除吧。
3.1 儘量使用PHP內部函式
內建函式使用C語言實現,並且經過PHP官方優化,效率更高。
3.2 使用絕對路徑
在include和require中儘量使用絕對路徑。
如果包含相對路徑,PHP會在include_path裡面遍歷查詢檔案。
用絕對路徑就會避免此類問題,解析路徑所需的時間會更少。
3.3 包含檔案
儘量不要用require_once和include_once包含檔案,它們多一個判斷檔案是否被引用的過程,能不用盡量不用。
而使用require、include方法代替。
鳥哥在其部落格中就多次宣告,儘量不要用require_once和include_once。
3.4 函式快於類方法
呼叫只有一個引數、並且函式體為空的函式,花費的時間等於7-8次$localvar++運算。
而同一功能的類方法大約為15次$localvar++運算。
3.5 用子類方法
基類裡面只放能重用的方法,其他功能儘量放在子類中實現,子類裡方法的效能優於在基類中。
3.6 類的效能和其方法數量沒有關係
新新增10個或多個方法到測試的類後,效能沒什麼差異。
3.7 讀取檔案內容
在可以用file_get_contents()替代file()、fopen()、feof()、fgets()等系列方法的情況下,儘量用file_get_contents()。
因為他的效率高得多!
3.8 引用傳遞引數
通過引數地址引用的方式,實現函式多個返回值,這比按值傳遞效率高。
方法是在引數變數前加個&。
3.9 方法不要細分得過多
仔細想想你真正打算重用的是哪些程式碼?
3.10 儘量靜態化
如果一個方法能被靜態,那就宣告它為靜態的,速度可提高1/4,甚至我測試的時候,這個提高了近三倍。
當然了,這個測試方法需要在 十萬級 以上次執行,效果才明顯。
其實,靜態方法和非靜態方法的效率主要區別在 記憶體 。
靜態方法在程式開始時生成記憶體,例項方法(非靜態方法)在程式執行中生成記憶體。
所以,靜態方法可以直接呼叫,例項方法要先成生例項再呼叫,靜態速度很快,但是多了會佔記憶體。
任何語言都是對記憶體和磁碟的操作,至於是否面向物件,只是軟體層的問題,底層都是一樣的,只是實現方法不同。
靜態記憶體是連續的,因為是在程式開始時就生成了,而例項方法申請的是離散的空間,所以當然沒有靜態方法快。
靜態方法始終呼叫同一塊記憶體,其缺點就是不能自動進行銷燬,而例項化可以銷燬。
3.11 用C擴充套件方式實現
如果在程式碼中存在大量耗時的函式,可以考慮用C擴充套件的方式實現它們。