PHP知識篇:php代碼優化以及開發中的小技巧(持續補充)

PHP 腳本語言 Git 數據庫 小姑涼AI蟒蛇 2019-06-21

php知識代碼優化以及開發中的小技巧(持續補充)

PHP知識篇:php代碼優化以及開發中的小技巧(持續補充)


一、前言

這篇文章是博主平時記的小筆記,記錄的是平時開發沒有注意到的細節,或者在寫代碼的時候可以優化的部分。有相當一部分bug都是開發中不夠嚴謹造成的,所以大家共勉。提升代碼質量,快樂擼碼!

二、正文

1、 代碼的公用部分儘量不要改動,除非是所有的項目都需要添加某些新功能

2、 對於自定義的數組,對象等不同文件,要按照已有的文件分開。不要把對象定義到數組文件,數組定義到對象文件,方便調試和代碼優化

3、 對於一些不必要的操作,無需發請求。比如我們的拖動排序事件。應該確保當順序改變的時候再發送http請求。僅僅是拖動但沒有改變位置的,不需要發送請求。這樣在用戶訪問量比較多的情況下,不會有太大的訪問壓力

4、 構造函數要用起來。通用的變量,或者需要實例化的數據庫部分都可以放裡面。這樣在腳本的其他地方使用很方便

5、 控制器中的方法名命名要更貼近實際功能,方便查看維護。

6、 不要為了方便,有些表單只在前端驗證,而不去後端驗證。因為用戶可以通過禁用JS等方法,跳過你的前端驗證,那麼這個時候我們就無法保證系統的安全性,所以後端驗證必不能少。在用戶體驗不是很重要的項目,系統的安全性更加重要。

舉例: 用戶修改密碼,驗證舊密碼部分,如果只是前端通過JS驗證,提交後的代碼不加驗證的話,用戶可能會避過JS,從而直接修改密碼,保證不了安全性

7、 比如我們在開發的時候,需要用到變量a。

if(xx){ a=1; }else{a=2}; 
$b = a + 1;
1
2

類似於這種的,變量a沒有預先定義,所以會成為notice錯誤。如果此時我們的服務器的錯誤級別是notice都會報錯的話,那麼這部分就會成為bug。此時此刻再說“在我本地沒問題啊”這種話將毫無意義,所以最好是在寫程序的時候,就對自己嚴謹一些。

8、 關於代碼兼容性。

在php 5.4下,可以正常使用可變變量,類似於:

$a = 'php';
$$a = '我是PHP';
echo $php;// 輸出:我是PHP
1
2
3

這段代碼在php5.4下是可以的,但是在php 7.0下會報錯:Array to string conversion 。

這是因為php 5.4把($$a)中的$a當做一個整體,先解析$a = php ,然後通過第一個`$`符號,轉化為( $$a == $php = 我是PHP )。但是在 php7.0,代碼的嚴格性得到提升,此處必須使用 ${$a} 來區分解析的優先級,加個花括號標出來後面的變量,類似於咱們小學時候的加減乘除的優先級問題。
1

php文檔地址:http://www.php.net/manual/zh/language.variables.variable.php

9、關於SVN或者git提交

代碼在提交的時候,如果涉及到代碼的重構,修復bug,優化等功能,那麼最好是分多次提交。比如代碼重構單獨提交一次,修復Bug或者優化都單獨提交一次。不要害怕提交的次數太多之類的,我們分的越細,等到出問題的時候,不管是直接定位問題所在還是回滾版本都會好操作很多。這也算是開發技巧之一吧。

======================= 2019年5月10日13時更新 ==============================

10、 在開發的時候,每用到一個變量,就要考慮到萬一不存在這個變量,或者變量為空的時候,會不會影響到程序的正常運行?要在開發的時候就做好嚴謹的邏輯思考,加個條件判斷並不會對程序的運行速度造成太大影響,但是不加這個條件判斷,可能會造成程序崩潰。

11、根據傳過來的時間條件查詢數據比實際數據少一天的情況?

首先,我本地的時間字段是datetime,那麼2019/03/25會自動轉化為2019/03/25 00:00:00,所以才出現查詢數據少一天的情況。如果本地的時間字段類型是date,那麼查詢的時候,可以不用再拼接23:59:59也能正確得出結束時間當天的數據。

拼接的方案:

當本地日期字段類型是datetime,使用between and查詢時間區間的時候,需要記得,如果傳過來的日期是:2019/03/25 -- 2019/03/27這種的,那麼直接轉化為時間戳的話,結束時間是2019/03/26 23:59:59 ,相當於27號那天的數據我們是查不到的。所以需要在接收的時候,

做一下轉換:

	 $time_start = isset($this->db_g_data['time_start']) ? date("Y-m-d 00:00:00", strtotime($this->db_g_data['time_start'])) : "";
$time_end = isset($this->db_g_data['time_end']) ? date("Y-m-d 23:59:59", strtotime($this->db_g_data['time_end'])) : "";
1
2

這樣相當於重新把日期轉化為格式化的時間,同時給起始時間一個00:00:00 ,給結束時間一個:23:59:59 。

12、 使用傳引用後,記得unset掉引用的部分 :https://segmentfault.com/a/1190000014126990

13、 關於php內存方面的優化也值得注意,循環能少則少,判斷條件要在循環體之外:

參考:https://blog.csdn.net/LJFPHP/article/details/90053455

======================= 2019年6月2日20時更新 ==============================

1、 對於php程序,有些if{}else{}是可以縮減的,if{}else{}多了也代表著代碼的冗餘,要謹記

2、 比如要查詢當前時間往後,1天,5天,10天的數據。如果你每次都循環查詢,0-1,0-5,0-10,那麼查詢是有冗餘的,而且查詢速度會越來越慢。這個時候應該選用:0-1,2-5,6-10這個時間區間來查詢,這樣會節省不少時間。

3、 intval還是少用,如果在單純的計算中,比如:12.22 / 1.1 這種,用intval就會計算不準確,特別是在循環中,數據會越來越不準確。在計算的時候,要麼採用精度計算,要麼採用sprintf來格式化

4、 在寫代碼的時候,要考慮一個問題,假如有100W的數據,你的代碼能跑的動嗎?優化在於開始寫之前,而不是開始寫之後。

5、 對文件命名的時候,不要帶上項目的名字,因為多個項目的話,可能會共用同一個文件。

6、 代碼精簡,一些判斷條件,要注意是否重複。比如你在sql裡面限制 x字段為1,那麼下面的邏輯中就沒必要判斷 if(x ==1)這種情況,因為我們用的結果集是從數據庫中拿的,已經篩選過了。

相關推薦

推薦中...