Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: PHP 7 Использование контроля скалярных типов
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
И так есть класс Product экземпляр которого создается по product_id.
Задумка такая.. Использовать возможности PHP 7, а именно поддержку контроля скалярных типов данных, при выборке из бд, для приведения всех полей к нужному типу.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
С точки зрения ооп все криво
И какая выгода использовать typehint?
Можно явно привести в list
А еще есть extract()
Лучше завести класс работающий с хранилищем
Тогда для смены хранилища не придется менять класс модели
Принцип open/close SOLID (Добавление)
Typehint надо использовать в классах использующих эти данные
Там будет уместно (Добавление)
Datamapper... ознакомся...
teddy
Отправлено: 22 Апреля, 2016 - 19:52:47
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Prizma пишет:
Что вы думаете о такой реализации
Думаю, что вы используете не подходящий инструмент.
1. При включении строгого режима получите ошибку из за попытки передать в качестве параметра строку похожую на число для int параметра.
2. Если тип извлекаемых данных имеет значение, установите опции PDO::ATTR_EMULATE_PREPARES и PDO::ATTR_STRINGIFY_FETCHES в false, остальное PHP сделает за вас.
3. Код конечно же ужасен, но видно, чего вы хотите. В принципе LIME сказал чего гуглить. Но сходу все эти солиды и мапперы будет сложно понять. Ниже приведу более простую реализацию, для новичка в таких делах вполне сойдет.
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
LIME пишет:
И какая выгода использовать typehint?
LIME пишет:
Typehint надо использовать в классах использующих эти данные
Там будет уместно
логично, тогда и вправду не нужно приводить тип
LIME пишет:
А еще есть extract()
IDE будет ругаться, если бд не прикручена
LIME пишет:
Лучше завести класс работающий с хранилищем
Тогда для смены хранилища не придется менять класс модели
Принцип open/close SOLID
а вот тут можно поподробнее.
Не совсем понял, чем плох этот класс в роли хранилища? (Добавление)
teddy пишет:
1. При включении строгого режима получите ошибку из за попытки передать в качестве параметра строку похожую на число для int параметра.
у меня включен строгий режим, нет ошибок.
teddy пишет:
Ниже приведу более простую реализацию, для новичка в таких делах вполне сойдет.
Я несколько лет занимаюсь php, могу сказать, что у меня не было наставника и я изучал язык сам и чувствую свои пробелы. Но реализация в примере меня не как не устраивает.
Я хочу, чтобы экземпляр класса Product было невозможно создать, если продукт в базе не найден. Класс реализует метод для проверки существования такого продукта, которым и нужно воспользоваться перед созданием экземпляра класса. Если продукта не существует в базе, будет фатальная ошибка, а следовательно где то в коде ошибка, которую будет легко найти и исправить.
Пока писал понял, что для выборки 100 продуктов в моем случае надо будет сделать 100 запросов, а так один... это не есть гуд. Так же много полей не будут использованы, т.е. лишняя нагрузка на память - ок согласен, надо что-то менять.
Просто проект не из одного файла состоит и хочется сделать универсальный класс под хранение информации об одном объекте
teddy
Отправлено: 22 Апреля, 2016 - 20:27:04
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Prizma пишет:
у меня включен строгий режим, нет ошибок.
А должны быть. Может все таки не включен? Или у нас разные понятия о строгом режиме...
Prizma пишет:
Я хочу, чтобы экземпляр класса Product было невозможно создать, если продукт в базе не найден
1. Если есть класс с доступным конструктором как у вас, возможность создать экземпляр не пропадет.
2. У вас метод issetProduct не статичный, соответственно экземпляр вы создаете в любом случае, лишь с той разницей, что бросаете исключение если продукт не нашелся в БД. Не нужно себя обманывать. Кроме того, Product никак не должен брать на себя за подобную ответственность. Ничего не мешает сделать проверку по идентификатору вне Product и там же определить, надо ли создавать экземпляр.
этого мало? нет ошибок могу архив с бд и кодом залить.. экземпляр создается, все параметры доступны, ошибок нет (Добавление)
teddy пишет:
У вас метод issetProduct не статичный, соответственно экземпляр вы создаете в любом случае, лишь с той разницей, что бросаете исключение если продукт не нашелся в БД. Не нужно себя обманывать. Кроме того, Product никак не должен брать на себя за подобную ответственность. Ничего не мешает сделать проверку по идентификатору вне Product и там же определить, надо ли создавать экземпляр.
Это опечатка, естественно я имел ввиду, что он будет статичный. (Добавление)
Prizma пишет:
Это опечатка, естественно я имел ввиду, что он будет статичный.
поправил (Добавление)
добавил код трейта Mysql, может еще какие ошибки увидите))
teddy
Отправлено: 22 Апреля, 2016 - 20:49:19
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Это опечатка, естественно я имел ввиду, что он будет статичный.
Ну и что Смотрите. У вас так получается 2 запроса. Один с проверкой на существование, другой для получения продукта если он существует. Почему не выберете сразу продукт, вне класса Product, и если результатом будет не false, тогда работать дальше? Присмотритесь к примеру выше.
Prizma пишет:
добавил код трейта Mysql, может еще какие ошибки увидите))
Ну как минимум 3 косяка.
1. Отсутствие возможности определения параметров подключения динамически (нужно передавать их из вне)
2. Синглтон... Статика... жесткие связи в коде, сложно тестируемый код
3. Трейты нельзя протестировать как отдельное целое
Вообщем говорить об ошибках в данном случае можно не мало, если хотите понять ООП, изучайте фреймворки, читайте сурьезные статьи на эту тему Как вариант можете попробовать с S.O.L.I.D как было предложено выше. Из ФВ рекомендую Zend Framework 2
It is possible to enable strict mode on a per-file basis.
----- PostgreSQL DBA
Prizma
Отправлено: 22 Апреля, 2016 - 21:17:30
Посетитель
Покинул форум
Сообщений всего: 463
Дата рег-ции: Июнь 2012 Откуда: Санкт-Петербург
Помог: 5 раз(а)
Мелкий пишет:
В каждом (каждом!) PHP-файле.
в каждом вызываемом Вы имеете ввиду или в файле каждого класса который инклюдится тоже? (Добавление)
По поводу SOLID нашел прекрасную статью на хабре https://habrahabr[dot]ru/post/208442/ там конечно в кратце, но начальное понимание дает... пойду читать, искать материал. Подумаю над лучшей реализацией.
Спасибо за советы, если будут еще комментарии обязательно прочитаю.
LIME
Отправлено: 23 Апреля, 2016 - 02:19:44
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy эээм... можно поспорить
Создается экземпляр при отсутствии данных? Как бэ да но какбэ нет смещения данных и значит н кушается память
Магия это не мое
Все эти геты и сеты не более чем латание дыр
Запрос в клиентском коде? Ну для примера наверное...
teddy
Отправлено: 23 Апреля, 2016 - 12:03:49
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Мелкий пишет:
В каждом (каждом!) PHP-файле.
Ну, это не всегда обязательно. В некоторых случаях достаточно определить строгий тип только в том файле, где инклюдится другой. Зависит от стека вызовов.
LIME пишет:
Как бэ да но какбэ нет смещения данных и значит н кушается память
Не, я не про экономию памяти говорил а лишь обратил внимание на тот факт, что экземпляр создается в любом случае, об этом свидетельствует вызов конструктора.
LIME пишет:
Все эти геты и сеты не более чем латание дыр
Почему латание дыр? В данном случае PDO пытается присвоить значения публичным свойствам одноименным с полями в БД соответствующие значения потому что был использован FETCH_CLASS. Когда он это делает, не находит такие свойства т.к они приватные и вызывается __set. Сами мы явно магию никак не используем. Не сторонник публичных свойств, но их любителям __set можно и не писать, PDO сам все сделает.
LIME пишет:
Запрос в клиентском коде? Ну для примера наверное...
Ну да, это был пример того, что хочет ТС, в более простой форме.
LIME
Отправлено: 23 Апреля, 2016 - 12:11:55
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
teddy я немного о другом
Из модели должны торчать только методы предметной области
Никаких сет
Тогда и магию не надо дергать
Лучше описать и знать что все под контролем
сетИмя плохо
ченджИмя хорошо
Потому как если объект может менять имя то мы это заложили
Кажется мелочь...но если подумать... (Добавление) teddy экземпляр это просто данные по смещению
Код всех экземпляров один
Просто к разным данным обращается
По разному смещению
teddy
Отправлено: 23 Апреля, 2016 - 12:17:37
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
А где ты здесь увидел модель? В данном случае экземпляр класса Product сущность, представляющая определенный тип в коде. У продукта есть название, цена и что то ещё. Этот продукт или набор продуктов в виде итератора/массива уже возвращает модель(возможно, какая нибудь ORM) как результирующий набор.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Это именно модель
Она описывает предмет
И методы должны быть только те которые предусматривает этот предмет
Сетеры это лишнее знание для клиентского кода
А вообще я не о модели а о ооп в целом (Добавление)
Я высказался
Ушел
teddy
Отправлено: 23 Апреля, 2016 - 12:36:33
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
Может мы по разному позиционируем этот вопрос. На мой взгляд это не модель, а то, что возвращает модель, то есть результат работы модели. Например, $productsModel->getList($offset, $limit), вернет какой то результат, если данные нашлись. А в какой форме она вернет результат, например в виде массива, объекта/набора объектов или что то ещё уже дело десятое и это решает разработчик в зависимости от того, что ему нужно и удобно. Конечный результат работы модели не является моделью, не является тем самым комбайном, который обращается в определенное хранилище за данными. Имхо... Как то так
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.