關(guān)于PHP開發(fā)的9條建議
本文只是個人從實際開發(fā)經(jīng)驗中總結(jié)的一些東西,并不是什么名言警句,寫出來有兩個目的:一是時刻提醒自己要按照這些知識點(diǎn)來寫自己代碼,二是為了分享,說不定對你有用呢?萬一,是吧。。。
1.首要意識:安全
大多數(shù)時候,我們開發(fā)的Web程序都是需要跟數(shù)據(jù)庫打交道的,所以這里幾乎可以說SQL注入是一個怎么也無法避免要拿出來討論一下的問題。而且近年來像XSS和CSRF攻擊也變得大行其道,使得"黑客"們貌似又有了一把把利器,而我們總是處于被動的狀態(tài)。不過我們要記得是下面這兩個原則:
1. 永遠(yuǎn)不要相信用戶輸入的東西。(老話了,但這是真的)
2. 將自己需要輸出的數(shù)據(jù)進(jìn)行轉(zhuǎn)義。
簡單來說就是:filter input , escape output
如果你是新手,不要再使用類似以下的查詢語句了:
SELECT FROM users WHERE username = $_POST['username'] AND password = $_POST['password'];
還有就是,使用PDO或Mysqli吧,不要再使用老式的mysql操作了。
而對于,CSRF的解決方案,目前接觸的都是給每一次的表單提交都設(shè)置一個token值,然后在表單提交的時候校驗之即可。
2.明確地知道各個比較操作符的差別
PHP的比較操作符,這其實可以說是一個很小的注意點(diǎn),但是在某些時候真的很重要。比如說很多時候我們得考慮清楚,該用==還是===,如果你使用過strpos()這個函數(shù),下面的代碼可能會給你一個直觀的感受:
<?php $authors = 'Chris & Sean'; if (strpos($authors, 'Chris')) { echo 'Chris is an author.'; } else { echo 'Chris is not an author.'; }
上面這段代碼的運(yùn)行結(jié)果其實是輸出Chris is not an author,但是現(xiàn)實情況是,Chris & Sean真的是Author啊,怎么回這樣呢?其實是這樣的:Chris正好出現(xiàn)在Chris & Sean首位開始處,也就是0這個位置,所以substr()返回了,由于條件判斷語句中bool判斷,所以0作為了false處理,于是程序輸出了Chris is not an author,但是在這種情況之下我們該怎么處理呢?我們其實可以這樣的:
<?php if (strpos($authors, 'Chris') !== FALSE) { echo 'Chris is an author.'; } else { echo 'Chris is not an author.'; }
這里的!==和!=的不同就體現(xiàn)出來了。
3.可以減少使用else就少使用else
這個貌似從我一開始接觸編程就有的一個想法,因為每次看到if(){}else{}就有一種這一段其實可以寫得更好的感覺,因為一旦你減少了使用else關(guān)鍵字,你得代碼會減少兩行!沒錯,兩行也是我們的追求,而且,從我的經(jīng)驗看,else少的代碼貌似可讀性更高,對我來說。
if( this condition ) { $x = 5; } else { $x = 10;
如果,在$x的默認(rèn)值是10,還是下面這樣寫感覺比較好:
$x = 10; if( this condition ) { $x = 5; }
4.去掉不必要的括號
這里的目的其實跟else關(guān)鍵字部分是一樣的,我們是為了更簡短的代碼和更優(yōu)越的可讀性,對以下的情況,你都應(yīng)該考慮優(yōu)化代碼:
if ($gollum == 'halfling') { $height --; }
其實是可以這樣的:
if ($gollum == 'halfling') $height --;
你甚至可以這樣:
if ($gollum == 'halfling') $height --; else $height ++; if ($frodo != 'dead') echo 'Gosh darnit, roll again Sauron'; foreach ($kill as $count) echo 'Legolas strikes again, that makes' . $count . 'for me!';
是不是有一種又短又清晰的感覺?
5.多用str_replace()
在很多時候我們需要對一些字符串進(jìn)行替換,在PHP中有以下幾個函數(shù)可以達(dá)到這個目的:
str_replace() ereg_replace() preg_replace()
如果你確實是需要使用正則匹配,那就使用preg_replace(),而如果在可實現(xiàn)替換的情況下,請使用str_replace(),因為據(jù)不完全統(tǒng)計,str_replace()的效率在這三個當(dāng)中是最高的。
6.使用三元運(yùn)算符
這個可能很多人都有這個感受,使用三元運(yùn)算符之后,我們可以去掉一堆if else語句了,代碼又短又爽。
$host = strlen($host) > 0 ? $host : htmlentities($host);
7.使用緩存
目前PHP熱門的緩存技術(shù)可能就是Redis和Memcached了,在PHP的官方文檔中,也有Memcached的使用教程,至于Redis,我最近在研究中,后續(xù)會給出一些教程,如果一切順利的話。
8.使用框架
框架的好處很多,可能是在性能方面有所損失外,貌似找不到不用框架的理由了,框架即可以加快你的開發(fā)速度,也可以讓你在寫代碼的過程中擼的舒舒服服,而且想很多安全問題,你都會得到很好的解決。我這里首推Laravel,不過像Yii2 Slim Symfony都是非常棒的框架,除了Symfony沒有嘗過過之外,剩下的三個我都有使用經(jīng)歷,最后就基本是用Laravel了。不過我建議的Laravel可能不適合你,這還是得看個人喜好。
9.用isset()代替strlen()
如果你需要在項目代碼中需要根據(jù)一個字符串的長度來做條件判斷,這個時候非常推薦你直接使用isset(),因為在同等條件之后,isset()的速度是strlen()的五倍左右,所以:
<?php if (isset($username[5])) { // The username is at least six characters long. } if (strlen($username) >= 6) { // The username is at least six characters long. }
以上的兩個條件判斷都是可以達(dá)到相同的目的,但是我推薦使用的是第一種。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡
- PHP和NodeJs開發(fā)的應(yīng)用如何共用Session
- PHP使用Face++接口開發(fā)微信公眾平臺人臉識別系統(tǒng)的方法
- php開發(fā)中的頁面跳轉(zhuǎn)方法總結(jié)
- PHP微信開發(fā)之二維碼生成類
- PHP開發(fā)Apache服務(wù)器配置
- PHP+Javascript實現(xiàn)在線拍照功能實例
- php實現(xiàn)網(wǎng)站頂踩功能的完整前端代碼
- PHP結(jié)合jQuery實現(xiàn)紅藍(lán)投票功能特效
- PHP結(jié)合jQuery實現(xiàn)的評論頂、踩功能
- PHP技術(shù)開發(fā)微信公眾平臺
- 四個PHP非常實用的功能
- 8個必備的PHP功能開發(fā)
相關(guān)文章
安裝apache2.2.22配置php5.4(具體操作步驟)
本篇文章是對安裝apache2.2.22配置php5.4的具體操作步驟進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP中一些可以替代正則表達(dá)式函數(shù)的字符串操作函數(shù)
這篇文章主要介紹了PHP中一些可以替代正則表達(dá)式函數(shù)的字符串操作函數(shù),本文總結(jié)的是一些比較特別的字符串操作函數(shù),需要的朋友可以參考下2014-11-11php include和require的區(qū)別深入解析
本篇文章是對php中include與require的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php 下 html5 XHR2 + FormData + File API 上傳文件操作實例分析
這篇文章主要介紹了php 下 html5 XHR2 + FormData + File API 上傳文件操作,結(jié)合實例形式分析了php 下使用html5 XHR2 + FormData + File API 實現(xiàn)上傳文件操作方法與相關(guān)操作注意事項,需要的朋友可以參考下2020-02-02