php7介绍以及一些新特性
2018-05-19 00:46:40 by 448 0

一:基本介绍

PHP 7 初次发布2015年6月11日(正式版16年1月6日),是时隔11年来首次发布的PHP主版本,PHP上一次发布主版本是在2004年,当时发布的是PHP5.0.0。

与这次PHP核心开发人员沉睡已久不同,PHP6曾立志要让PHP支持Unicode字符串。然而开发停滞不前,PHP6计划在2010年被取消了。

值得注意的是,php7的上一版本是php5.6,PHP7的发布是PHP世界近年来最令人激动的事之一。目前php最新版本是php7.2.5,2018年4月26日发布。

二:php7新特性(百度百科版)

PHP 7.0.0 Alpha1[1]使用新版的ZendEngine引擎,带来了许多新的特性,以下是不完全列表:

(1)性能提升:PHP7比PHP5.6性能提升了两倍。

(2)全面一致的64位支持。

(3)以前的许多致命错误,现在改成抛出异常。

(4)移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。

(5)新增了空接合操作符。

(6)新增加了结合比较运算符。

(7)新增加了函数的返回类型声明。

(8)新增加了标量类型声明。

(9)新增加匿名类。

三:php7新特性(网络版)

1,移除的一些特性

(1)移除一些旧的扩展,被移迁移到了PECL(例如:mysql)

(2)移除SAPIs的支持

(3)“< ?”和< ? language=“php”这样的标签被移除了

(4)16进制的字符串转换被废除了

"0x10" == "16"//PHP5
"0x10" != "16"//PHP7

(5)HTTP_RAW_POST_DATA移除了(可以使用php://input替代)

(6)静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了

$o = & new className{},不再支持这样的写法

(7)php.ini文件移除了#作为注释,统一用;去注释

2,新增的特性

(1)新增null合并运算符"??"

由于日常使用中存在大量同时使用三元表达式和isset()的情况, 我们添加了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

把这个放在第一个说是因为我觉得它很有用。用法:

$a = $_GET['a'] ?? 1;

它相当于:

$a = isset($_GET['a']) ? $_GET['a'] : 1;

(2)标量类型声明

标量类型声明有两种模式: 强制模式(默认)和严格模式。现在可以使用下列类型参数(无论用强制模式还是严格模式):字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。

//文件开始,强制模式
function sum(int ...$ints) {
  return array_sum($ints);
}
print(sum(2, '3', 4.1)); //输出结果为:9

//文件头部,严格模式
declare(strict_types=1);
function sum(int ...$ints) {
  return array_sum($ints);
}
print(sum(2, '3', 4.1));//Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...

使用严格模式,declare声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。 这个指令不仅影响参数的类型声明,也影响到函数的返回值声明(参见 返回值类型声明, 内置的PHP函数以及扩展中加载的PHP函数)

(3)返回值类型声明

PHP 7 增加了对返回类型声明的支持。类似于参数类型声明,返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

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]));
输出结果:Array([0] => 6 [1] => 15 [2] => 24)
declare(strict_types = 1);
//错误的;返回值类型报错
function returnIntValue(int $value): int {
  return $value + 1.0;
}
print(returnIntValue(5));//Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned.

(4)太空船操作符(组合比较符<=>)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。比较的原则是沿用 PHP 的常规比较规则进行的

// 整数
echo 1  1; // 0
echo 1  2; // -1
echo 2  1; // 1
// 浮点数
echo 1.5  1.5; // 0
echo 1.5  2.5; // -1
echo 2.5  1.5; // 1
// 字符串
echo "a"  "a"; // 0
echo "a"  "b"; // -1
echo "b"  "a"; // 1

(5)通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。

define('ANIMALS', [ 'dog', 'cat', 'bird']);
echo ANIMALS[1]; // 输出 "cat"

(6)匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

(7)Closure类,Closure::call()

Closure::call()现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

