升级遗留PHP代码 - 这些表达式是否相同?

时间:2014-06-16 05:56:46

标签: php

我目前的任务是升级PHP5之前的代码库以符合现代运行时。

该库包含以下模式的几种用法:

$foo = new foo();
foreach($foo as &$ref) {
    // Do something with $ref
}

根据PHP文档,从PHP 5.2开始这是非法的,并且会引发异常(http://php.net/manual/en/migration52.error-messages.php

我的问题是,如何在符合PHP 5.2+标准的情况下更改语法以保持相同的功能?如果我只是删除&符号就足够了吗?

$foo = new foo();
foreach($foo as $ref) {
    // Do something with $ref
}

2 个答案:

答案 0 :(得分:3)

对于iterating through an object and its properties并修改原始对象,您可以像这样使用foreach()

 // Iterate over the object $foo
 foreach ($foo as $key => $ref) {

   // Some operation
   $newRef = $ref;

   // Change the original object
   $foo->$key = $newRef;
   }

这将允许您仅对可见属性进行迭代(通常需要)。但是,由于您要将代码迁移到OOP中,因此可能需要将抽象放在不同的级别。上面的代码适用于数组,但在OOP中这更为正常。同样,这取决于案例:

// Create the object
$foo = new foo();

// Delegate the iteration to the inner method
$foo->performAction();

这使得调用performAction()的代码不需要知道foo()的属性,让对象处理其属性。为什么房子需要知道门的旋钮?那是门的责任。

答案 1 :(得分:-1)

如果$foo仅包含数组或标量值。做

foreach($foo as $key => $ref) { // Do something with $ref $foo->{$key} = $ref; }