PHP 7 修改了什么呢 --1

PHP7是什么鬼?

PHP7是PHP编程语言的一个主要版本,并号称是开发Web应用程序的一次革命,可开发和交付移动企业和云应用。此版本被认为是PHP在2004年发布PHP5后最重要的变化。php

新功能

PHP7有加入几十个功能,最显著的是下面提到 -编程

改进的性能 - PHPNG代码合并在PHP7中,这是比 PHP5快两倍;

下降内存消耗 - 优化后PHP7使用较少的资源;

标量类型声明 - 如今,参数和返回值类型能够被强制执行;

一致性的64位支持 - 64位架构机器持续支持;

改进异常层次结构 - 异常层次结构获得改善;

许多致命错误转换成异常 - 异常的范围增大覆盖为许多致命的错误转化异常;

安全随机数发生器 - 加入新的安全随机数生成器的API;

已过期的API和扩展删除 - 不一样的旧的和不支持的应用程序和扩展,从最新的版本中删除;
null合并运算符(??)的新空合并运算符被加入;
返回和标量类型声明支持返回类型和参数类型也被加入;
增长了对匿名匿名类的支持;
零成本声明支持零成本加入断言。

PHP7使用新的 Zend Engine 3.0 提升应用程序性能两倍,比PHP5.6 低了 50% 的内存消耗。 它能够服务于更多的并发用户,无需任何额外的硬件。考虑到当今的工做量 PHP7设计并重构。数组

PHP7 - 标量类型声明

在PHP7有一个新的功能,标量类型声明已被引入。标量类型声明有两种选择:浏览器

强制 - 强制性是默认模式,不须要指定。

严格 - 严格模式有明确的暗示。

如下几种类型的函数参数能够经过上述方式强制执行:安全

int

float

bool

string

interfaces

array

callable

示例 - 强制模式架构

<?php
// Coercive mode
function sum(int ...$ints)
{
return array_sum($ints);
}并发

print(sum(2, '3', 4.1));
?>app

浏览器将产生如下输出 -dom

9编程语言

示例 - 严格模式

<?php
// Strict mode
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, ..

PHP7 - 返回类型声明

在PHP7中有一个新的功能,已引入返回类型声明。返回类型声明指定一个函数的返回值类型。如下类型返回类型是能够声明的:

int

float

bool

string

interfaces

array

callable

示例 - 有效的返回类型

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
return $value;
}

print(returnIntValue(5));
?>

浏览器将产生如下输出-

5

示例 - 无效的返回类型

<?php
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

PHP7 - Null合并运算符

PHP7一个新的功能,空合并运算符(??)已经推出。它是用来与isset()函数函数一块儿替换三元操做。若是存在且不是 NULL 空合并运算符返回它的第一个操做数;不然返回第二个操做数。
示例

<?php
// fetch the value of $_GET['user'] and returns 'not passed'
// if username is not passed
$username = $_GET['username'] ?? 'not passed';

print($username);
print("<br/>");

// Equivalent code using ternary operator
$username = isset($_GET['username']) ? $_GET['username'] : 'not passed';

print($username);
print("<br/>");
// Chaining ?? operation
$username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';

print($username);
?>

这将在浏览器产生如下输出 -

not passed
not passed
not passed

PHP7飞船操做符

在PHP7中有一个新的功能-飞船操做符相继引入。它是用于比较两个表达式。当第一个表达式较第二个表达式分别小于,等于或大于时它分别返回-1,0或1。
示例

<?php
//integer comparison
print( 1 <=> 1);print("<br/>");
print( 1 <=> 2);print("<br/>");
print( 2 <=> 1);print("<br/>");
print("<br/>");
//float comparison
print( 1.5 <=> 1.5);print("<br/>");
print( 1.5 <=> 2.5);print("<br/>");
print( 2.5 <=> 1.5);print("<br/>");
print("<br/>");
//string comparison
print( "a" <=> "a");print("<br/>");
print( "a" <=> "b");print("<br/>");
print( "b" <=> "a");print("<br/>");
?>

这将在浏览器产生如下输出 -

0
-1
1

0
-1
1

0
-1
1

PHP7 - 常量数组

