PHP类函数不会更改数组

时间:2010-02-19 23:00:21

标签: php arrays oop methods

我是PHP和编程的新手。我一直在用PHP做一些事情,要求我创建类,这很好,除了我似乎无法让我的类方法处理类属性的数组。我必须做一些非常根本错误的事情,因为无论项目如何,它似乎都不起作用。

这是我刚刚写的一个例子(我认为发布一个简短而简单的例子而不是我实际项目的代码会更容易,这有点长而且很复杂。)

class Test {
    public $testArray;
    public $testInt;

    public function __construct() {
        $this->testArray = array();
        for ($i=1; $i<=20; $i++) {
            $this->testArray[] = array(1, 2);
        }
        $this->testInt = 4;
    }

    public function testf() {
        $this->testInt += 1;
        foreach ($this->testArray as $n) {
            $n[] = 3;
        }
    }
}

如果我在最后添加一些代码,以便打印出正在发生的事情:

$obj = new Test;

echo 'Before function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
    print_r($n);
    echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';
echo '<br />';
echo '<br />';

$obj->testf();

echo 'After function call:';
echo '<br />testArray:<br />';
foreach ($obj->testArray as $n) {
    print_r($n);
    echo '<br />';
}
echo '<br />testInt: ';
echo $obj->testInt;
echo '<br />';

然后你最终看到的是,在函数调用之后,testInt变量发生了变化,但testArray没有变化。

如果其中任何一项不够清楚,请告诉我。这让我疯狂了一段时间。提前感谢您花时间看看我的问题。

2 个答案:

答案 0 :(得分:4)

你需要在foreach循环中添加一些东西:

  foreach ($this->testArray as &$n) {
        $n[] = 3;
    }

应该这样做。 &amp; $ n表示引用数组元素而不是复制它。如果你想覆盖它,你可能还想将$ n []改为$ n。

答案 1 :(得分:3)

执行此操作时:

    foreach ($this->testArray as $n) {
        $n[] = 3;
    }

您没有修改testArray的值。你正在处理它们的副本。每当您将PHP中的值分配给另一个变量时,您就会复制该值。 (对象有点例外,但这里没有关系。)

如果你想修改原文,你需要用它自己的变量名来引用它,如下所示:

    foreach ($this->testArray as $index => $value) {
        $this->testArray[$index][] = 3;
    }