资讯专栏INFORMATION COLUMN

PHP 7 修改了什么呢 --1

svtter / 695人阅读

摘要:此版本被认为是在年发布后最重要的变化。标量类型声明有两种选择强制强制性是默认模式,不需要指定。严格严格模式有明确的暗示。

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

示例 - 强制模式

// Coercive mode
function sum(int ...$ints)
{
return array_sum($ints);
}

print(sum(2, "3", 4.1));
?>

浏览器将产生以下输出 -

9

示例 - 严格模式

// 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

示例 - 有效的返回类型

declare(strict_types=1);

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

print(returnIntValue(5));
?>

浏览器将产生以下输出-

5

示例 - 无效的返回类型

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 空合并运算符返回它的第一个操作数;否则返回第二个操作数。
示例

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

print($username);
print("
");

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

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

print($username);
?>

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

not passed
not passed
not passed

PHP7飞船操作符

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

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

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

0
-1
1

0
-1
1

0
-1
1

PHP7 - 常量数组

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

//define a array using define function
define("animals", [
"dog",
"cat",
"bird"
]);

print(animals[1]);
?>

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

cat

PHP7 - 匿名类

PHP7 - 匿名类

匿名类现在可以使用 new class 来定义。匿名类可以使用来代替完整的类定义。
示例

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之前版本

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+

class A {
private $x = 1;
}

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

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

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

1

PHP7- 过滤unserialize()

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

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("
");
print($data2->obj2prop);
?>

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

1
2

PHP7 - 国际字符

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

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将被抛出
如果给出字节长度无效,错误将被抛出

示例

$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 时,错误将被抛出

示例

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

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

614
-882

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26238.html

相关文章

  • PHP 7 修改什么 -- 2

    摘要:风格的构造函数式构造函数,它与类的名称相同,因为它们是在所定义类的方法,现在已过时,并且将在未来被移除。如果的构造仅仅是一个类中定义构造函数,将发出。类实现构造函数方法不受影响。 PHP7 - use语句 从PHP7起,单次使用 use 语句可以用来从同一个命名空间导入类,函数和常量(而不用多次使用 use 语句)。示例 PHP7 - 错误处理 从PHP7,错误处理和报告已经改变。P...

    leeon 评论0 收藏0
  • PHP问题定位】修改数据库字段导致的fpm的coredump问题定位

    摘要:顺风车运营研发团队黄桃背景线上零星会出现进程及进程占用内存超过限制等报警告,并且两者报警的时间上往往都比较接近,如下原因分析时间上接近,那么出现两者报警的原因有可能是相同的,登录机器调试生成文件 顺风车运营研发团队 黄桃 背景 线上零星会出现fpm进程coredump 及 fpm进程占用内存超过限制等报警告,并且两者报警的时间上往往都比较接近,如下: showImg(https://...

    ASCH 评论0 收藏0
  • Python 实现图书超期提醒小帮手(修改版)

    摘要:前期工作准备得差不多了,开始找这个的提交部分的内容了,我们从登录页面应该也可以知道我们需要提交学号密码验证码这三个。差点忘了把发送邮件的截图发出来 一、实现目的 本来就很喜欢逛图书馆,时不时去借本书(注:借的都没看过),但我这个学期突然发现了问题,每本书都可以借两个月,但不幸的是我最近一学期借的书全部超期,一天一毛钱,我心疼这钱啊!!!灵机一动,为什么不写个脚本来通知自己图书超期呢?说...

    susheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<