PHP7标量类型声明详解:强制与严格模式的区别及set_exception_handler的注意事项
您可以使用字符串,整数(INT),浮动点号和bool来声明函数的参数类型和函数返回值。

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,小小野也可以将您带入微信技术小组,进行交流和学习!
获取以下视频教程