使用 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 的类中的变量变量的主要内容,如果未能解决你的问题,请参考以下文章

是否可以根据从 Swift 中的 UIViewController 继承的类中的另一个来初始化变量?

如何访问其子类中的类的私有变量?

在继承的类中使用私有变量 - Java

java 多态

java中的类和对象

类中的 PHP 全局变量范围