Однако из-за скачков курса некоторые акционные цены часто становятся выше начальной цены на сайте акционная цена скрывается если она выше нормальной цены. Нужен запрос который будет учитывать цену:
(SELECT currencies.rate FROM currencies WHERE currencies.cur_id = actions.cur_id)
То MySQL возвращает 0 строк в ответе без ошибок... Есть ли вариант одним запросом решить данную задачу? (Добавление)
Помучался ещё немного и всё получилось решил попробывать в рамках одного запроса вызывать одну таблицу несколько раз под разными псевдонимами.
это уже перебор)) Зачем же я от него тогда наследовал класс A
armancho7777777 пишет:
Prizma
Если требуется, чтобы вызывался всегда метод A::calc,
то необходимо запретить переопределение метода в дочерних классах, объявив его финальным, как уже предложил Мелкий.
Метод B::calc() не может существовать без A::calc() но метод A::calc() так же используется внутри других методов класса A, и когда я начал обращаться к этим методам из класса B, то стал получать не корректные результаты потому, что там использовалось ключевое слово $this для вызова метода calc() и методы класса A стали использовать B::calc(), заменив $this->calc() на A::calc() в методах класса A, всё заработало, как должно
Проблема в некорректной работе метода getX() если вызывать его из класса B т.к. в нем переопределяется функция calc(). Существует ли ключевое слово для вызова из getX() A::calc() независимо от того был ли метод переопределен?
Есть куча параметров:
public, delivery, in_stock, look_price, look_producer и другие... Нужно сделать выборку из таблицы тех товаров которые будут соответствовать всем флагам.
Решил проверить в phpmyadmin на всякий случай и результат меня печально удивил.
собственно и там и там выдает, как результат 2, хотя во втором случае я ожидал ноль (Добавление)
Ребят, отбой... это у меня мозги поплыли... надо спать идти дурак каюсь...
Как то так.. Для хранения экземпляров класса Product ничего лучше массива не приудмал, хотя была мысль сделать ProductList, даже написал его, но в итоге не понял в чем принципиальная разница от простого массива... разве, что добавить туда методы updateAll, deleteAll которые мне пока точно не нужны. Хотя смотря в будущее возможно всё таки к этому еще вернусь, когда буду переписывать корзину товаров, там и общая стоимость всех товаров и скидка в от суммы заказа тоже зависит...
Данные перед выходом нужно обработать (именно сами данные): перевести цены в рубли, расчитать кол-во дней до конца акции, пропарсить описание на предмет подстановки... (это те функции, которые уже реализованы на сайте, а я собственно решил переписать свой код 2-ух летней давности, со свежим взглядом). Если я правильно начинаю понимать ООП, это именно те методы, которые должны быть реализованы в классе Product? (Добавление)
еще подумываю в геттерах класса Product генерировать ошибку в случае запроса атрибута со значением равным null (т.е. те которые не определены в выбранном режиме).
Добрый день,
вопрос по IDE PHPStorm, предусмотрен ли там, какой то комментарий для обозначения преднамеренного падения в switch? чтобы не подсвечивал код. Не хотелось бы эту опцию для проекта отключать
Просто если таких параметров 15-20, окей пилю в аргумент массив или объект, получается массив полученный от $q->fetch(...) идет в аргумент, а чем статический create будет лучше стандартного __construct($name, $price)?
teddy пишет:
Так у вас будет 2 цикла. Один заполнение массива, другой - для вывода данных из этого массива(через объекты которые в этом массиве). Тут явно напрашивается Traversable.
Согласен - расточительно. Почитал про итераторы.. т.е. реализовать класс class productList implements Iterator для этого дела? и помимо обязательных методов описанных интерфейсом, методы добавление удаления типа addItem, removeItem так?
Я определился, что мне нужно. Мне нужен класс Product как хранилище... я решил разделить его на 3 класса: ProductBreifInfo (содержит только 2 поля - имя и id) ProductGeneralInfo extends ProductBreifInfo (добавляются дополнительные поля) ProductFullIngo extends ProductGeneralInfo (добавляются редко используемые тяжелые текстовые поля)
не уверен стоило ли делать так или просто оставлять не сообщенные поля пустыми.
По реализации заполнения классов у меня появилось 2 варианта Вариант 1 (на примере первого класса):
Первый вариант мне кажется топорным. Второй вариант мне нравится больше, только, тогда вопрос - а стоит ли разделять класс Product - пусть есть пустые поля, они же не мешают, всегда если надо можно добавить недостающие в старый экземпляр, а не грузить всё заново.
Это кто сказал? Причины в студию, пруф, что это всегда зло. Нужно использовать, но с умом. А вообще выстрелить в ногу можно всякими инструментами, даже полезными, если разработчик плохо понимает с чем имеет дело.
teddy пишет:
По поводу "Сетеры это лишнее знание для клиентского кода", в данном случае это очень удобно. Но да, остается возможность переопределить значение "прямым" обращением, инкапсуляция и все такое... Эту возможность можно "прикрыть" простой проверкой в __set.
Причин много даже для меня:
1. Код становится менее понятным и в случае нагруженности set, менее предсказуемым
2. IDE не сможет тебе помогать (не в данном случае, тут переменные будут браться через getVar), однако если определять их в не PDO, то будет ругаться, на их область видимости.
3. Любые изменения названия полей в бд, вытекут в сложно диагностируемую ошибку, можно конечно добавить в __set проверку, что если не существует генерировать предупреждение, но зачем создавать такую почву?
4. Есть другие способы более элегантные, по реализации.
5. Сколько я в своей практике не использовал __set рано или поздно приходил, к тому, что эту часть кода приходилось переписывать, либо постоянно модифицировать.
LIME пишет:
Prizma топаешь в нужном направлении... так держать
Еще grasp
Если дядюшку Мартина асилишь
книжка интересная, по GRASP надеюсь, тоже в ближайшее время доберусь ...
Интересные вы обсуждения ведёте, однако магические методы точно использовать не хорошо..
teddy пишет:
$products = $dbh->query('SELECT name, price FROM products');
$products->setFetchMode(PDO::FETCH_CLASS, 'Product');
Этот код не полный там не хватает наверно execute... чтобы он работал
Однако всё равно не думаю, что стоит пользоваться этим механизмом PDO, если он требует public переменные или __set ... начал читать одну из книжек по ООП "Быстрая разработка программ" от Роберта Мартина, пошарил по интернету...
Еще точно не определился, как именно реализую этот класс, времени не было, но завтра отпишу, что получилось.
PS: не думал, что может быть так сложно правильно реализовать достаточно простой класс, следуя всем принципам ООП. Однако, почитав немного поглубже про принципы, шаблоны... понял, что моё понимание было достаточно узким и не полным относительно этих принципов и ООП в целом.
в каждом вызываемом Вы имеете ввиду или в файле каждого класса который инклюдится тоже? (Добавление)
По поводу SOLID нашел прекрасную статью на хабре https://habrahabr[dot]ru/post/208442/ там конечно в кратце, но начальное понимание дает... пойду читать, искать материал. Подумаю над лучшей реализацией.
Спасибо за советы, если будут еще комментарии обязательно прочитаю.
этого мало? нет ошибок могу архив с бд и кодом залить.. экземпляр создается, все параметры доступны, ошибок нет (Добавление)
teddy пишет:
У вас метод issetProduct не статичный, соответственно экземпляр вы создаете в любом случае, лишь с той разницей, что бросаете исключение если продукт не нашелся в БД. Не нужно себя обманывать. Кроме того, Product никак не должен брать на себя за подобную ответственность. Ничего не мешает сделать проверку по идентификатору вне Product и там же определить, надо ли создавать экземпляр.
Это опечатка, естественно я имел ввиду, что он будет статичный. (Добавление)
Prizma пишет:
Это опечатка, естественно я имел ввиду, что он будет статичный.
поправил (Добавление)
добавил код трейта Mysql, может еще какие ошибки увидите))