PHP7自发布以来最受关注的是性能的提高,随着官方版本不断的升级和维护优化,php7版本逐步成熟,很多企业项目也已经逐步移植到PHP7上面,下面介绍下PHP7在语法方面新增了哪些特性。
1: 标量类型声明 有两种模式: 强制 (默认) 和 严格模式。
// 定义一个函数, 参数和函数返回值必须为整型
function sun(int $num) {
return $num * $num;
}
2: 返回值类型声明, 下例定义arraySum函数,标量申明为数组类型,返回值必须为数组
function arraySum(array $arrs) : array {
return array_map(function (array $arr) : int {
return array_sum($arr);
}, $arrs);
}
$result = arraySum([[1,2,3], [4,5,6], [7,8,9]]);
3: null合并运算符
// php7 以前写法
isset($_GET['type']) ? $_GET['type'] : '';
>=php7 写法
$_GET['type'] ?? ''; // 跟上例代码结果一致,可以减少php7以前大量使用isset或empty
4: 太空船操作符 (<=>)
// 所有两个数相等返回0, 左边数值大于右边数值 返回1, 左边数值小于右边数值 返回-1
if ( (1<=> 1) == 0) {
echo "相等\n";
}
if ( (2 <=> 3) == -1) {
echo "2小于3\n";
}
if ( (5<=> 3) == 1) {
echo "5大于3\n";
}
// 结果:相等, 2小于3, 5大于3
5: define 支持定义常量数组
// php7之前 只支持 const定义数组,现在支持define定义
define('NAMES', array('zhangsan', 'lisi'));
NAMES[0] // zhangsan
6: 匿名类 new class
interface Logger
{
public function log($msg);
}
class Application
{
private $logger;
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
public function getLogger() : logger
{
return $this->logger;
}
}
$app = new Application();
$app->setLogger(new class implement Logger{
public functoin log($msg)
{
echo $msg;
}
});
$logger = $app->getLogger();
var_dump($logger); // object(class@anonymous)#2 (0) {}
7: Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它
class A
{
private $x = 1;
}
// PHP 7 之前版本的代码
$getXCB = function() {
return $this->x;
};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();
// PHP 7+ 及更高版本的代码
$getX = function() {
return $this->x;
};
echo $getX->call(new A);
8: 从同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入
namespace names;
class ClassA
{
public static function getName()
{
return __METHOD__;
}
}
namespace names;
class ClassB
{
public static function getName()
{
return __METHOD__;
}
}
namespace names;
class ClassC
{
public static function getName()
{
return __METHOD__;
}
}
use names\{ClassA, ClassB, ClassC};
ClassA::getName(); // 这里会成功调用classA::getName()方法
9: 新增整数除法函数
intdiv(10, 2) // 5
intdiv(10, 3); // 3
intdiv(100,3) // 33
// 由上面结果可以看出, 除不尽的数会舍弃掉
10: session 会话,session_start(); 新增一个参数(array) 可以覆盖PHP.INI中的配置项
session_start([
'cache_limiter' => 'private',
'read_and_close' => true
]);
11: 新加入两个跨平台的函数: random_bytes() 和 random_int() 用来产生高安全级别的随机字符串和随机整数
random_bytes()
random_int()
12: php7 类名可以是一个字符串访问静态方法
class foo
{
static $bar = 'baz';
}
echo 'foo'::$bar; // baz
// 经过在测试, 在windows下面会出现如下错误
// error : Uncaught Error: Class 'foo' not found in Stack trace: #0 {main} thrown
转载至:https://blog.csdn.net/xueling022/article/details/72830811