1. ?? operator (NULL coalescing operator)
$a = $_GET['a'] ?? 1;
It is equivalent to:
$a = empty($_GET['a']) ? 1 : $_GET['a'];
We knowternary operation The symbol can be used like this:
$a ?: 1
But this is based on the premise that $a has been defined. The new ?? operator can simplify judgment. The code is simplified and more intuitive at the same time!
Example provided by the official document (note that the side length parameter syntax of ...
is only available in PHP 5.6 or above) :
<?php function arraysSum(array ...$arrays): array { return array_map(function(array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
It can be seen from this example that all functions (including anonymous functions) can specify the type of return value.
This feature can help us avoid some problems caused by PHP's implicit type conversion. Thinking about the expected results before defining a function can avoid unnecessary errors.
But there is also a feature that needs attention here. PHP 7 adds a declare directive: strict_types
, which uses strict mode.
When using return value type declaration, if it is not declared in strict mode, and if the return value is not the expected type, PHP will still perform cast type conversion on it. But if it is strict mode, a Fatal error of TypeError
will be issued.
Force mode:
<?php function foo($a) : int { return $a; } foo(1.0);
The above code can be executed normally, and the foo function returns int 1 without any errors.
Strict mode:
<?php declare(strict_types=1); function foo($a) : int { return $a; } foo(1.0);
After the declaration, a fatal error will be triggered.
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6
The formal parameter type declaration of functions in PHP 7 can be scalar. In PHP 5, it can only be a class name, interface, array
or callable
(PHP 5.4, it can be a function, including anonymous functions). Now you can also use string
, int
, float
and bool
are gone.
<?php // Coercive mode function sumOfInts(int ...$ints) { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1));
It should be noted that the strict mode problem mentioned above also applies here: in the forced mode (default, which is forced type conversion), parameters that do not meet the expectations will still be forced to type conversion. Strict In mode, a fatal error of TypeError
is triggered.
In PHP 7, use can declare multiple classes or functions or const in one sentence:
<?php use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC};
But you still have to write out each The name of a class or function or const (there is no from some import *
method like python).
The question you need to pay attention to is: if you are using a framework based on composer and PSR-4, can this writing method successfully load class files? In fact, it is possible. The autoloading method registered by composer is to find the location according to the class's namespace when the class is called. This way of writing has no effect on it.
Let’s talk about a few more briefly:
1. PHP 5.3 started to have anonymous functions, and now there are anonymous classes;
2. define can now define constant arrays ;
3. Closure (Closure) adds a call method;
4. Generator (or iterator is more appropriate) can have a final return value (return), or Enter another generator (generator delegate) through the new syntax of yield from
.
The two new features of generators (return and yield from
) can be combined. For details, you can test it yourself.
The above is the detailed content of Detailed explanation of new scalar, operator, and return value type features in php7. For more information, please follow other related articles on the PHP Chinese website!