使用 PHP 7 的类中的变量变量
Posted
技术标签:
【中文标题】使用 PHP 7 的类中的变量变量【英文标题】:Variable variables in classes using PHP 7 【发布时间】:2018-07-26 00:32:40 【问题描述】:实际上,我正在将一个更大的项目从 php 5.3.3 迁移到 PHP 7.1.13。在旧版本的 PHP 中,可以编写以下访问变量变量的代码:
class MyClass ;
$myVar = array("hello","world");
$myClass = new MyClass();
$myClass->$myVar[0] = "test 0"; // sets "test 0" to $myClass->hello
$myClass->$myVar[1] = "test 1"; // sets "test 1" to $myClass->world
print_r($myClass);
这表明:
MyClass Object
(
[hello] => test 0
[world] => test 1
)
在 PHP 7 中使用相同的代码:
MyClass Object
(
[Array] => Array
(
[0] => test 0
[1] => test 1
)
)
在 PHP 7 中我发现,我必须使用这种方式来获得相同的结果:
$myClass->$myVar[0] = "test 0";
$myClass->$myVar[1] = "test 1";
我在文档中发现 php5 和 php7 以不同的方式解释这一点:http://php.net/manual/en/migration70.incompatible.php#migration70.incompatible.variable-handling.indirect
是否有机会保留旧代码,或者我必须重新编码它的每一个外观?也许一些 php.ini 设置或类似的东西?你有什么想法吗?
【问题讨论】:
你应该解决你的 PHP 问题而不是规避它们。 @Scriptman:这将是最好的方法,但我只需要一些快速和肮脏的... 【参考方案1】:恐怕不会,因为您已经发现 PHP7 对这个表达式的解释与 PHP5 不同。手册明确说明
必须重写使用旧的从右到左评估顺序的代码,以显式使用带有花括号的评估顺序
所以你必须替换所有的
$foo->$bar['baz']
有
$foo->$bar['baz']
【讨论】:
是的 - 我接受这个作为正确答案,因为似乎没有解决方法。我浏览了源代码并修复了(希望是所有的)外观。【参考方案2】:这适用于所有版本的php
<?php
class MyClass ;
$myVar = array("hello","world");
$myClass = new MyClass();
$myClass->$myVar[0] = "test 0"; // sets "test 0" to $myClass->hello
$myClass->$myVar[1] = "test 1"; // sets "test 1" to $myClass->world
print_r($myClass);
【讨论】:
是的,我知道这一点,但我想在不更改任何代码行的情况下解决此问题。以上是关于使用 PHP 7 的类中的变量变量的主要内容,如果未能解决你的问题,请参考以下文章