数组常量如今可使用 define() 函数定义。在PHP5.6中,它们只能使用const关键字定义。
示例

<?php
//define a array using define function
define('animals', [
'dog',
'cat',
'bird'
]);

print(animals[1]);
?>

这将在浏览器产生如下输出 -

cat

PHP7 - 匿名类

PHP7 - 匿名类

匿名类如今可使用 new class 来定义。匿名类可使用来代替完整的类定义。
示例

<?php
interface Logger {
public function log(string $msg);
}

class Application {
private $logger;

public function getLogger(): Logger {

return $this->logger;

}

public function setLogger(Logger $logger) {

$this->logger = $logger;

}
}

$app = new Application;
$app->setLogger(new class implements Logger {
public function log(string $msg) {

print($msg);

}
});

$app->getLogger()->log("My first Log Message");
?>

这将在浏览器产生如下输出 -

My first Log Message

PHP7 - Closure::call()

Closure::call() 方法加入到临时绑定(bindTo)的对象范围,以简便方式封闭和调用它 它相比绑定到PHP5.6性能更快。
示例 - PHP7以前版本

<?php
class A {
private $x = 1;
}

// Define a closure Pre PHP 7 code
$getValue = function() {
return $this->x;
};

// Bind a clousure
$value = $getValue->bindTo(new A, 'A');

print($value());
?>

这将在浏览器产生如下输出 -

1

示例-PHP7+

<?php
class A {
private $x = 1;
}

// PHP 7+ code, Define
$value = function() {
return $this->x;
};

print($value->call(new A));
?>

这将在浏览器产生如下输出 -

1

PHP7- 过滤unserialize()

PHP7引入了过滤 unserialize()函数以在反序列化不受信任的数据对象时提供更好的安全性。它能够防止可能的代码注入,使开发人员可以使用序列化白名单类。
示例

<?php
class MyClass1 {
public $obj1prop;
}
class MyClass2 {
public $obj2prop;
}

$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;

$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);

// default behaviour that accepts all classes
// second argument can be ommited.
// if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);

// converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);

print($data->obj1prop);
print("<br/>");
print($data2->obj2prop);
?>

这将在浏览器产生如下输出 -

1
2

PHP7 - 国际字符

在PHP7,新的 IntlChar 类添加其目的是公开更多的ICU功能。 这个类定义了许多可用于操纵Unicode字符的静态方法和常数。你须要在使用这个类以前安装 Intl 扩展。
示例

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
print (IntlChar::charName('@'));
print(IntlChar::ispunct('!'));
?>

这将在浏览器产生如下输出 -

10ffff
COMMERCIAL AT
true

PHP7 - CSPRNG

在PHP7,如下两个新的函数引入以产生一个跨平台的方式加密安全整数和字符串。

random_bytes() - 生成加密安全伪随机字节。

random_int() - 生成加密安全伪随机整数。

random_bytes()
random_bytes()适合于使用来生成密码,密码学随机的任意长度的字符串,如:生成 salt,密钥或初始向量。
语法

string random_bytes ( int $length )

参数

length - 返回随机串的字节长度

返回值

返回包含加密安全随机字节的请求数量的字符串。

错误/异常

若是没法找到随机性的适当源,将引起异常
若是给定参数无效,TypeError将被抛出
若是给出字节长度无效,错误将被抛出

示例

<?php
$bytes = random_bytes(5);
print(bin2hex($bytes));
?>

这将在浏览器产生如下输出 -

54cc305593

random_int()
random_int()产生适合于用于结果是很是重要的加密随机整数。
语法

int random_int ( int $min , int $max )

参数

min - 返回最小值,它必须是PHP_INT_MIN或更大的值

max - 返回最大值,它必须是小于或等于PHP_INT_MAX

返回值

返回最小值(min)到最大(max)的范围内,包括加密安全随机整数。

错误/异常

若是没法找到随机性一个适当的源,将引起异常
若是给定参数无效,TypeError 将被抛出
若是 max 小于 min 时,错误将被抛出

示例

<?php
print(random_int(100, 999));
print("
");
print(random_int(-1000, 0));
?>

这将在浏览器产生如下输出 -

614-882