小编说:PHP 7具有很多用于编写高性能、高效代码的新特性,同时也移除了一些历史版本中过时的特性,这些过时的特性如果在PHP 7中使用会触发一个Error错误。本文将向大家介绍PHP 7 同一变量语法。 本文选自《高性能PHP 7》。
我们常常会遇到这样的情况:方法、变量、类名等会被保存在某个变量里,例如下面这个例子。
$objects['class']->name;
在上面的代码中,$objects['class']会先被解析,之后name属性再被解析。就像代码顺序一样,通常由左至右被解析。
那么现在我们考虑一下如下情况。
$first = ['name' => 'second'];
$second = 'Howdy';echo $$first['name'];
在PHP 5.x版本中,这段代码会被顺利执行,并且输出Howdy。然而,这样的输出与前面看到的变量从左到右解析的原则产生了不一致。这是因为$first会优先被解析。那么,上面的代码解析情况就变成了{
echo ${$first['name']};
来看另外一个例子。
class Packt
{
public $title = 'PHP 7';
public $publisher = 'Packt Publisher';
public function getTitle() : string
{
return $this->title;
} public function getPublisher() : string
{
return $this->publisher;
}
}
$mthods = ['title' => 'getTitle', 'publisher' => 'getPublisher'];
$object = new Packt();
echo 'Book '.$object->$methods['title']().
' is published by '.$object->$methods['publisher']();
上面的代码在PHP 5.x版本中执行得很顺畅,并且会输出预期的结果。然而,在PHP 7环境下执行时,会产生Fatal级别错误。错误主要体现在最后一行,PHP 7会首先尝试解析object->
若想让这段代码在PHP 7中运行起来,需要做以下修改。
echo 'Book '.$object->{$methods['title']}().
' is published by '.$object->{$methods['publisher']}();
通过修改代码,我们就可以在PHP 7环境下得到预期的结果了。