2011-03-14 45 views
2

我有类似的问题,在这里的岗位: Storing objects in an array with php存储对象在PHP 4和5

测试代码附后。

有趣的是,当我运行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); 

?> 

回答

4

在PHP4中,$arr[] = $item$item的副本添加到$arr。在PHP5中,对$item的引用被添加到$arr

PHP: Assignment Operators

注意分配复制原始变量到新的(传值赋值),所以改变其中一个不会影响其他。 ...

内PHP平时作业例外按值行为与对象,通过引用在PHP分配5

+0

解释了一切。谢谢。 – 2011-03-14 10:12:22

1

所不同的是不是在阵列本身,而是在途中PHP处理对象。当你分配一个变量时,PHP 4几乎总是会创建一个项目的副本,但PHP 5更像Java,C#等,其中赋值是一个引用。

看看http://au.php.net/manual/en/language.oop5.references.php了解更多信息。

+0

感谢您的提示!干杯。 – 2011-03-14 10:13:03

2

因为PHP5据说是面向对象的,你应该改变你的出现分配到这样的东西:

$arr[] = clone $item

我不认为,你可以强制PHP5以非面向对象的方式行事。

+0

我确实使用克隆作为工作 - 好东西,谢谢! – 2011-03-14 10:12:47