你見過哪些令人瞠目結舌的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則之類的東西。因為裡面的有些東西可能是錯的。在沒有驗證正確性的時候,不要隨便轉發給別人。現在網上的資料已經夠亂的了。希望大家在確定真實性之後再去傳播。


非瞠目結舌,只是一點小技巧

  1. foreach效率更高,盡量用foreach代替while和for循環。
  2. 循環內部不要聲明變數,尤其是對象這樣的變數。

  3. 循環里別用函數

    for($x=0; $x &< count($array); $x) //count()函數在外面先計算

  4. 在多重嵌套循環中,如有可能,應當將最長的循環放在內層,最短循環放在外層,從而減少cpu跨循環層的次數,優化程序性能。

    //小循環
    foreach (...)
    {
    //大循環
    foreach (...)
    {
    //coding
    }
    }

  5. 用單引號替代雙引號引用字元串以實現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";

  6. 用i+=1代替i=i+1。符合c/c++的習慣,效率還高。

  7. 優化Select SQL語句,在可能的情況下盡量少的進行Insert、Update操作,達到PHP性能優化的目的。

  8. 某些地方使用isset代替strlen

    //BAD:
    if (strlen($foo) &< 5) { echo 「Foo is too short」; } //GOOD: if (!isset($foo{5})) { echo 「Foo is too short」; }

  9. 盡量的少進行文件操作,雖然PHP的文件操作效率也不低的。

  10. 儘可能的使用PHP內部函數。

  11. 在可以用PHP內部字元串操作函數的情況下,不要用正則表達式。

    & "e", ));
    ?&>

  12. 在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情況下,盡量用file_get_contents,因為它的效率高得多。但是要注意file_get_contents在打開一個URL文件時候的PHP版本問題。
  13. 不要隨便就複製變數

    //BAD:
    $description = $_POST["description"];
    echo $description;
    //GOOD:
    echo $_POST["description"];

  14. Apache解析一個PHP腳本的時間要比解析一個靜態HTML頁面慢2至10倍。盡量多用靜態HTML頁面,少用腳本。
  15. 試著喜歡使用三元運算符(?:)。

  16. 使用選擇分支語句,switch case好於使用多個if,else if語句,並且代碼更加容易閱讀和維護。

  17. 當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}

Eof;

?&>

(注:一些內容來自網路)


就在剛才的空間里看到這個圖片。


load 默認參數

$params += array(

"p1" =&> xx,

"p2" =&> xx

)


&
曾經寫過的代碼,有類似經歷的來站隊


告訴各位找嗔目結舌X的方法,去Stackoverflow

Highest Voted "php" Questions

有多嗔目結舌我不知道,但我肯定你能學到很多東西,不要繼續在這種問題上浪費生命。


PHP一句話木馬。

木馬的精髓第一在於用盡量少的代碼可以做盡量多的事情,第二是讓人認不出來這是木馬

比如下面三個(我只是用過一些,但是這些代碼不是我原創啊,聲明一下-_-!):

&
&
&


&1", "r");
while(!feof($handle)) {
$buffer = fgets($handle);
echo "$buffer
";
flush();
}
pclose($handle);

php 模擬 tail -f


大概就是那些利用反射玩出來的花樣吧,不過不建議寫沒有詳細文檔說明的反射,後來的人會看不懂的

PHP: Variable variables

PHP: Magic Methods

PHP: spl_autoload


那我估計就是一個符號

@


strtotime()

---

雖然,這個技巧不是PHP獨有的。

---

更新:

這個問題已經過去很久了,答案依然乏善可陳。我來寫一些:

一、各種魔術方法

PHP: 魔術方法

那麼你不禁要問了:老師,這有什麼用呢?

比如我們做了一個服務註冊器,它用起來是這樣的。

&registerService("db", $db);
$db = $sr-&>getService("db");

但是我們需要經常訪問db服務的,所以我們希望能少敲幾個字元(也減少了出錯的可能性),於是我們希望能這樣寫:

&db;

那這種功能在PHP中怎麼實現呢?只要這樣就行啦:

&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 到底有多厲害?

TAG:互聯網 | 軟體 | 程序員 | PHP | 編程 |