PHP 7 详解
  • 介绍
  • PHP 7 安装
  • PHP 7.0.x 新特性
    • OOP 特性
      • 类型声明
      • 命名空间与use关键词批量声明
      • 匿名类
      • Throwable 接口
    • 新增操作符
      • 太空飞船操作符(<=>)
      • null 合并运算符(??)
    • 统一变量语法
    • 其他特性和变更
      • 常量数组
      • Switch 中的多个default默认值
      • Session_start 函数中的参数数组
      • Unserialize 函数引入过滤器
      • 整数除法函数 intdiv()
      • 补充*其他特性和变更
    • 补充*新函数
    • 补充*新的全局常量
    • 补充*变更的函数
    • 补充*摒弃一些老式的写法
    • 补充*不向后兼容的变更
    • 补充*在SAPI模块的变化
    • 补充*PHP7底层性能优化
  • PHP 7.1.x 新特性
    • 新特性
      • 可为空(Nullable)类型
      • 对称阵列解构
      • Void 函数
      • 类常量访问权限控制
      • 多异常捕获处理
      • list()现在支持键名
      • 支持为负的字符串偏移量
      • 补充*其他特性与变更
    • 补充*新的函数
    • 补充*新增的全局常量
    • 补充:不向后兼容的变更
    • 补充*废弃的特性
    • 补充*变更的函数
    • 补充*其他的变更
  • PHP7 开发工具
    • Eclipse 安装与配置
  • PHP 标准规范及开发技巧
    • PHP 标准规范 - PSR
    • PHP 开发技巧
    • 面向对象编程的基本原则
  • PHP7调试与性能分析
    • 调试 - Xdebug安装配置
      • 使用Eclipse调试
    • 性能分析 - Xhprof
    • 性能分析 - Vld
  • 附录*Ubuntu环境php开发配置
  • 附录*使用php开发扩展
  • 附录*浏览器插件
  • 附录*第三方类库
  • 附录*小问题整理
  • 附录*资料*工具
  • 附录*Composer
  • 附录*前端
  • 附录*进程
  • 附录*PHP的ticks机制
  • 附录* 通过composer发布自己的包
  • 附录*字符编码问题
  • 附录*注释
Powered by GitBook
On this page
  • 总结:
  • 间接调用的表达式的新旧解析顺序

Was this helpful?

  1. PHP 7.0.x 新特性

统一变量语法

我们有可能会遇到这种情况:方法、变量、类名等会被保存在某个变量里,例如如下代码:

$objects['class']->name

$objects['class']先会被解析,之后name属性被解析,由左到右。

新的情况,代码如下:

$first = ['name'] => 'revin'];
$revin = 'xiaoxiami';

echo $$first['name'];

PHP5.X版本中,代码会正常运行,并且输出xiaoxiami。解析的过程不是按照如第一个例子那样从左到右解析的原则,在PHP7中,会产生一个Notice级别的错误。为了避免解析混淆,PHP7 引入了统一变量语法。

echo ${$first['name']};

再举一个栗子:

class Info
{
    public $title = 'PHP 7';
    public $description = 'PHP 7 descriptions';

    public function geTitle() : string
    {
        return $this->title;
    }

    public function getDescription() : string
    {
        return $this->description;
    }
}

$methods = ['title' => 'geTitle', 'description' => 'getDescription'];
$object = new Info();

echo 'Info ' . $object->$methods['title']() . ' description : ' . $object->$methods['description']();

PHP5.X版本中,代码会正常运行,但是在PHP7中最后一行会先解析$object->$methods,之后才会尝试解析['title']等,这样并不是我们想要达到的解析预期。所以想要在PHP7中成功运行,则最后echo输出行修改为:

echo 'Info ' . $object->{$methods['title']}() . ' description : ' . $object->{$methods['description']}();

总结:

PHP7 中 对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析,而不是之前的混杂着几个特殊案例的情况。 下面这张表说明了这个解析顺序的变化。

间接调用的表达式的新旧解析顺序

表达式

PHP 5 的解析方式

PHP 7 的解析方式

$$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 7.x的前向兼容性,又保持了与PHP 5.x的后向兼容性。

Previousnull 合并运算符(??)Next其他特性和变更

Last updated 5 years ago

Was this helpful?