PHP5-7 结合文档 可能会使用到的新特性 个人总结
发布时间:2022-08-03 10:54:56 所属栏目:PHP教程 来源:互联网
导读:PHP 5-7: 1.改进的性能 - PHPNG代码合并在PHP7中,这是比 PHP5快两倍 - 待展开 2.降低内存消耗 - 优化后PHP7使用较少的资源 - 待展开 //PHP7使用新的 Zend Engine 3.0 提高应用程序性能两倍,比PHP5.6 低了 50% 的内存消耗。 它可以服务于更多的并发用户,
PHP 5-7: 1.改进的性能 - PHPNG代码合并在PHP7中,这是比 PHP5快两倍 - 待展开 2.降低内存消耗 - 优化后PHP7使用较少的资源 - 待展开 //PHP7使用新的 Zend Engine 3.0 提高应用程序性能两倍,比PHP5.6 低了 50% 的内存消耗。 它可以服务于更多的并发用户,无需任何额外的硬件。 /** 在执行的Magento事务相比PHP5.6,PHP7要快两倍 在执行 Drupal 事务相比PHP5.6,PHP7证明快两倍 PHP7 证明自己比 PHP5.6 快两倍,因为在执行 WordPress 事务相比 */ 3.标量类型声明 - 现在,参数和返回值类型可以被强制执行(强类型语言) /** 支持(string,int,float,bool,interfaces,array,callable,类名) - 7.1新增 Nullable,void,iterable(与callable类似,实现了Traversavle接口的对象) - 7.2新增 object(可用于逆变(contravariant)参数输入和协变(covariant)返回任何对象类型) - 7.4支持在类的属性中添加指定类型。 ps: 不支持别名,例如boolean,integer。 callable可理解为可被调用的函数。(可用is_callable()验证,相对的有callback的概念。) */ // Coercive mode 强制模式 (默认) function sumOfInts(int ...$ints) //标量类型声明 int型 { return array_sum($ints); } var_dump(sumOfInts(2, '3', 4.1)); //int(9) function arraysSum(array ...$arrays): array //返回值类型声明 数组型 { return array_map(function(array $array): int { return array_sum($array); }, $arrays); } print_r(arraysSum([1,2,3], [4,5,6], [7,8,9])); //Array([0]=>6[1]=>15[2]=>24) declare (strict_types = 1); //开启严格模式,检查参数的类型,不一致会报错 //可为空(Nullable)类型(PHP7.1) //参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。 function testReturn(): ?string {} //Void 函数(PHP7.1) //一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,null 不是一个合法的返回值。 function swap(&$left, &$right) : void {} //7.4 有限返回类型协变与参数类型逆变 继承关系 class A {} class B extends A {} class Producer { public function method(): A {} } class ChildProducer extends Producer { public function method(): B {} } 4.一致性的64位支持 - 64位架构机器持续支持 phpinfo(); //Architecture //32 位 PHP 是 4Bytes,而 64位 PHP 是 8Bytes if (PHP_INT_SIZE == 4) { $bit = 32; } else { $bit = 64; } 5.1.改进异常层次结构 - 异常层次结构得到改善; PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。 Error 类并非继承自 Exception 类,所以不能用 catch (Exception e)...来捕获Error。你可以用catch(Errore) { … },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。 /** 异常层次结构 Throwable Error ArithmeticError DivisionByZeroError AssertionError ParseError TypeError Exception */ 5.2.许多致命错误转换成异常 - 异常的范围增大覆盖为许多致命的错误转化异常 (5,6)php5.6.x到PHP7.0.x 不向后兼容的变更 <?php //set_exception_handler() 不再保证收到的一定是 Exception 对象 // PHP 5 时代的代码将会出现问题 function handler(Exception $e) { ... } set_exception_handler('handler'); // 兼容 PHP 5 和 7 function handler($e) { ... } // 仅支持 PHP 7 function handler(Throwable $e) { ... } ?> //E_STRICT 警告级别变更 场景 新的级别/行为 抽象静态方法 不再警告,会引发错误 重复定义构造器函数 不再警告,会引发错误 在继承的时候,方法签名不匹配 E_WARNING 在两个 trait 中包含相同的(兼容的)属性 不再警告,会引发错误 以非静态调用的方式访问静态属性 E_NOTICE 变量应该以引用的方式赋值 E_NOTICE 变量应该以引用的方式传递 E_NOTICE 以静态方式调用实例方法 E_DEPRECATED 6.已过时的API和扩展删除 - 不同的旧的和不支持的应用程序和扩展,从最新的版本中删除 函数 /** call_user_method(),call)_user_method_array() 所有ereg*函数 mcrypt别名 所有ext/mysql函数 intl别名 ...... */ INI /** always_populate_raw_post_data asp_tags */ 7.数组,循环等处理改变 /** 修复list()倒序赋值(仅影响数组) 修复数组的生成顺序 函数参数附近的括号不再影响行为(一些不允许的函数嵌套行为,5里可以用()处理,7修复了) 修复foreach更改内部指针的问题 foreach 通过值遍历时,操作的值为数组的副本(无&,对$arr的修改,不会在使用$v时触发,例如unset($arr[0])后,$arr[0]代表的那个$v仍能被正常使用 ? 5是否也这样待测试) foreach通过引用遍历时,有更好的迭代特性(在迭代中能更好的跟踪变化) */ //修复list()倒序赋值(仅影响数组) list($a[], $a[], $a[]) = [1, 2, 3]; var_dump($a); //5 => 3,2,1 //7 => 1,2,3 //修复数组的生成顺序 $array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array); //5 => ["b"=>&int(1),"a"=>&int(1)] //7 => ["a"=>&int(1),"b"=>&int(1)] //函数参数附近的括号不再影响行为(一些不允许的函数嵌套行为,5里可以用()处理,7修复了) function getArray() { return [1, 2, 3]; } function squareArray(array &$a) { foreach ($a as &$v) { $v **= 2; } } // Generates a warning in PHP 7. squareArray((getArray())); //修复foreach更改内部指针的问题 $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); } //5 => 1,2,false //7 => 0,0,0 //foreach通过引用遍历时,有更好的迭代特性(在迭代中能更好的跟踪变化) $array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; } //5 => 0 //7 => 0,1 8.整形,字符串处理改变 INT /** 无效的8进制字符,现在会报错(8进制字符的无效数字,之前会被自动删节) 负位移运算,现在会报错 超范围后位移。之前会溢出(原文:这一操作是结构依赖的),现在会始终得到0。 除以0的变化 */ //除以0的变化 //除法运算符 (/) 会返回一个由 IEEE 754 指定的浮点数:+INF, -INF 或 NAN。取模操作符 (%) 则会抛出一个 DivisionByZeroError 异常,并且不再产生 E_WARNING 错误 var_dump(3/0); var_dump(0/0); var_dump(0%0); //5 => false,false,false(三个warning) //7 => float(INF),float(NAN),Fatal error(前两个是warning) String /** 含十六进制字符串不再被认为是数字(filter_var() 函数可以用于检查一个 string 是否含有十六进制数字,并将其转换为integer。返回值为false或int) 支持unicode输出了,同时也导致对应字符串要慎用 - 'u{'。 */ //unicode输出 echo 'u{UNICODE_CODE}'; //输出对应的unicode字符 9.语法糖 //<=> (太空船操作符|组合比较符) $a <=> $b; // <:-1,=:0,>:1 //?? (null合并运算符) // Fetches the value of $_GET['user'] and returns 'nobody' // if it does not exist. $username = $_GET['user'] ?? 'nobody'; // This is equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; // Coalesces can be chained: this will return the first // defined value out of $_GET['user'], $_POST['user'], and // 'nobody'. $username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; //通过define定义常量数组(在 PHP5.6 中仅能通过 const 定义) define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat" //use语句 // Before PHP 7 use comweb3ClassA; use comweb3ClassB; use comweb3ClassC as C; use function comweb3fn_a; use function comweb3fn_b; use function comweb3fn_c; use const comweb3ConstA; use const comweb3ConstB; use const comweb3ConstC; // PHP 7+ code use comweb3{ClassA, ClassB, ClassC as C}; use function comweb3{fn_a, fn_b, fn_c}; use const comweb3{ConstA, ConstB, ConstC}; (编辑:甘孜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |