PHP7标量类型声明详解:强制与严格模式的区别及set_exception_handler的注意事项

您可以使用字符串,整数(INT),浮动点号和bool来声明函数的参数类型和函数返回值。

PHP7标量类型声明详解:强制与严格模式的区别及set_exception_handler的注意事项

declare(strict_types=1);
function add(int $a, int $b): int {
    return $a+$b;
}

echo add(1, 2);
echo add(1.5, 2.6);

PHP5无法执行上述代码。执行PHP7时,一个3和一个错误(参数1传递给add()必须是类型整数,float给出);

标量类型声明有两种模式:强制性(默认)和严格模式。

声明(strict_types = 1),必须放置在文件的第一行中,当前文件有效!

2.set_exception_handler()不再保证接收异常对象

在PHP 7中,许多致命错误和恢复的致命错误已转化为异常处理。这些异常是从错误类中继承的,该类别实现了可投掷接口(所有异常都实现了此基本接口)。

PHP7进一步促进了开发人员的处理,因此开发人员对该计划具有更强的控制权。因为默认情况下,错误将直接引起程序中断,而PHP7具有捕获和处理它的能力,允许程序继续执行,作为程序员作为程序员提供更灵活的选择。

3。添加了操作符号“”

语法:$ c = $ a $ b

如果$ a> $ b的值,$ c是1

如果$ a == $ b,则$ c的值为0

如果$ a <$ b的值,$ c为-1

4。添加了操作员“?”

如果存在变量并且值不为空,则它将返回其自身值,否则它将返回其第二个操作。

