Кеширование PHP пошло не так? Элемент используется в качестве ссылки, я не понимаю, почему - PullRequest
0 голосов
/ 13 января 2011

Произошло что-то злое. Я потерял два часа, сводя проблему к этому - два массива объектов вели себя так, как если бы один был ссылкой на другой.

foreach ($this->screenElements as $element) {
    echo($this->screenElementsSearch['tasksSeverity']->getValue());
    echo "-";

    $element->setValue('1cosmetical');

    echo($this->screenElementsSearch['tasksSeverity']->getValue());
    echo "\n";
}

PrintOut:

 - 1cosmetical
1cosmetical - 1cosmetical
1cosmetical - 1cosmetical

Я не настроил $ screenElementsSearch в качестве ссылки на $ screenElements или $ element в качестве ссылки на $ screenElements в цикле for.

Затем, внезапно (я позвонил phpinfo(), чтобы посмотреть версию PHP, чтобы опубликовать эту версию, 5.2.9 на Win7 / Xampp lite, кстати), это прекратилось. Я знаю, как это звучит. Но распечатка изменилась на:

 - 
 - 
 -

как и должно быть. Теперь мой вопрос к вам: происходит ли какое-либо кэширование PHP или XAMPP, что может вызывать такое поведение? На всякий случай, если это случится снова, потому что тогда я буду биться головой о стену.

Заранее большое спасибо.

Ответы [ 2 ]

2 голосов
/ 14 января 2011

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

В старых версиях php (php 4) объекты на самом деле имели семантику значений. Вот почему код php 4 был везде с амперсандами.

1 голос
/ 14 января 2011

За ваш комментарий:

$this->screenElementsSearch = readEntityFields();
$this->screenElements = array_merge(someMethod(), $this->screenElementsSearch);

Вы создаете screenElements на основе содержимого screenElementsSearch.В PHP 5 это фактически копирует ссылки на объекты элемента из одного массива в другой.Таким образом, оба массива содержат свои собственные ссылки на одинаковые объекты , без необходимости использовать &.

Если после вызова phpinfo() вывод пуст, вы, вероятно, сработалигде-то, что изменило версии PHP на вашем сервере ... эта функция сама по себе не должна ничего менять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...