PHP7常用新特性和函数
距离php7
发布也有好几年了,而国内大部分空间商和CMS系统还在使用5.2的时代。 最近正好也在升级公司的项目到7上面,其实在升级到7的时候代码改动很小,不得不说php
的向下兼容性很强官方也在这方面下了不少功夫。下面就说说php7
中的一些常用新特性。
标量参数和返回类型声明
PHP在版本7之前有类型声明,但仅限于对象和数组。 PHP7现在为表中的所有标量类型提供支持,并提供两种不同类型的声明。 此特性在开发大型工程借助IDE的情况下还是很有帮助的,对程序性能也有提升。
强制:
这是默认声明类型,只是意味着PHP运行时将在需要时尝试强制值。以下面的代码为例。
<?php
function testTypeDeclaration(string $argument): string
{
return strrev($argument);
}
var_dump(testTypeDeclaration(1234));
我们指定参数$argument
是string
类型以及返回值。正如你看到的那样, 代码并没有出错如期的运行着。
当我们传入数字1234时,它只是被强制转换成'1234'
字符串并且没有错误发生。
严格:
严格模式它是通过添加到每个文件顶部的标志逐个文件启用的。启用时,它不会像上面的示例中那样强制转换类型,而是响应错误并停止执行脚本。
<?php
declare(strict_types=1);
function testTypeDeclaration(string $argument): string
{
return strrev($argument);
}
var_dump(testTypeDeclaration(1234));
declare(strict_types=1)
标志必须写在文件的顶部
通过严格模式这段代码会得到以下的错误:
Fatal error: Uncaught TypeError: Argument 1 passed to testTypeDeclaration() must be of the type string, integer given
null合并运算符
此项特性会为我们节省很多if
代码段. 也是新特性中用处最多的,代码更简洁。在日常使用中我们大量同时使用三元表达式和isset()
的情况,使用该特性就可以直接代替isset
和三元表达式,这是一个语法糖特性.
<?php
echo isset($_GET['user']) ? $_GET['user'] : 'nobody'; // php7之前
echo $_GET['user'] ?? 'nobody'; // php7之后
??
如果前的表达式为null
就会使用??
后面的值否则返回自身.
常量数组
在7之前常量是只支持标量的,升级到7就可以支持常量数组.
<?php
define('COLORS', [
'red' => '#f44141',
'blue' => '#4286f4',
'green' => '#1ae01e',
'purple' => '#f309f7',
'orange' => '#ef7700',
]);
echo COLORS['red']; // 输出 "#f44141"
class Test
{
const ANIMALS = [ // 这个在5.6就已经支持了
'dog',
'cat',
'bird'
];
}
echo Test::ANIMALS[0]; // 输出 "dog"
Namespace组声明
在同一namespace
下的类、函数和常量现在可以通过单个use
语句一次性导入了。
<?php
// 7之前
use Group/Child/ClasName1;
use Group/Child/ClasName2;
use Group/Child/ClasName3;
// 7之后
use Group/Child/{ClassName1, ClassName2, ClassName3};
匿名类
使用new class
可以直接实例化一个匿名类,有些可能并不需要一些实体类.
<?php
interface Car
{
public function getName();
}
class App
{
private $car = null;
public function setCar(Car $car)
{
$this->car = $car;
}
public function getName()
{
echo $this->car->getName();
}
}
echo (new App)->setCar(new class implements Car {
public function getName()
{
return "police car";
}
})->getName();
正如你看到的,上面的示例会输出police car
字符串。
其它的一些不常用的特性就不做介绍了,可以通用官方提供的文档来查看全部特性.
新增加函数
random_int
函数生成加密安全的伪随机整数,官方文档
<?php
echo randome_int(1, 13);
random_bytes
函数生成加密安全的伪随机字节,官方文档, 此函数在密钥随机生成时候非常有用。
<?php
$bytes = random_bytes(5);
echo bin2hex($bytes);
Closure::call()
将闭包暂时绑定到新对象中,并调用闭包.
<?php
class A {private $x = 1;}
$getX = function() {return $this->x;};
echo $getX->call(new A); // 输出 1;
总结
在升级到7之后,上面这些新特性和函数是我在项目中常用的一些功能,本文还有很多未介绍的特性功能,大家可以去官方文档阅读更多的内容。强烈建议大家升级到7,不管在性能,代码质量,安全性都要比上个版本好很多。大家也可以通过留言和我一起探讨其它的问题,谢谢大家。