浅析PHP7新功能及语法变化总结(2)

<?php //PHP7之前 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP7之后 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC}; ?>

intdiv()

接收两个参数作为被除数和除数,返回他们相除结果的整数部分。

<?php var_dump(intdiv(7, 2));

输出int(3)

CSPRNG

新增两个函数: random_bytes() and random_int().可以加密的生产被保护的整数和字符串。我这蹩脚的翻译,总之随机数变得安全了。

random_bytes — 加密生存被保护的伪随机字符串

random_int —加密生存被保护的伪随机整数

preg_replace_callback_array()

新增了一个函数preg_replace_callback_array(),使用该函数可以使得在使用preg_replace_callback()函数时代码变得更加优雅。在PHP7之前,回调函数会调用每一个正则表达式,回调函数在部分分支上是被污染了。

Session options

现在,session_start()函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项。

比如,把cache_limiter设置为私有的,同时在阅读完session后立即关闭

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

生成器的返回值

在PHP5.5引入生成器的概念。生成器函数每执行一次就得到一个yield标识的值。在PHP7中,当生成器迭代完成后,可以获取该生成器函数的返回值。通过Generator::getReturn()得到。

<?php function generator() { yield 1; yield 2; yield 3; return "a"; } $generatorClass = ("generator")(); foreach ($generatorClass as $val) { echo $val.” “; } echo $generatorClass->getReturn();

输出为:1 2 3 a

生成器中引入其他生成器

在生成器中可以引入另一个或几个生成器,只需要写yield from functionName1

<?php function generator1(){ yield 1; yield 2; yield from generator2(); yield from generator3(); } function generator2(){ yield 3; yield 4; } function generator3(){ yield 5; yield 6; } foreach (generator1() as $val){ echo $val, " "; }

输出:1 2 3 4 5 6

不兼容性

1、foreach不再改变内部数组指针

在PHP7之前,当数组通过 foreach 迭代时,数组指针会移动。现在开始,不再如此,见下面代码。

<?php $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); }

PHP5输出:

int(1)
int(2)
bool(false)

PHP7输出:

int(0)
int(0)
int(0)

2、foreach通过引用遍历时,有更好的迭代特性

当使用引用遍历数组时,现在 foreach 在迭代中能更好的跟踪变化。例如,在迭代中添加一个迭代值到数组中,参考下面的代码:

<?php $array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }

PHP5输出:

int(0)

PHP7输出:

int(0)
int(1)

3、十六进制字符串不再被认为是数字

含十六进制字符串不再被认为是数字

<?php var_dump("0x123" == "291"); var_dump(is_numeric("0x123")); var_dump("0xe" + "0x1"); var_dump(substr("foo", "0x1"));

PHP5输出:

bool(true)
bool(true)
int(15)
string(2) "oo"

PHP7输出:

bool(false)
bool(false)
int(0)
Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"

4、PHP7中被移除的函数

被移除的函数列表如下:

call_user_func() 和 call_user_func_array()从PHP 4.1.0开始被废弃。

已废弃的 mcrypt_generic_end() 函数已被移除,请使用mcrypt_generic_deinit()代替。

已废弃的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函数已被移除。

set_magic_quotes_runtime(), 和它的别名 magic_quotes_runtime()已被移除. 它们在PHP 5.3.0中已经被废弃,并且 在in PHP 5.4.0也由于魔术引号的废弃而失去功能。

已废弃的 set_socket_blocking() 函数已被移除,请使用stream_set_blocking()代替。

dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。

GD库中下列函数被移除:imagepsbbox()、imagepsencodefont()、imagepsextendfont()、imagepsfreefont()、imagepsloadfont()、imagepsslantfont()、imagepstext()

在配置文件php.ini中,always_populate_raw_post_data、asp_tags、xsl.security_prefs被移除了。

5、new 操作符创建的对象不能以引用方式赋值给变量

new 操作符创建的对象不能以引用方式赋值给变量

<?php class C {} $c =& new C;

PHP5输出:

Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3

PHP7输出:

Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3

6、移除了 ASP 和 script PHP 标签

使用类似 ASP 的标签,以及 script 标签来区分 PHP 代码的方式被移除。 受到影响的标签有:<% %>、<%= %>、<script language="php"> </script>

7、从不匹配的上下文发起调用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a87c6a43963768da729a49488004ffe8.html