当前位置: 首页 > news >正文

北京南站北京市朝阳区最新消息

北京南站,北京市朝阳区最新消息,公司做网站比较好,广州企业网站模板建站本文分析了PHP7新特性之抽象语法树(AST)带来的变化。分享给大家供大家参考#xff0c;具体如下#xff1a;这里大部分内容参照 AST 的 RFC 文档而成#xff1a;https://wiki.php.net/rfc/abstractsyntaxtree#xff0c;为了易于理解从源文档中节选部分进行介绍。本文并不会…本文分析了PHP7新特性之抽象语法树(AST)带来的变化。分享给大家供大家参考具体如下这里大部分内容参照 AST 的 RFC 文档而成https://wiki.php.net/rfc/abstractsyntaxtree为了易于理解从源文档中节选部分进行介绍。本文并不会告诉你抽象语法树是什么这需要你自己去了解这里只是描述 AST 给 PHP 带来的一些变化。新的执行过程PHP7 的内核中有一个重要的变化是加入了 AST。在 PHP5中从 php 脚本到 opcodes 的执行的过程是Lexing词法扫描分析将源文件转换成 token 流Parsing语法分析在此阶段生成 op arrays。PHP7 中在语法分析阶段不再直接生成 op arrays而是先生成 AST所以过程多了一步Lexing词法扫描分析将源文件转换成 token 流Parsing语法分析从 token 流生成抽象语法树Compilation从抽象语法树生成 op arrays。执行时间和内存消耗从以上的步骤来看这比之前的过程还多了一步所以按常理来说这反而会增加程序的执行时间和内存的使用。但事实上内存的使用确实增加了但是执行时间上却有所降低。以下结果是使用小(代码大约 100 行)、中(大约 700 行)、大(大约 2800 行)三个脚本分别进行测试得到的测试脚本 https://gist.github.com/nikic/289b0c7538b46c2220bc.每个文件编译 100 次的执行时间(注意文章的测试结果时间是 14 年PHP7 还叫 PHP-NG 的时候)php-ng php-ast diffSMALL 0.180s 0.160s -12.5%MEDIUM 1.492s 1.268s -17.7%LARGE 6.703s 5.736s -16.9%单次编译中的内存峰值php-ng php-ast diffSMALL 378kB 414kB 9.5%MEDIUM 507kB 643kB 26.8%LARGE 1084kB 1857kB 71.3%单次编译的测试结果可能并不能代表实际使用的情况以下是使用 PhpParser 进行完整项目测试得到的结果php-ng php-ast diffTIME 25.5ms 22.8ms -11.8%MEMORY 2360kB 2482kB 5.1%测试表明使用 AST 之后程序的执行时间整体上大概有 10% 到 15% 的提升但是内存消耗也有增加在大文件单次编译中增加明显但是在整个项目执行过程中并不是很严重的问题。还有注意的是以上的结果都是在没有 Opcache 的情况下生产环境中打开 Opcache 的情况下内存的消耗增加也不是很大的问题。语义上的改变如果仅仅是时间上的优化似乎也不是使用 AST 的充足理由。其实实现 AST 并不是基于时间优化上的考虑而是为了解决语法上的问题。下面来看一下语义上的一些变化。yield 不需要括号在 PHP5 的实现中如果在一个表达式上下文(例如在一个赋值表达式的右侧)中使用 yield你必须在 yield申明两边使用括号?php $result yield fn(); // 不合法的$result (yield fn()); // 合法的这种行为仅仅是因为 PHP5 的实现方式的限制在 PHP7 中括号不再是必须的了。所以下面这些写法也都是合法的?php $result yield;$result yield $v;$result yield $k $v;当然了还得遵循 yield 的应用场景才行。括号不影响行为在 PHP5 中($foo)[bar] baz 和 $foo[bar] baz 两个语句的含义不一样。事实上前一种写法是不合法的你会得到下面这样的错误?php ($foo)[bar] baz;# PHP Parse error: Syntax error, unexpected [ on line 1但是在 PHP7 中两种写法表示同样的意思。同样如果函数的参数被括号包裹类型检查存在问题在 PHP7 中这个问题也得到了解决?phpfunction func() { return [];}function byRef(array $a) {}byRef((func()));以上代码在 PHP5 中不会告警除非使用 byRef(func()) 的方式调用但是在 PHP7 中不管 func() 两边有没有括号都会产生以下错误PHP Strict standards:  Only variables should be passed by reference ...list() 的变化list 关键字的行为改变了很多。list 给变量赋值的顺序(等号左右同时的顺序)以前是从右至左现在是从左到右?phplist ($array[], $array[], $array[]) [1, 2, 3];var_dump($array);// PHP5: $array [3, 2, 1]// PHP7: $array [1, 2, 3]# 注意这里的左右的顺序指的是等号左右同时的顺序# list($a, $b) [1, 2] 这种使用中 $a 1, $b 2 是没有疑问的。产生上面变化的原因正是因为在 PHP5 的赋值过程中3 会最先被填入数组1 最后但是现在顺序改变了。同样的变化还有?php $a [1, 2];list($a, $b) $a;// PHP5: $a 1, $b 2// PHP7: $a 1, $b null Undefined index 1这是因为在以前的赋值过程中 $b 先得到 2然后 $a 的值才变成 1但是现在 $a 先变成了 1不再是数组所以 $b 就成了 null。list 现在只会访问每个偏移量一次?phplist (list($a, $b)) $array;// PHP5:$b $array[0][1];$a $array[0][0];// PHP7:// 会产生一个中间变量得到 $array[0] 的值$_tmp $array[0];$a $_tmp[0];$b $_tmp[1];空的 list 成员现在是全部禁止的以前只是在某些情况下?phplist () $a; // 不合法list($b, list()) $a; // 不合法foreach ($a as list()) // 不合法 (PHP5 中也不合法)引用赋值的顺序引用赋值的顺序在 PHP5 中是从右到左的现在时从左到右?php $obj new stdClass;$obj-a $obj-b;$obj-b 1;var_dump($obj);// PHP5:object(stdClass)#1 (2) { [b] int(1) [a] int(1)}// PHP7:object(stdClass)#1 (2) { [a] int(1) [b] int(1)}__clone 方法可以直接调用现在可以直接使用 $obj-__clone() 的写法去调用 __clone 方法。__clone 是之前唯一一个被禁止直接调用的魔术方法之前你会得到一个这样的错误Fatal error: Cannot call __clone() method on objects - use clone $obj instead in ...变量语法一致性AST 也解决了一些语法一致性的问题这些问题是在另外一个 RFC 中被提出的https://wiki.php.net/rfc/uniform_variable_syntax.在新的实现上以前的一些语法表达的含义和现在有些不同具体的可以参照下面的表格Expression PHP5 PHP7$$foo[bar][baz] ${$foo[bar][baz]} ($$foo)[bar][baz]$foo-$bar[baz] $foo-{$bar[baz]} ($foo-$bar)[baz]$foo-$bar[baz]() $foo-{$bar[baz]}() ($foo-$bar)[baz]()Foo::$bar[baz]() Foo::{$bar[baz]}() (Foo::$bar)[baz]()整体上还是以前的顺序是从右到左现在从左到右同时也遵循括号不影响行为的原则。这些复杂的变量写法是在实际开发中需要注意的。更多关于PHP相关内容感兴趣的读者可查看本站专题《PHP扩展开发教程》、《php面向对象程序设计入门教程》、《phpmysql数据库操作入门教程》、《PHP网络编程技巧总结》及《php常见数据库操作技巧汇总》希望本文所述对大家PHP程序设计有所帮助。
http://www.yutouwan.com/news/442298/