Closure::call()方法被添加为一个简短的方式来临时绑定一个对象作用域到一个闭包并调用它。与PHP5的bindTo相比,它的性能要快得多。

class A {private $x = 1;}
// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX();//输出1
// PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);//输出1

(8)为unserialize()提供过滤

这个特性旨在提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入。

PHP 7引入了过滤的unserialize()函数,以便在对不可信数据上的对象进行反序列化时提供更好的安全性。它可以防止可能的代码注入,并使开发人员能够对可以反序列化的类进行白名单。

//将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]);
//将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
//默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);

(9)IntlChar

在PHP7中,增加了一个新的IntlChar类,它试图揭示额外的ICU功能。这个类定义了一些静态方法和常量,可以用来处理Unicode字符。在使用这个类之前,你需要安装Intl扩展。

(10)新增2个随机数函数

在PHP 7中,引入了两个新的函数来以跨平台的方式生成密码安全的整数和字符串。

random_bytes()-生成密码安全的伪随机字节

random_int()-生成密码安全的伪随机整数

$bytes = random_bytes(5);
print(bin2hex($bytes));//输出54cc305593
print(random_int(100, 999));//输出614
print(random_int(-1000, 0));//输出-882

(11)use使用声明

从PHP7开始,可以使用单个use语句从相同的命名空间导入类,函数和常量,而不是使用多个use语句

//Before PHP 7
use com\tutorialspoint\ClassA;
use com\tutorialspoint\ClassB;
use com\tutorialspoint\ClassC as C;
use function com\tutorialspoint\fn_a;
use function com\tutorialspoint\fn_b;
use function com\tutorialspoint\fn_c;
use const com\tutorialspoint\ConstA;
use const com\tutorialspoint\ConstB;
use const com\tutorialspoint\ConstC;
//PHP 7+ code
use com\tutorialspoint\{ClassA, ClassB, ClassC as C};
use function com\tutorialspoint\{fn_a, fn_b, fn_c};
use const com\tutorialspoint\{ConstA, ConstB, ConstC};

(12)引入整数除法函数intdiv()

PHP7引入了一个新的函数intdiv(),它对它的操作数进行整数除法,并将除法运算返回为int。

$value = intdiv(10,3);
print($value);//打印3

(13)会话选项

session_start()可以接受一个array作为参数,用来覆盖 php.ini 文件中设置的 会话配置选项。

在调用 session_start()的时候,传入的选项参数中也支持session.lazy_write 行为,默认情况下这个配置项是打开的。它的作用是控制PHP只有在会话中的数据发生变化的时候才写入会话存储文件,如果会话中的数据没有发生改变,那么PHP会在读取完会话数据之后, 立即关闭会话存储文件,不做任何修改,可以通过设置read_and_close来实现。

例如,下列代码设置 session.cache_limiter 为 private,并且在读取完毕会话数据之后马上关闭会话存储文件。

session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);

(14)错误处理

从PHP7开始,错误处理和报告已经改变。而不是通过PHP5使用的传统错误报告机制来报告错误,现在大多数错误都是通过抛出错误异常来处理的。与异常类似,这些错误异常会一直冒泡,直到它们到达第一个匹配的catch块。如果没有匹配的块,则使用set_exception_handler()安装的默认异常处理程序将被调用。如果没有默认的异常处理程序,那么异常将被转换为致命错误,并将像传统的错误一样处理。

由于错误层次结构不是从Exception扩展的,所以使用catch(Exception $e){...}块来处理PHP5中未捕获的异常的代码将不会处理这样的错误。catch(Error $e){...}块或set_exception_handler()处理程序是处理致命错误所必需的。

Note: This article is reproduced from syh, reproduced in the purpose of passing more information, does not mean that this network agrees with its view and responsible for its authenticity. If there is infringement, please contact us, we will promptly delete.
Last news

Comments

You need to log in before you can comment Login | Register immediately