快速掌握新版本PHP新功能的技巧

church發表於2021-12-17
最新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裡似乎都沒有提到,只有通過單元測試程式碼才能注意到。

有興趣的同學可以挑幾個新功能的單測看看,看完了保證你有所收穫,對新功能新語法有更全面的瞭解。

相關文章