2013-08-07 2 views
2

У меня есть массив, в котором хранятся некоторые объекты Employee ie.PHP - потеря ссылки в массиве объектов?

var $this->employeeArray = array(); 
$this->employeeArray[] = $empObjectA; 
$this->employeeArray[] = $empObjectB; 
... 

, какой объект Employee имеет идентификатор, ПгвЬЫат, LastName и т.д. У меня также есть функции для поиска объекта сотрудника, который с определенным идентификатором. то есть:

public function searchArrayByID($id) { 
$targetObject = null; 

     foreach($this->employeeArray as $e) { 
      if ($id == $e->id) { 
       $targetObject = $e; 
       break; 
      } 
     }//foreach 

return $targetObject; 

} 

но когда я делаю:

$targetEmployee = $this->searchArrayByID(1); 
$targetEmployee->firstName = "someOtherName"; 

и сделать

print_r($this->employeeArray); 

, что объект внутри массива не изменяется.

ответ

2

попробуйте это, с & добавленным, он передаст ссылку. Я также упростил вашу функцию поиска.

Поскольку я не знаю, почему оно не работает для вас, потому что его работы для меня на 2 разных серверах без & я просто могу предложить «безопасный» метод => ссылки силы везде, где возможно

$this->employeeArray[] = &$empObjectA; // here 

public function &searchArrayByID($id) { // here 
    foreach($this->employeeArray as &$e) { // and here 
     if ($id == $e->id) return $e; 
    } 
    return null; 
} 

$targetEmployee = $this->searchArrayByID(1); 

прямо сейчас если это не работает, я подозреваю еще одну ошибку в вашем коде, потому что каждая ссылка принудительно здесь

забавная вещь есть. Я попробовал это здесь: http://phpfiddle.org/main/code/2cv-pt2 и с этой версией php, это не имеет значения (это как должно быть). Какую версию php вы используете? Поскольку PHP стал лучше обрабатывать ссылки (уменьшая нежелательные/ненужные копии)

+0

, к сожалению, он не работает. Я использовал print_r как для $ targetEmployee, так и для $ this-> employeeArray. $ targetEmployee содержит изменения, в то время как obj в $ this-> employeeArray не – Josh

+0

Я использую php 5.3.15 (mac) – Josh

+0

plz сообщите мне, что php verion вы используете, как я уже сказал, старая версия php плоха с ссылка, она имеет тенденцию копировать много. и некоторые ручные ссылки не разрешены в более новой версии, вот почему я не могу сказать, какой код будет работать для вас – x4rf41

0

Это потому, что PHP копирует объект в $ targetEmployee, он не связан.

Смежные вопросы