【问题标题】:Upgrading legacy PHP code - are these expressions equivalent?升级遗留 PHP 代码 - 这些表达式是否等效?
【发布时间】:2014-08-05 21:42:19
【问题描述】:

我目前的任务是升级 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
}

【问题讨论】:

  • $foo数组中保存了哪些类型的元素?
  • 任何可以迭代的对象 (php.net/manual/en/language.oop5.iterations.php)。
  • 但是,由于所有这些代码都是 PHP5 之前的代码,是的,它当然只包含数组。我的错。
  • 请注意,这段代码一般没有错;您似乎提到的错误仅适用于实现 iterators 的对象。普通对象应该仍然可以通过引用进行迭代。我认为这通常是一个糟糕的模式,你应该使用 getter 和 setter。

标签: php


【解决方案1】:

对于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() 的属性,让对象来处理它的属性。为什么房子需要知道门把手?这就是门的责任。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2017-06-11
      • 2023-04-04
      相关资源
      最近更新 更多