【问题标题】:PhP variable declared in a loop and I would like to store it in a global arrayPhP 变量在循环中声明,我想将其存储在全局数组中
【发布时间】:2011-07-19 19:04:57
【问题描述】:

我是 PHP 新手,想就以下情况获得一些建议:

我有一个文件,我在其中解析一个 XML 文件。我的策略是创建一个“parser.php”文件。然后为 XML 文件中的每个标签创建单独的文件。这些单独的文件中的每一个都是一个类,在实例化时将存储该特定标签的所有属性。

我在解析器中有几个循环,它们在遇到标记时实例化与标记对应的类。循环完成后,该对象将被插入到全局数组中。

代码如下:

<?php
include ('class.Food.php');
include ('class.Drink.php');
$xml = simplexml_load_file("serializedData.xml");

//Global Variables==============================================================

$FoodArray = array();
$DrinkArray = array();
$FoodObj;
$DrinkObj;

foreach($xml->children() as $child)
{
//Instantiate a Food object here and insert into the array
$FoodObj = new Food();
//Add attributes of tag to the Food object
array_push($FoodArray, $FoodObj);

}

因此,在每个循环结束时,都会创建一个食物对象并将其添加到 FoodArray。

我的问题是:

  1. 是否必须在循环结束时显式调用析构函数或释放对象内存?
  2. 使用上述语法,FoodObj 将作为引用或值存储在 FoodArray 中
  3. 每次变量 Food 存储一个不同的实例时,存储在数组中是否重要?存储在数组中的所有对象都按索引号对吗?

谢谢

【问题讨论】:

    标签: php arrays scope


    【解决方案1】:
    1. 如果您在循环结束时“释放”Food() 对象,那么您也将杀死您推入$FoodArray 的最后一个对它的引用。 PHP 将为您清理并在超出范围时删除它们。由于您要分配给全局数组,因此范围是整个脚本。因此,除非您明确采取措施从 $FoodArray 中删除一个项目,否则这些对象将一直保留到脚本退出为止。
    2. http://www.php.net/manual/en/language.oop5.references.php
    3. array_push 将元素放在数组的末尾,因此它们将获得递增的索引号。

    【讨论】:

      【解决方案2】:

      试试下面的

      $FoodArray = array();
      $DrinkArray = array();
      
      foreach($xml->children() as $child) 
      {
          //Instantiate a Food object here and insert into the array 
          $FoodObj = new Food(); 
          //Add attributes of tag to the Food object 
          $FoodArray[] = $FoodObj;
          unset($FoodObj);
      }
      

      1) 手动取消设置实例是好的形式,但没有必要。无论如何,php 垃圾收集器都会为你做这件事,而且效率很高。

      2) 在上面的例子中,即使在 $FoodObj 未设置后,$FoodArray[i] 也会继续指向实例。

      3) 无论 $FoodObj 是否位于循环本地,它都有效。但为了获得最佳实践,它应该是。

      【讨论】:

      • FoodObj 的副本是插入到数组中还是对插入到数组中的 FoodObj 的引用?
      • 一份副本。您可以看到原始未设置,但数组仍然包含对象实例。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      相关资源
      最近更新 更多