PHP8
Named arguments
1
2
3
4function test($name,$age=12,$sex="boy"){
echo $name.$age.$sex."\n";
}
test("hai",sex:"girl");Attributes
1
2
3
4
5
6
7
8
9
10#[
Route("/api/posts/{id}", methods: ["GET"])
]
function testAttributes(){
$ref = new ReflectionFunction("testAttributes");
var_dump($ref->getAttributes("Route")[0]);
var_dump($ref->getAttributes("Route")[0]->getName());
var_dump($ref->getAttributes("Route")[0]->getArguments());
}
testAttributes();Constructor property promotion
1
2
3
4
5
6
7
8
9
10
11class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
$point=new Point();
var_dump($point->x);
var_dump($point->y);
var_dump($point->z);Union types
1
2
3
4
5
6
7
8class Number {
public function __construct(
private int|float $number
) {}
}
new Number('88');
new Number('ss88'); // TypeError
new Number('88ss'); // TypeErrorMatch expression
1
2
3
4
5
6
7
8echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
1.Match is an expression, meaning its result can be stored in a variable or returned.
2.Match branches only support single-line expressions and do not need a break; statement.
3.Match does strict comparisons.Nullsafe operator
1
2
3
4
5
6$session=null;
$country = $session?->user?->getAddress()?->country;
var_dump($country);
$country = $session->user->getAddress()->country; //Fatal error
var_dump($country);Saner string to number comparisons
1
2
30 == 'foobar' // false
When comparing to a numeric string, PHP 8 uses a number comparison. Otherwise, it converts the number to a string and uses a string comparison.Consistent type errors for internal functions
1
2
3strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0JIT
JIT基准测试
cli
fpm