• В чем отличие возвращаемого массива от объектов?

    Adamos
    @Adamos
    Немного опыта и больших проектов - и понимание, чем
    function f(array &arr)
    хуже, чем
    function f(KnownObject o)
    станет простым и естественным.
    Тем более, что даже в простых проектах можно долго искать причину, по которой не работает
    echo $arr['namе'];
    Сомневающимся предлагаю определить, в чем проблема последнего примера.
    Ответ написан
    7 комментариев
  • В чем отличие возвращаемого массива от объектов?

    php666
    @php666
    PHP-макака
    Для чего, в данном случае, возвращать объекты?
    Твой вопрос говорит о том, что ты не понимаешь разницу между объектом и массивом.

    Это не одно и тоже.
    Объект - это не просто хранилище данных, как массив.
    Объект - это описание некой сущности, представление этой сущности в рамках языка программирования. Объект может иметь свойства и методы, оперирующие этими свойствами или методы, делающие еще что-либо, что касается непосредственно этого объекта.

    Прочти хот-бы пол книги "Гради Буч - Объектно-ориентированный анализ и проектирование". И ты перестанешь задавать эти детские вопросы.

    Чем мне это поможет на конкретном примере?
    ОК. Пример. Давай допустим, что твой объект Product не просто содержит свойства, а каждое свойство..... да - тоже является объеком. Итак, перепишем конструктор, добавим несколько свойств новых, для примера:

    public function __construct(int $id, string $name, int $price, $decription, $discount_date){
        $this->id = $id;
        $this->name = new EntityText($name);
        $this->price = new Price($price);
        $this->decription = new EntityText($decription);
        $this->discount_date = new MyDate($discount_date); // MyDate extends \Datetime
      }


    Требование к одной из страниц магазина, показывающего продукт: нужно отображать цену в RUB и в USD. Текст описания не должен быть более 200 символов. Показать дату окончания скидки в человеческом формате.

    <html>
     <div id="product<?=$obj->getId()?>">
      <h1><?=$obj->getName()->getTextValue()?></h1>
      <p>Цена: <?=$obj->getPrice()->getUSD()->asText()?></p> <!-- например, выведет "101 доллар США" (c правильной формой слова "доллар/доллара/долларов") -->
      <p><?=$obj->getDescription()->getTextValue(200)?></p>
      <p>Скидка действут <?=$obj->getDiscountDate()->formatAsHuman()?></p> <!-- выведет "еще 2 дня" -->
     </div>
    </html>


    Теперь вопрос: как это будет выглядеть на массивах? Разницу видишь?

    и начинай читать отсюда- https://dom-knig.com/read_210105-3
    Ответ написан
  • В чем отличие возвращаемого массива от объектов?

    mad_maximus
    @mad_maximus
    С коллекциями удобнее работать. Вы вот вспомните, что у вас в массиве, не заглядывая в код? А объект сам скажет, что у него внутри за счет публичных методов.
    Ответ написан
  • Хорошо ли написан класс БД?

    profesor08
    @profesor08 Куратор тега PHP
    Чтоб получить имена столбцов и данные построчно, надо выполнить два одинаковых запроса. Спрашивается зачем? Можешь удалить весь код, и писать запросы станет легче.

    Если же хочешь на классах, то тебе нужен один класс для создания запросов к бд, второй для обработки результата.

    class Sql {
      public function query() {
        ....
        return new SqlResult($stmt);
      }
    }
    
    class SqlResult {
      public function __constructor($stmt) {
        $this->stmt = $stmt;
      }
    
      public function getCollumns() {
        return $this->stmt->fetchColumn();
      }
    
      public function getRows() {
        return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
      }
    }
    Ответ написан
    6 комментариев
  • Хорошо ли написан класс БД?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В целом подход правильный.
    Именно с точки зрения SOLID и сам класс, и его использование спроектированы верно.

    Можно поправить только по мелочам.

    - код соединения никуда не годится. Брать отсюда: Как правильно соединяться с mysql в PDO
    - при этом конфиграцию (хост, пароль, чарсет и прочее) вынести отдельно и передавать в конструктор в виде массива
    - query() переписать так:
    private function query($query, array $params = array()){
        $stmt = $this->db->prepare($query);
        $stmt->execute($params);
        return $stmt;
      }

    - добавить getRow() и использовать в getById именно его.
    - getRows переименовать в getAll чтобы не было путаницы и переписать так
    public function getRows($query, array $params = array(), $mode= PDO::FETCH_ASSOC){
        return $this->query($query, $params)->fetchAll($mode);
      }
    - либо добавить методы для всех методов PDO, либо сделать $db публичной. потому что когда тебе нужно будет выполнить десяток инсертов обернутых в транзакцию, эта обертка превратится в тыкву.
    Ответ написан
    5 комментариев
  • Хорошо ли написан класс БД?

    php666
    @php666
    PHP-макака
    1. Мое личное мнение - использовать PDO как движок для своей обертки - очень плохая идея. PDO универсален, тем самым он ограничивает многие возможности. По сути, это весьма усложненная и неторопливая махина.

    2. Метод query до неприличия простой. Я не вижу тут никаких плюшек, нет ни одного преимущества обертки над самим PDO. Я писал много времени обертку над MySql, можешь посмотреть, что обычно добавляется к возможностям.

    3. У обертки не должно быть методов типа getRows, getColumn и тп. отсебятины. Её функция - обрабатывать запросы, отдавать ответы и какие-то вспомогательные функции, типа lastInsertId и отдавать ошибки. Все остальное должно реализовываться в вышестоящем слое, неважно как ты его назовешь.

    4.
    всё началось с фразы "никакой работы с БД не должно быть в модели".
    это правильно и это ты правильно понял, абстрагировав слой БД от слоя модели. Советую почитать книгу Фаулера "Архитектуру корп. пр. приложений" и особенно главу "Источники данных". Без этой концепции ты дальше своей подделки не уедешь в знаниях.
    Ответ написан
    7 комментариев
  • Хорошо ли написан класс БД?

    usdglander
    @usdglander Куратор тега PHP
    Yipee-ki-yay
    die('DB ERROR');
    Сразу нет! Класс не должен останавливать приложение, если произошла ошибка. Он должен бросать исключение, а что делать дальше должен решать клиентский код.

    никакой работы с БД не должно быть в модели

    В каком смысле это написано? Где это написано?

    Ухожу с синглтона

    На каждый запрос будете создавать отдельное подключение к БД? Там вообще то есть ограничение на количество открытых.

    Я не заметил особой разницы между работой с mysqli и с вашим классом. Инкапсуляция бинда параметров метод query только? Так унаследуйтесь от класса mysqli и напишите удобный метод для этого.

    И почему вы не берёте какую то готовую обёртку? Благо их написано тысячи!
    Ответ написан
  • Хорошо ли написан класс БД?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Параметры бд обычно выносятся в отдельный файл.
    Совсем забыл, die, exit внутри класса использовать нельзя.
    Ответ написан
    5 комментариев
  • Как соединить работу двух методов?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    1. В контроллере ничего подобного в принципе никогда быть не должно. Ни двух методов, ни одного. Никакой работы с БД в контроллере в принципе быть не может. Контроллер должен только принять данный из формы и вызвать метод модели. Только не убогого класса для маппинга таблицы из БД в класс РНР, который называют моделью новички, а нормальной модели, реелизующей всю бизнес-логику приложения.
    2. По-хорошему, это код для репозитория, поскольку он работает с базой данных. Но конкретная реализация зависит от того как реализован класс customer

    В идеале цепочка вызовов должна быть такая
    Контроллер вызывает инстанс хелпера (или сервиса) CustomerHelper.
    В этот хелпер через конструктор передается инстанс CustomerRepository и присваивается свойству класса.
    В методе Create класса CustomerHelper вызывается метод Create класса CustomerRepository.
    И в этом методе уже и происходит искомая транзакция.
    Ответ написан
    3 комментария
  • В какой формате передавать данные на сервер API?

    mad_maximus
    @mad_maximus
    Как вам удобно принимать, так и используйте, но более крупные держатели АПИ делают возможность отправлять двумя способами, а на сервере уже разруливают, что и в каком виде к ним пришло.
    Ответ написан
    5 комментариев
  • В какой формате передавать данные на сервер API?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    И так, и так нормально. Ну, в JSON как-то более фэншуйно, что ли.
    Ответ написан
    Комментировать
  • Какой стиль программирования выбрать, чтобы не вникать спустя время в проект?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Тут как раз речь о том, что применимо для всех языков, а не только для PHP.
    Если будете применять устоявшиеся практики и паттерны; не изобретать велосипеды, а искать и интегрировать имеющиеся решения; а также уместно комментировать код и вести документацию - через год поблагодарите себя, даже если не придётся возвращаться к написанному и править, потому что вырастите в целом как востребованный специалист.
    Ответ написан
    Комментировать
  • Какой стиль программирования выбрать, чтобы не вникать спустя время в проект?

    inoise
    @inoise Куратор тега PHP
    Solution Architect, AWS Certified, Serverless
    Документацию писать надо) вот и весь секрет
    Ответ написан
  • Почему не срабатывает метод в объекте?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Контекст теряете. Замените function(el){ на (el) => {.
    Ответ написан
    2 комментария
  • Для чего нужна авторизация в WEB API?

    @EvgeniiR
    https://github.com/EvgeniiR
    Аутентификация может быть сложнее чем ввод логина и пароля. Вот захотите вы двухфакторку через Google authenticator/смс/email ввести, и логинить по новой каждый раз будет не вариант.
    Ну и хранить логин и пароль клиента в открытом виде на клиенте все время работы приложения.. Не всем понравится.
    Ответ написан
    Комментировать
  • Как инициализировать плагин?

    BRAGA96
    @BRAGA96
    Первый вариант более предпочтительный и лучше через class если позволяет поддержка. Но если хочется второй вариант, чтобы понимать что и как, то используйте замыкание:
    function myPlugin(param) {
    	var id = param.id;
    	return {
    		param1: 100,
    		param2: 200,
    		method1: function () {
    			return id;
    		},
    		method2: function () {}
    	}
    }
    
    var plg = myPlugin({
    	id: "#block1"
    })
    
    console.log(plg.method1()); //>  "#block1"
    Ответ написан
    4 комментария
  • Как уведомлять менеджеров о новых заявках?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Комментировать
  • Как уведомлять менеджеров о новых заявках?

    @caballero
    Программист
    ну не обязательно сайт - уведомления от фейсбука например приходят если открыт просто браузер

    в вашем случае в винде должен крутится какой то сервис который надо запустить если этого захочет пользователь - само оно в винду не попадет
    то есть как ни крути надо писать програмку
    но тогда какая разница запустил человек специальную программу или запустил почтового клиента который ему показывает что пришло уведомления по почте или в телеграм или вайбер
    Ответ написан
    Комментировать