DmitryPRG
@DmitryPRG
PHP программист

Тонкости ООП в PHP. Почему перезаписываются данные?

Добрый день!

Столкнулся со странным поведением PHP. Ну или со своей не полной компетентностью в данном вопросе.
Прошу помощи у знающих людей.
Заранее благодарен.

Суть ситуации.
Есть образный статический класс Items
у него 2 статические функции
Items::preload() - формирует массив элементов и записывает в приватное свойство класса
Items::getItems() - возвращает список элементов сгенерированных первой функцией

Теперь, что работает не так как мне хотелось бы.
Items::preload();
$list = array(
    'action1' => 'addOne',
    'action2' => 'addTwo'
);
foreach( $list as $key => $action ){
    $itemList = Items::getItems();
    foreach( $itemList as $id => $item ){
        $itemList[ $id ] = doSomethinkWithItem( $action, $item );
    }
}

function doSomethinkWithItem( $action, $item ){
    $item->{$action} = 'someText';
}

class Items {
    private static $arItems;

    public static function preload(){
        // $arItems выборка из базы
        foreach($arItems as $ID => $data){
            $one = new \stdClass();
            $one->id  = $ID;
            $one->name = $data["NAME"];

            self::$arItems[ $ID ] = $one;
        }
    }

    public static function getItems(){
        return self::$arItems;
    }
}


Проблема:
При повторном получении списка элементов методом $itemList = Items::getItems();
у элементов сохраняются свойства после обработки первым методом, а мне необходимо, что бы на момент начала работы со списком, он был неизменный и изначально заданный. Т.к. во время работы с ним, какие то характеристики меняются, какие то удаляются элементы вообще.

Кто может подсказать что не так со структурой и как сделать так, что бы изначально сформированный список не изменялся вообще и отдавался всегда один и тот же?
  • Вопрос задан
  • 450 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA, рассмотрю предложения о работе
По вашей функции doSomethinkWithItem очевидно, что аргумент $item является объектом.
Объекты передаются всегда по ссылке. Для создания копии объекта - есть оператор clone
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bigton
@bigton
Web-программист
Вы реализацию getItems покажите, видимо функцию возвращает не массив, а ссылку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы