最新PHP版本更新迭代非常快,很多小夥伴都直呼學不動了。又因為文件具有一定的滯後性,看全英文RFC也是有點門檻的事情。所以本文想教大家一種比較快速全面瞭解新功能的技巧。
技巧說起來非常簡單,看 PHP 原始碼中的單元測試.
因為單元測試要考慮到的場景非常多,所以用例非常全面,有些文件中沒有細說的東西,單元測試程式碼都能清晰地體現出來.
話不多說,開始整活.
下載原始碼
git clone https://github.com/php/php-src
看單元測試
各個擴充套件的單元測試在 ext/副檔名/tests
,以 phpt
字尾結尾的檔案就是單元測試檔案.
內嵌函式的單元測試在 Zend/tests
.
以箭頭函式為例
在 Zend/tests/arrow_functions
目錄下,看一下 001.phpt
裡的內容.
--TEST--
Basic arrow function functionality check
--FILE--
<?php
$foo = fn() => 1;
var_dump($foo());
$foo = fn($x) => $x;
var_dump($foo(2));
$foo = fn($x, $y) => $x + $y;
var_dump($foo(1, 2));
// Closing over $var
$var = 4;
$foo = fn() => $var;
var_dump($foo());
// Not closing over $var, it's a parameter
$foo = fn($var) => $var;
var_dump($foo(5));
// Close over $var by-value, not by-reference
$var = 5;
$foo = fn() => ++$var;
var_dump($foo());
var_dump($var);
// Nested arrow functions closing over variable
$var = 6;
var_dump((fn() => fn() => $var)()());
var_dump((fn() => function() use($var) { return $var; })()());
?>
--EXPECT--
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(5)
int(6)
int(6)
分成三段:
第一段,本次測試的主題描述 --TEST--
.
第二段,本次單測的PHP程式碼 --FILE--
.
第三段,本次單測預期的輸出,如果期待輸出是錯誤用 --EXPECTF--
,否則使用 --EXPECT--
基本上 PHP 原始碼中所有的單元測試都是這種格式.
第一個單測用例就是測一測箭頭函式的基本使用是否符合預期,非常簡單,示例我就不詳細說明了.
看看箭頭函式其它的用例,第二個單測檔案:
--TEST--
Arrow functions implicit use must be throwing notices only upon actual use
--FILE--
<?php
$b = 1;
var_dump((fn() => $b + $c)());
?>
--EXPECTF--
Warning: Undefined variable $c in %s on line %d
int(1)
也非常簡單,目的是想告訴我們,定義箭頭函式的時候,使用未定義的變數不會報錯,只有在實際用到時才會丟擲錯誤。也就是說:
<?php
$a = 1;
$func = fn() => $a + $b;
這樣是不會報錯的,只有下面的程式碼才會丟擲錯誤。
<?php
$a = 1;
$func = fn() => $a + $b;
$func();
這種細節RFC裡似乎都沒有提到,只有通過單元測試程式碼才能注意到。
有興趣的同學可以挑幾個新功能的單測看看,看完了保證你有所收穫,對新功能新語法有更全面的瞭解。