Хранить объекты в массиве различие в PHP 4 и 5 - PullRequest
2 голосов
/ 14 марта 2011

У меня была похожая проблема в посте здесь: Хранение объектов в массиве с php

Тестовый код прилагается ниже.

Интересно то, что когда я запускаю тот же код в PHP 4.3.9, и он выдает:

Array
(
    [0] => timitem Object
        (
            [t1] => a
            [t2] => a
        )

    [1] => timitem Object
        (
            [t1] => b
            [t2] => b
        )

    [2] => timitem Object
        (
            [t1] => c
            [t2] => c
        )

)

Когда я запускаю его в PHP 5, и он выводит:

Array
(
    [0] => timItem Object
        (
            [t1] => c
            [t2] => c
        )

    [1] => timItem Object
        (
            [t1] => c
            [t2] => c
        )

    [2] => timItem Object
        (
            [t1] => c
            [t2] => c
        )

)

Может кто-нибудь указать мне направление, где я могу найти соответствующую документацию относительно этих изменений в PHP 4 и 5?

На самом деле мне интересно, есть ли переключатель, который я могу отключить в PHP5, чтобы сделать то же самое в PHP4. (У меня много такого кода в старом проекте).

Тестовый код:

    <?php

class timItem{
  var $t1;
  var $t2;
  function timItem(){
  }
  function setItem($t1, $t2){
    $this->t1 = $t1;
    $this->t2 = $t2;
  }
} 

$arr = Array();

$item = new timItem();
$item->setItem("a","a");
$arr[] = $item;
$item->setItem("b","b");
$arr[] = $item;
$item->setItem("c","c");
$arr[] = $item;

print_r($arr);

?>

Ответы [ 3 ]

4 голосов
/ 14 марта 2011

В PHP4 $arr[] = $item добавляет копию $item в $arr. В PHP5 ссылка на $item добавляется к $arr.

С PHP: операторы присваивания :

Обратите внимание, что назначение копирует исходную переменную в новую (назначение по значению), поэтому изменения одной не повлияют на другую. ...

Исключение из обычного поведения по присваиванию по значению в PHP происходит с объектами, которые назначаются по ссылке в PHP 5.

2 голосов
/ 14 марта 2011

Поскольку PHP5 называется объектно-ориентированным, вы должны изменить свои назначения на что-то вроде этого:

$arr[] = clone $item.

Я не думаю, что вы можете заставить PHP5действовать не объектно-ориентированным образом.

1 голос
/ 14 марта 2011

Разница не в массивах как таковых, а в том, как PHP обрабатывает объекты.PHP 4 почти всегда делает копию элемента, когда вы присваиваете переменную, но PHP 5 работает больше как Java, C # и т. Д., Где присваивание делает ссылку.

Посмотрите на http://au.php.net/manual/en/language.oop5.references.phpдля получения дополнительной информации.

...