Lambda表達式(匿名函數)實現了一次執行且無污染的函數定義,是拋棄型函數並且不維護任何類型的狀態。閉包在匿名函數的基礎上增加了與外部環境的變數交互,通過 use 子句中指定要導入的外部環境變數。C字元串以空字元('\0')為結束標誌,這使得C字元串不能保存像圖片、音頻、視頻、壓縮文件這樣的二進位... ...
- Opcache:Opcache 來源於Zend Optimizer+改名,主要作用是通過將 PHP 腳本預編譯的位元組碼存儲到共用記憶體中來提升 PHP 的性能, 存儲預編譯位元組碼的好處就是省去了每次載入和解析 PHP 腳本的開銷,但是對於I/O開銷如讀寫磁碟文件、讀寫資料庫等並無影響。Opcache 很有可能取代 APC 的位置,雖然沒有 APC 那樣的 user cache 功能。另外 Opcache 可能與eaccelerator、xcache 或 apc 等類似組件相衝突。
- PHP-FPM進程池:FastCGI Process Manager 的master process是常駐記憶體的,在進程池中動態創建並管理多個進程,可以有效控制記憶體和進程並平滑重載PHP配置,在發生意外情況的時候能夠重新啟動並恢復被破壞的 opcode。參考本人此篇 PHP-FPM進程池探秘 。
- 數據類型:PHP 支持 9 種原始數據類型:
四種標量類型: 1. boolean(布爾型) 2. integer(整型) 3. float(浮點型,也稱作 double) 4. string(字元串) 三種複合類型: 1. array(數組) 2. object(對象) 3. callable(可調用) 最後是兩種特殊類型: 1. resource(資源) 2. NULL(無類型)
- Lambda表達式(匿名函數)與閉包:Lambda表達式(匿名函數)實現了一次執行且無污染的函數定義,是拋棄型函數並且不維護任何類型的狀態。閉包在匿名函數的基礎上增加了與外部環境的變數交互,通過
use
子句中指定要導入的外部環境變數function getClosure($n) { $a = 100; return function($m) use ($n, &$a) { $a += $n + $m; echo $a."\n"; }; } $fn = getClosure(1); $fn(1);//102 $fn(2);//105 $fn(3);//109 echo $a;//Notice: Undefined variable
class Dog { private $_name; protected $_color; public function __construct($name, $color) { $this->_name = $name; $this->_color = $color; } public function greet($greeting) { return function() use ($greeting) { //類中閉包可通過 $this 變數導入對象 echo "$greeting, I am a {$this->_color} dog named {$this->_name}.\n"; }; } public function swim() { return static function() { //類中靜態閉包不可通過 $this 變數導入對象,由於無需將對象導入閉包中,
//因此可以節省大量記憶體,尤其是在擁有許多不需要此功能的閉包時。 echo "swimming....\n"; }; } private function privateMethod() { echo "You have accessed to {$this->_name}'s privateMethod().\n"; } public function __invoke() { //此方法允許對象本身被調用為閉包 echo "I am a dog!\n"; } } $dog = new Dog("Rover","red"); $dog->greet("Hello")(); $dog->swim()(); $dog(); //通過ReflectionClass、ReflectionMethod來動態創建閉包,並實現直接調用非公開方法。 $class = new ReflectionClass('Dog'); $closure = $class->getMethod('privateMethod')->getClosure($dog); $closure(); - 單/雙引號、Heredoc、Nowdoc:單引號字元串中只需要轉義單引號(\')、反斜杠(\\),其餘原樣輸出;雙引號字元串中的變數將被解析;Heredoc 結構類似於雙引號字元串;Nowdoc類似於單引號字元串,nowdoc 結構和 heredocs 結構使用一樣的標記 <<<, 但是跟在後面的標識符要用單引號括起來,即 <<<'EOT'
- 字串變數解析:可分為$解析和{}解析。$解析就是解析出$引出的有效變數,{}解析則是解析{}中引出的變數
- SQL註入風險:以下為列舉部分
1. addslashes函數轉義風險:對於URL參數arg = %df\'在經過addslashes轉義後在GBK編碼下arg = 運' 2. urldecode函數解碼風險:對於URL參數uid = 1%2527在調用urldecode函數解碼(二次解碼)後將變成uid = 1'
- 大小寫轉換:
$str = preg_replace_callback( '/([a-z]*)([A-Z]*)/', function($matchs){ return strtoupper($matchs[1]).strtolower($matchs[2]); }, $str );
- 二進位安全:C字元串以空字元('\0')為結束標誌,這使得C字元串不能保存像圖片、音頻、視頻、壓縮文件這樣的二進位數據,反之則稱作二進位安全的。這個概念在PHP中經常提到,此處只做個簡單解釋。下麵是Redis 簡單動態字元串(SDS)的實現,它是二進位安全的:
// 文件路徑:src/sds.h struct sdshdr { // 記錄buf數組中已使用位元組的數量 int len; // 記錄buf數組中未使用位元組的數量 int free; // 位元組數組,用於保存字元串 char buf[]; };
- / 和 % 以及 ** 運算符:取模運算符%的操作數在運算之前都會轉換成整數(除去小數部分),取模運算符%的結果和被除數的符號(正負號)相同,** 表示乘方運算
5 / 3;//1.6666666666667 5.7 % 3;//2 5 % 3;//2 2 ** 3;//8
- 運算符優先順序:優先順序從上到下依次降低
結合方向 運算符 附加信息 無 clone new clone 和 new 左 [ array() 右 ** 算術運算符 右 ++ -- ~ (int) (float) (string) (array) (object) (bool) @ 類型和遞增/遞減 無 instanceof 類型 右 ! 邏輯運算符 左 * / % 算術運算符 左 + - . 算術運算符和字元串運算符 左 << >> 位運算符 無 < <= > >= 比較運算符 無 == != === !== <> <=> 比較運算符 左 & 位運算符和引用 左 ^ 位運算符 左 | 位運算符 左 && 邏輯運算符 左 || 邏輯運算符 左 ?? 比較運算符 左 ? : ternary 右 = += -= *= **= /= .= %= &= |= ^= <<= >>= 賦值運算符 左 and 邏輯運算符 左 xor 邏輯運算符 左 or 邏輯運算符 - unset() 與 NULL:刪除引用,觸發相應變數容器refcount減一,但在函數中的行為會依賴於想要銷毀的變數的類型而有所不同,比如unset 一個全局變數,則只是局部變數被銷毀,而在調用環境中的變數(包括函數參數引用傳遞的變數)將保持調用 unset 之前一樣的值;unset 變數與給變數賦值NULL不同,變數賦值NULL直接對相應變數容器refcount = 0
//示例一:函數內銷毀全局變數$foo是無效的 function destroy_foo() { global $foo; unset($foo); echo $foo;//Notice: Undefined variable: foo } $foo = 'bar'; destroy_foo(); echo $foo;//bar //示例二:要在函數中 unset 一個全局變數,應使用 $GLOBALS 數組來實現 function foo() { unset($GLOBALS['bar']); } $bar = "something"; foo(); echo $bar;//Notice: Undefined variable: bar
- pack()與unpack():這兩個函數可用作socket編程時的二進位串編碼/解碼函數
$binarydata = pack("nvc*", 0x1234, 0x5678, 65, 66);//Pack data into binary string $array = unpack("c4chars/nint", $binarydata);//Unpack data from binary string print_r($array);//Array ( [chars1] => 19 [chars2] => 52 [chars3] => 24 [chars4] => 22 [int] => 16706 )
-
PHP7 - Group Use用法:
// Proposed group use syntax: use FooLibrary\Bar\Baz\{ ClassA, ClassB, ClassC, ClassD as Fizbo }; // Compared to current use syntax: use FooLibrary\Bar\Baz\ClassA; use FooLibrary\Bar\Baz\ClassB; use FooLibrary\Bar\Baz\ClassC; use FooLibrary\Bar\Baz\ClassD as Fizbo;
- PHP7 - NULL合併運算符(??):
// Fetches the request parameter user and results in 'nobody' if it doesn't exist $username = $_GET['user'] ?? 'nobody'; // equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
- PHP7 - 合併比較運算符(<=>):
operator <=>
equivalent$a < $b
($a <=> $b) === -1
$a <= $b
($a <=> $b) === -1 || ($a <=> $b) === 0
$a == $b
($a <=> $b) === 0
$a != $b
($a <=> $b) !== 0
$a >= $b
($a <=> $b) === 1 || ($a <=> $b) === 0
$a > $b
($a <=> $b) === 1
- PHP7 - 用戶層隨機數生成器:更安全方便
1. random_bytes(int length):Generates cryptographically secure pseudo-random bytes, such as when generating salts, keys or initialization vectors. 2. random_int(int min, int max):Generates cryptographically secure pseudo-random integers, such as when shuffling a deck of cards for a poker game.
$bytes = random_bytes(5); var_dump(bin2hex($bytes));//string(10) "385e33f741" var_dump(random_int(100, 999));//int(248)
-
PHP7 - declare(strict_type=1):PHP7新增int、float、string和bool這4種標量類型聲明,declare(strict_type=1)將使PHP不在自動對數據類型進行轉換,PHP因此而成為了強類型語言。declare(strict_type=1)必須是文件的第一個語句,隻影響當前文件內的全部函數調用,不會影響被它包含(通過include等方式)進來的其他文件。
- PHP7 - 可捕獲的Error:PHP7實現了一個全局的throwable介面,原來的Exception和部分Error都實現了這個介面。PHP7中有更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error。