Переменная PhP объявлена ​​в цикле, и я хотел бы сохранить ее в глобальном массиве - PullRequest
1 голос
/ 19 июля 2011

Я новичок в 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 получает другой экземпляр, хранящийся в ней, имеет ли это значение при хранении в массиве? Все объекты, хранящиеся в массиве, идут по порядковому номеру, верно?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 июля 2011
  1. Если вы «освободите» объект Food () в конце цикла, вы убьете последнюю ссылку на него, которую вы вставили в $ FoodArray. PHP очистит вас и удалит вещи, когда они выйдут из области видимости. Поскольку вы присваиваете глобальный массив, область действия - весь сценарий. Поэтому, если вы явно не предпримете шаги для удаления элемента из $ FoodArray, объекты будут храниться до тех пор, пока скрипт не закроется.
  2. http://www.php.net/manual/en/language.oop5.references.php
  3. array_push помещает элементы в конец массива, так что они получат увеличивающийся индекс.
0 голосов
/ 19 июля 2011

Попробуйте следующее

$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) в приведенном выше примере $ FoodArray [i] будет продолжать указывать на экземпляр даже после сброса $ FoodObj.

3) это работает независимо от того, является ли $ FoodObj локальным для цикла или нет. Но для лучшей практики это должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...