最新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里似乎都没有提到,只有通过单元测试代码才能注意到。
有兴趣的同学可以挑几个新功能的单测看看,看完了保证你有所收获,对新功能新语法有更全面的了解。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。