Функция класса PHP не изменит массив - PullRequest
0 голосов
/ 20 февраля 2010

Я новичок в 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 ]

4 голосов
/ 20 февраля 2010

Вам нужно добавить кое-что в цикл foreach:

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

Это должно сделать это. & $ n означает ссылаться на элемент массива, а не копировать его. Возможно, вы также захотите изменить $ n [] на $ n, если хотите перезаписать его.

3 голосов
/ 20 февраля 2010

Когда вы делаете это:

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

Вы не изменяете значения testArray. Вы работаете над их копиями. Каждый раз, когда вы присваиваете значение в PHP другой переменной, вы делаете копию значения. (Объекты являются своего рода исключением из этого, но здесь это не имеет значения.)

Если вы хотите изменить оригинал, вам нужно обратиться к нему по его собственному имени переменной, например так:

    foreach ($this->testArray as $index => $value) {
        $this->testArray[$index][] = 3;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...