• Структура паттерна MVC и модели?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Вообще при наличии интернета все вопросы гуглятся за время меньшее чем написание этого поста...
    Мой класс для работы с базой данных расположен в моделях,
    Это не класс модели. Это адаптер работы с бд.
    там же классы для работы с таблицами в бд User и Goods
    Это больше похоже на мвц, но вот дальше какая-то непонятная фигня:
    Я вызываю все эти модели в /app/core/model.php - основной класс моделей, который в свою очередь вызывается в основном контроллере.
    Куда вызываете? Зачем? Ваши User и Goods должны наследоваться от модели, если у вас выбран тип Active Record. А в контроллере вы уже создаете экземпляры нужных классов.

    Вопрос 2. Что вообще должно быть в моделях? Насколько правильно создавать функции для работы с той или иной таблицей? Где подчерпнуть пример?
    В модели должна быть реализована бизнес логика и методы работы с бд (в случае Active Record), в некоторых случаях так же связи объектов между собой. Все это легко гуглится, посмотреть можно в любом современном фреймворке, например что-то простенькое типа fat-free или более серьезное типа лары или симфони.
    Ответ написан
    Комментировать
  • Как создать новый словарь, не меняя старый?

    Vindicar
    @Vindicar
    RTFM!
    rows = self.rows
    НО! В тоже время изменяется из self.rows, который является другим списком.

    Не является. Твой оператор просто присвоил переменной rows ссылку на тот же самый список, что и self.rows.
    Это легко проверить оператором is или сравнением id():
    print(rows is self.rows, id(rows) == id(self.rows))  # True True

    Более того, если ты только скопируешь сам список:
    rows = self.rows.copy()
    То всё ещё поймаешь проблемы, так как скопируются ссылки на элементы, а не их значения:
    print(rows is self.rows, id(rows) == id(self.rows))  # False False
    print(rows[0] is self.rows[0], id(rows[0]) == id(self.rows[0]))  # True True

    Тебе нужно сделать глубокую копию (deepcopy). Это можно сделать вручную, так как у тебя всего два уровня вложенности (список-словарь):
    rows = [rowdict.copy() for rowdict in self.rows]
    Для более глубоких уровней есть функция copy.deepcopy(), но у неё есть свои подводные камни. Цитата:
    Two problems often exist with deep copy operations that don’t exist with shallow copy operations:
    Recursive objects (compound objects that, directly or indirectly, contain a reference to themselves) may cause a recursive loop.
    Because deep copy copies everything it may copy too much, such as data which is intended to be shared between copies.
    Ответ написан
    Комментировать
  • Как создать новый словарь, не меняя старый?

    @humoured
    Вы всё на свете найдёте в коробке с карандашами
    Так происходит, потому что присвоение значения переменной rows = self.rows не является дублированием исходного массива. Нужно использовать deepcopy().
    Ответ написан
    Комментировать