php⽤8好还是php7好,对⽐说明PHP7的优化提升
此篇张是我对PHP7跟PHP以前版本做的⼀个对⽐。
我们来看下PHP更新出来的各种版本:
⾸先先来说下PHP7带来的新东西
1.类型的声明。
可以使⽤字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (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);
返回结果:
在php-5.6.27版本及以前版本的返回结果为:
在php-7.0.12版本及以后版本的返回结果为:
php5是⽆法执⾏上⾯代码的,php7执⾏的时候会先输出⼀个3和⼀个报错( Argument 1 passed to add() must be of the type integer, float given);
标量类型声明 有两种模式: 强制 (默认) 和 严格模式。
declare(strict_types=1),必须放在⽂件的第⼀⾏执⾏代码,当前⽂件有效!
2.set_exception_handler() 不再保证收到的⼀定是 Exception 对象
在 PHP 7 中,很多致命错误以及可恢复的致命错误,都被转换为异常来处理了。 这些异常继承⾃ Error 类,此类实现了 Throwable 接⼝(所有异常都实现了这个基础接⼝)。
PHP7进⼀步⽅便开发者处理, 让开发者对程序的掌控能⼒更强. 因为在默认情况下, Error会直接导致程序中断, ⽽PHP7则提供捕获并且处理的能⼒, 让程序继续执⾏下去, 为程序员提供更灵活的选择。
3.新增操作符“<=>”
代码:$a=1;$b=1;
$a1=2;$b1=1;
$a2=1;$b2=2;
$c=$a<=>$b;
$c1=$a1<=>$b1;
$c2=$a2<=>$b2;
echo "当\$a=\$b的时候,\$的返回结果为:".$c.'
';
echo "当\$a1>\$b1的时候,\$的返回结果为:".$c1.'
';
echo "当\$a2';
结果:
在php-5.6.27版本及以前版本的返回结果为:
在php-7.0.12版本及以后版本的返回结果为:
语法:$c = $a <=> $b
如果$a > $b, $c 的值为1
如果$a == $b, $c 的值为0
如果$a < $b, $c 的值为-1
4.新增操作符“??”
如果变量存在且值不为NULL, 它就会返回⾃⾝的值,否则返回它的第⼆个操作数。
代码:$data['sex']='⼥';
php手机版下载
$data['sex2']='男';
//原写法
$sex1 = isset($data['sex']) ? $data['sex'] : '男';
$sex2 = isset($data['sex2']) ? $data['sex2'] : '男';
//现在
$sex3 = $data['sex'] ?? '男';
$sex4 = $data['sex2'] ?? '⼥';
//$_GET['sex']和$_GET['sex2']均未传值。
$sex5 = $_GET['sex'] ?? '男';
$sex6 = $_GET['sex2'] ?? '⼥';
echo '当获取到的参数为⼥时原写法返回结果为:'.$sex1." ";
echo '当获取到的参数为⼥时现写法返回结果为:'.$sex3." ";
echo '当获取到的参数为男时原写法返回结果为:'.$sex2." ";
echo '当获取到的参数为男时现写法返回结果为:'.$sex4." ";
echo '当获取到的参数为空时原写法返回结果为:'.$sex5." ";
echo '当获取到的参数为空时现写法返回结果为:'.$sex6." ";
结果:
在php-5.6.27版本及以前版本的返回结果为:
在php-7.0.12版本及以后版本的返回结果为:
操作符“??”在php7版本就相当于三⽬运算符的升级版。
5.define() 定义常量数组
代码:define('ARR',['a','b']);
echo ARR[1];// a
结果:
在php-5.6.27版本及以前版本的返回结果为:
在php-7.0.12版本及以后版本的返回结果为:
6.AST: Abstract Syntax Tree, 抽象语法树
AST在PHP编译过程作为⼀个中间件的⾓⾊, 替换原来直接从解释器吐出opcode的⽅式, 让解释器(parser)和编译器(compliler)解耦, 可以减少⼀些Hack代码, 同时, 让实现更容易理解和可维护.
PHP5 : PHP代码 -> Parser语法解析 -> OPCODE -> 执⾏
PHP7 : PHP代码 -> Parser语法解析 -> AST -> OPCODE -> 执⾏
7.匿名函数
代码:$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function
结果:
在php-5.2.17版本及以前版本的返回结果为:
在php-5.3.29版本及以后版本的返回结果为:
8.Unicode字符格式⽀持(echo “\u{9999}”)
代码:$anonymous_func = function(){return 'function';};
echo $anonymous_func(); // 输出function
结果:
在php-5.6.27版本及以前版本的返回结果为:
在php-7.0.12版本及以后版本的返回结果为:
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_user_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://input来代
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
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论