//原写法
$username = isset($_GET['user]) ? $_GET['user] : 'nobody';
//现在
$username = $_GET['user'] ?? 'nobody';

5.Define()定义常数数组

define('ARR',['a','b']);
echo ARR[1];// a

6.AST:抽象语法树,抽象语法树

作为PHP汇编过程的作用,作为中间件的角色,它取代了直接从解释器吐出OpCode的方式,以使解释器将解释器和化合物(Crumpler)解耦,从而可以减少一些黑客代码。同时,它使其更容易理解和维护。

php5:php code->解析器语法分析 - > opcode->执行

PHP7:PHP代码 - >解析器语法分析 - > ast-> opcode->执行

参考:

7。匿名函数

$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function

8.Unicode字符格式支持(Echo“ \ U {9999}”)

9. UnSerialize提供过滤特性

为了防止非法数据注入代码,它提供了更安全的导数数据。

10。命名空间报价优化

// PHP7以前语法的写法 
use FooLibrary\Bar\Baz\ClassA; 
use FooLibrary\Bar\Baz\ClassB; 

// PHP7新语法写法 
use FooLibrary\Bar\Baz\{ ClassA, ClassB};

PHP7带来的废除

1。废弃的扩张

EREG正则表达

MSSQL

mysql

sybase_ct

2。废弃的特征

不能使用同名的构造函数

实例方法无法用静态方法调用。

3。废物功能

方法调用 
call_user_method() 
call_user_method_array()

call_user_func()和call_func_array()应

加密相关功能

mcrypt_generic_end() 
mcrypt_ecb() 
mcrypt_cbc() 
mcrypt_cfb() 
mcrypt_ofb()

注意:PHP7.1之后,将删除MCRypt_*序列函数。推荐:OpenSSL序列函数

杂项

set_magic_quotes_runtime 
set_socket_blocking 
Split 
imagepsbbox() 
imagepsencodefont() 
imagepsextendfont() 
imagepsfreefont() 
imagepsloadfont() 
imagepsslantfont() 
imagepstext()

4。废物使用

$ http_raw_post_data变量已删除,并且使用php://输入用于替换

在INI文件中,不再在开始时支持评论,使用“;”; “

删除ASP格式的支持和脚本语法的支持:

PHP7带来的变化

1。弦处理机制修改

含有十六进制字符的字符串不再视为数字, 也不再区别对待.
var_dump("0x123" == "291"); // false
var_dump(is_numeric("0x123")); // false
var_dump("0xe" + "0x1"); // 0
var_dump(substr("f00", "0x1")) // foo

2。修改整数处理机制

INT64支持,在不同平台下均匀地塑料长度,弦和文件上传支持大于2GB。 64 -bit Php7字符串长度可以超过2^31字节字节。

// 无效的八进制数字(包含大于7的数字)会报编译错误
$i = 0681; // 老版本php会把无效数字忽略。

// 位移负的位置会产生异常
var_dump(1 >> -1);

// 左位移超出位数则返回0
var_dump(1 << 64);// 0 

// 右位移超出会返回0或者-1
var_dump(100 >> 32);// 0 
var_dump(-100 >> 32);// -1 

3。修改参数处理机制

不支持重复参数命名

functionFunc(a,a,b,c,c,c){}; HUI错误

func_get_arg()和func_get_args()这两个方法返回参数当前的值, 而不是传入时的值, 当前的值有可能会被修改

因此,应注意的是,最好将其记录在功能的第一行中,否则,如果将来进行修改,则不会是传递的初始值。

function foo($x) {
    $x++;
    echo func_get_arg(0);
}
foo(1); //返回2

4。进行修改

foreach()循环对数组内部指针不再起作用

$arr = [1,2,3];
foreach ($arr as &$val) {
    echo current($arr);// php7 全返回0
}

当值按值执行值时,foreach是数组的复制操作

$arr = [1,2,3];
foreach ($arr as $val) {
    unset($arr[1]);
}
var_dump($arr);

最新的PHP7仍将打印[1,2,3]。 (PS:7.0.0否)

旧的会打印出[1,3]

根据参考,循环时,阵列的修改将影响周期

$arr = [1];
foreach ($arr as $val) {
    var_dump($val);
    $arr[1]=2;
}

最新的PHP7仍将添加新元素的周期。 (PS:7.0.0否)

5。列表修改

不再以相反的顺序分配值

//$arr将会是[1,2,3]而不是之前的[3,2,1]
list($arr[], $arr[], $arr[]) = [1,2,3];

不再支持字符串拆分功能

// $x = null 并且 $y = null
$str = 'xy';
list($x, $y) = $str;

空列表()分配不再允许

list() = [123];r;

List()现在适用于数组对象

list($a, $b) = (object)new ArrayObject([0, 1]);

6。可变处理机制修改

现在,变量,属性和方法的间接调用严格遵循从左到右的顺序,而不是以前的情况混合了几种特殊情况。下表说明了此分析顺序的变化。

引用分配时自动创建的数字或对象属性的序列不同

$arr = [];
$arr['a'] = &$arr['b'];
$arr['b'] = 1;
// php7: ['a' => 1, 'b' => 1]
// php5: ['b' => 1, 'a' => 1]

7。其他

1.debug_zval_dump()现在打印“ int”而不是“长”,打印“ float”而不是“ double”

2。dirname()添加了可选的第二个参数,深度,并获取当前目录深度 - 级级别目录的名称。

3.GetRusage()现在支持Windows.MKTime()和GMMKTime()函数不再接受IS_DST参数。

4.preg_replace()函数不再支持“ \ e”(preg_replace_eval)。应该用Preg_replace_callback()代替。

5.ETLOCALE()功能不再接受字符串中的类别。 LC_*应使用常数。

6.exec(),system()和passThru()函数为null添加了保护。

7.shmop_open()现在返回资源而不是int。可以将此资源传递给shmop_size(),shmop_write(),shmop_read(),shmop_close()和shmop_delete()。

8。为了避免内存泄漏,xml_set_object()现在需要在执行结束时手动删除$ parse。

9.curl_setopt设置项目curlopt_safe_upload

true disables@ t在curlopt_postfields中发送文件。这意味着@可以在现场安全使用。可以用卷发替换为替代品。

添加到PHP 5.5.0,默认值false。 php 5.6.0的默认值是正确的。 php 7删除此选项,必须由卷发接口上传。

如何全面发挥PHP7的表现

1。打开opcache

zend_extension=opcache.so 
opcache.enable=1 
opcache.enable_cli=1

2。用GCC 4.8编译

只有GCC 4.8或更高的PHP将为Opline和Execute_Data打开全局寄存器,这将带来约5%的性能改进(QPS角度测量WordPres)

3。打开大型页面(根据系统记忆决策)

4。PGO(配置文件指导优化)

第一次汇编成功后,使用项目代码训练PHP,这将生成一些个人资料信息。最后,基于此信息,第二个GCC编译PHP可以裁缝-Made PHP7

以上是文章的所有内容。那些有学习和经验的人可以增加小小比作为朋友。如果您有技术问题,则可以一起讨论和交流。如果您是PHP,小小野也可以将您带入微信技术小组,进行交流和学习!

获取以下视频教程

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

53阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

45阅读

php一句话木马,一句话木马ctf

2026年10月05日

48阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

50阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

47阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读