PHP7是什么鬼?
PHP7是PHP编程语言的一个主要版本,并号称是开发Web应用程序的一次革命,可开发和交付移动企业和云应用。此版本被认为是PHP在2004年发布PHP5后最重要的变化。
新功能
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));
?>
浏览器将产生以下输出 -
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。