你見過哪些令人瞠目結舌的php代碼技巧?
一看都變成了講解如何進行php的優化了,我也說點。
1.單引號實現字元串的性能優化這個我覺得沒有必要。php不會因為這點小的性能消耗就被壓垮了。而且也會出現一些其他的問題。我舉個例子&$str = "you"re";
$data = "I heard that {$str} getting married";?&>我覺得這個時候,還是使用雙引號更好一些。因為你字元串拼接的問題,還要php再次申請開啟內存空間。同時還能避免出現一些奇葩問題。比如我們之前出現的這個問題。&$str = "you"re";$sql = "update article set content = "{$str}" where id = 1";echo $sql; //update article set content = "you"re" where id = 1?&>比如出現了這種情況。就會特別痛苦。 這是慘痛的教訓。我還是還在補坑中。2.儘可能的使用PHP函數,換一句話說意思就是盡量的減少代碼行數,這樣的一個好處就是說減少代碼出現bug的量。
3. require_once 和 require 其實消耗差不多,那一點的差距真的不算大。等你寫的文件需要這邊載入那邊載入,然後發現一不小心重複載入了一個類,然後造成衝突了。你就知道了require_once的好處了。
4.盡量不要隨便的進行複製變數 因為這樣php需要另外去開闢空間,這樣的也話會耗費一些時間。雖然這些時間很少,但是我感覺這種完全可以避免掉。
5.在echo一個東西的時候盡量使用分號而不是點語法。我的解釋是這樣的,當用點語法的時候,php需要記性開闢更多的空間來存儲這個變數,然後統一進行輸出。而使用逗號的話,則使用了多次echo行為。這樣的話。只是分為兩次將變數輸入到緩衝區。相對來說,點語法快了一點點。。。。但是這些都是一點點的性能損耗。
6.在php7之前的foreach其實是複製出一個副本出來,然後進行循環的。這個時候我還是建議使用array_map(), array_walk(), array_filter()等函數來處理你的問題。
7.$dir = dirname(dirname(dirname(__file__))); 這個的優化方法我給寫的是:$dir = realpath(__DIR__ . "/../../"); 最後要確定的目錄一定要存在,否則會返回false
8.一定要明白 == 和 === 的區別
9.不要使用__autoload 使用spl_autoload_register來代替。具體使用方法可以查詢該函數
10.不要隨便相信網上的那些php優化50則之類的東西。因為裡面的有些東西可能是錯的。在沒有驗證正確性的時候,不要隨便轉發給別人。現在網上的資料已經夠亂的了。希望大家在確定真實性之後再去傳播。非瞠目結舌,只是一點小技巧
- foreach效率更高,盡量用foreach代替while和for循環。
- 循環內部不要聲明變數,尤其是對象這樣的變數。
- 循環里別用函數
for($x=0; $x &< count($array); $x) //count()函數在外面先計算
- 在多重嵌套循環中,如有可能,應當將最長的循環放在內層,最短循環放在外層,從而減少cpu跨循環層的次數,優化程序性能。
//小循環
foreach (...)
{
//大循環
foreach (...)
{
//coding
}
}
- 用單引號替代雙引號引用字元串以實現PHP性能優化。
//BAD:
$output = "This is a plain string";
//GOOD:
$output = "This is a plain string";
//BAD:
$type = "mixed";
$output = "This is a $type string";
//GOOD:
$type = "mixed";
$output = "This is a " . $type ." string";
- 用i+=1代替i=i+1。符合c/c++的習慣,效率還高。
- 優化Select SQL語句,在可能的情況下盡量少的進行Insert、Update操作,達到PHP性能優化的目的。
- 某些地方使用isset代替strlen
//BAD:
if (strlen($foo) &< 5) { echo 「Foo is too short」; } //GOOD: if (!isset($foo{5})) { echo 「Foo is too short」; } - 盡量的少進行文件操作,雖然PHP的文件操作效率也不低的。
- 儘可能的使用PHP內部函數。
- 在可以用PHP內部字元串操作函數的情況下,不要用正則表達式。
& "e", ));
?&>
- 在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用file_get_contents,因為它的效率高得多。但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題。
- 不要隨便就複製變數
//BAD:
$description = $_POST["description"];
echo $description;
//GOOD:
echo $_POST["description"];
- Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本。
- 試著喜歡使用三元運算符(?:)。
- 使用選擇分支語句,switch case好於使用多個if,else if語句,並且代碼更加容易閱讀和維護。
- 當echo字元串時用逗號代替點連接符更快些。echo一種可以把多個字元串當作參數的「函數」。echo是語言結構,不是真正的函數,故把函數加上了雙引號。例如
echo $str1,$str2
1、autoload
spl_autoload_register(function($classname){ require_once("{$classname}.php")});2、php也有閉包3、trait 就像個萃取器(我用過幾次)
trait SayWorld{ public function sayHello() { echo "World!"; }}class MyHelloWorld{// 將SayWorld中的成員包含進來
use SayWorld;}$xxoo = new MyHelloWorld();// sayHello() 函數是來自 SayWorld 構件的$xxoo-&>sayHello();4、php也有yield關鍵字function number10(){ for($i = 1; $i yield $i;}
返回數組1, 2, 3, 4, 5, 6, 7, 8, 9, 10]5、飛船運算符Orz.. php7就是類似windows api返回值的三元邏輯。$a $b;6、定界符$name = "kitty";echo{$name}
就在剛才的空間里看到這個圖片。
load 默認參數
$params += array("p1" =&> xx,
"p2" =&> xx)&
曾經寫過的代碼,有類似經歷的來站隊
告訴各位找嗔目結舌X的方法,去StackoverflowHighest Voted "php" Questions有多嗔目結舌我不知道,但我肯定你能學到很多東西,不要繼續在這種問題上浪費生命。
PHP一句話木馬。木馬的精髓第一在於用盡量少的代碼可以做盡量多的事情,第二是讓人認不出來這是木馬比如下面三個(我只是用過一些,但是這些代碼不是我原創啊,聲明一下-_-!):
&
&
&
&1", "r");
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer
";
flush();
}
pclose($handle);
php 模擬 tail -f
大概就是那些利用反射玩出來的花樣吧,不過不建議寫沒有詳細文檔說明的反射,後來的人會看不懂的 PHP: Variable variablesPHP: Magic MethodsPHP: spl_autoload
那我估計就是一個符號@
strtotime()
---
雖然,這個技巧不是PHP獨有的。
---
更新:
這個問題已經過去很久了,答案依然乏善可陳。我來寫一些:
一、各種魔術方法
PHP: 魔術方法
那麼你不禁要問了:老師,這有什麼用呢?
比如我們做了一個服務註冊器,它用起來是這樣的。
®isterService("db", $db);
$db = $sr-&>getService("db");
但是我們需要經常訪問db服務的,所以我們希望能少敲幾個字元(也減少了出錯的可能性),於是我們希望能這樣寫:
&db;
&getService($name)
}
}
這個其實很多人都知道,算不得膛目結舌。通過這種方式省代碼也不是什麼值得說出來的事情。
那麼我下面介紹的這個見過的人可不多
我們都知道,在Web開發中,緩存是個很常用的需求。大家寫代碼通常都是這樣寫的
&get($key)) {
return $data;
}
$data = do_real_foo_takes_long_time();
$cache-&>set($key, $data, $expire_time);
return $data;
}
然而如果很多地方都需要緩存,會造成代碼的重複,同時也是bug的溫床。
我們有一個夢想,如果我們能夠像寫普通代碼一樣寫邏輯,只要在最後「聲明」一下使用緩存,就可以使用緩存,那該多好呀!
在Python中,你可以使用使用裝飾器做到這樣:
@cache
def foo():
// ...
return data
PHP畢竟比不上Python的優雅,但如果你是類里的方法(一般而言,大家都會大量使用類),你可以這樣:
&barCache(); // 會自動緩存!
這真的是太美妙了。那麼這個是怎麼實現的呢?知道 __call 的人應該已經能猜出來了。
&get($key)) {
return $data;
}
$data = call_user_func_array([$this, $func], $args);
$cache-&>set($key, $data, 3600);
return $data;
} else {
throw new Exception("bad call $name", 1);
}
}
}
是不是心服口服!
當然,這個還有個緩存時間的問題,這個就交給你解決了!
待續不知道php中有try catch 和定界符的請點贊
看到有很多人說php一句話木馬的,其實這種web木馬是很好玩的,放在伺服器里就可以拿webshell了。但是伺服器里很有可能存在安全狗,這就要求你的木馬不能被狗認出來。感興趣的可以看http://www.xfcxc.top/index.php/2017/06/03/phpyijuhua/
貌似沒見過特別有趣的。。當時學php時覺得
$a="hello";
$hello="a";echo $$hello;挺好玩的。。俺做過一個, 引用 帶命名空間 的類出問題,一怒之下 寫個函數 裡面僅僅是include 那個帶命名空間的類的文件名
以前結果判斷用 if($list){}else{} 現在用if($list === false){}else{};能不容忍的就不容忍
變數值當做變數名是最好玩的
事務裡面多個條件判斷do{}while()
未曾見過這等技巧,只體會過書寫規範層次分明調理清晰命名考究和設計思想的精妙。這些都能從領域裡的前輩和同行的身上發掘體現。
推薦閱讀:
※如何評價《Windows 10 development for beginners》的翻譯工作?
※有沒有用漢字設計的編程語言,或者漢化一種常見的編程語言?
※MATLAB 到底有多厲害?