相关文章:

  • 设备上哪个网站做外贸推广工商注册公司流程
  • 扬州手机网站建设商城类网站建设报价
  • 莱芜网站制作如何对现有的网站改版
  • 网站设置桌面快捷方式时尚网站设计案例
  • 公司网站建设入哪科目wordpress 挂码
  • 建投能源公司简介网站seo优化网站
  • 公司网站 cmspixso在线设计平台
  • 网站建设服务费交印花税吗开发网站的语言
  • 对电子商务网站建设的理解建站平台加盟
  • 创建网站超链接成都市建设相关网站
  • 企业网站建设验收成全视频免费观看在线看第6季动漫版
  • C 做的窗体怎么变成网站2022app分类排行
  • 营销型网站制作msgg做网站如何防止被骗
  • 儿童摄影网站模板百度站长工具链接提交
  • 黄山网站设计公司浙江省住建厅证书查询
  • 网站建设主要包括哪两个方面国内做网站的公司
  • 珠海seo网站建设织梦旅游网站模板
  • 南宁做网站的有几家网站建设 运维 管理
  • 外贸社交网站排名城乡建设管理局网站
  • 上海网站建设 迈中国世界排名前300的大学
  • 网站开发去哪里找工作wap网站系统
  • 如何建设国外的网站杭州住房和城乡建设厅官网
  • 网站发展趋势毕业设计题目怎么选题
  • 做门户网站起什么域名好外贸网站和内贸
  • 莱州相亲网站自己怎么制作企业网站
  • 攸县网站建设最好的线上编程培训机构
  • 江门城乡建设局官方网站音乐网站制作教程
  • 国外公司网站设计台州做网站是什么
  • 做网上招聘哪个网站好网站推广目的
  • 台州做微网站小制作小发明视频