Ответы пользователя по тегу PHP
  • Как не прогадать со стажировкой?

    php666
    @php666
    PHP-макака
    Мне бы хотелось получать опыт разработки сложных проектов для роста в сторону профессионального backend разработчика, решающего сложные задачи
    на сложные проекты не всегда берут даже людей с опытом, сейчас работодатели очень тщательно проводят отборы. Ты в своем положении человека с нулевым опытом особо не надейся, придется идти куда позовут.
    Ответ написан
    2 комментария
  • Почему unset не сработал в функции?

    php666
    @php666
    PHP-макака
    https://www.php.net/manual/ru/function.unset.php - там написано
    Если переменная, которая передаётся ПО ССЫЛКЕ, удаляется внутри функции, то будет удалена только локальная переменная.
    Ответ написан
    Комментировать
  • Почему возникает ошибка "Call to a member function fetch() on boolean"?

    php666
    @php666
    PHP-макака
    Никого не слушай. Должно быть так.
    В случае ошибки SQL-запроса - исключительная ситуация. Точка. Это ошибка, которая требует отладки.
    Возвращать пустой массив нельзя при ошибке, пустой массив - это значит, что нет товаров, удовлетворяющих условию.
    Возвращать false смысла не имеет на клиентском коде типа этого метода.
    public static function getProducts($count = self::SHOW_BY_DEFAULT)
    {
        $db = Db::getConnection();
        $result = $db->query('SELECT ....');
    
        if (!$result) {
            throw new \RuntimeException('SQL query error: ' . $db->error());
        }
    
        $productsList = [];
        while ($row = $result->fetch()) {
            // нет ни малейшего смысла перегонять из пустого в порожнее,
            // т.е. из одного массива в другой
            $productsList[] = $row;
        }
    
        return $productsList;
    }
    Ответ написан
  • Стоит ли стажироваться на php разработчика, если у них cms Битрикс?

    php666
    @php666
    PHP-макака
    лишь только потому, что на рынке его спрос неплохой
    спрос потому, что никто не хочет идти работать с этим ужасом.

    Стоит ли стажироваться на php разработчика, если у них cms Битрикс?
    нет, нет и еще раз нет.

    Можно ли дома самому настолько разобраться во всем, чтобы был полезным на рынке?
    да
    Ответ написан
    7 комментариев
  • PHP в чем Ошибка?

    php666
    @php666
    PHP-макака
    Ответ написан
    Комментировать
  • Класс для работы с определенной таблицой?

    php666
    @php666
    PHP-макака
    Вместо
    public function getById($id) {
                $object = $this->database->query('SELECT * FROM `ACCOUNTS` WHERE `id` = ?', [ $id ])->fetch();
    
                if(isset($object->id)) {
                    $this->properties = json_decode(json_encode($object), true);
                }
            }

    должно быть так (нотация твой обертки для БД не знаю, пишу наугад):
    public function getById($id) {
                $object = $this->database->query('SELECT * FROM ? WHERE `id` = ?', [ $this->table, $id ])->fetch();
    
                if(isset($object->id)) {
                    $this->properties = json_decode(json_encode($object), true);
                }
            }

    т.е. если ты делаешь класс аля ActiveRecord, то уж сделай наследование от базового класса, в котором будут все методы высшего уровня типа getById (и не get, а findById). А конкретные классы должны просто от него наследоваться и иметь знания о $this->table - либо определять для каждого конкретного класса их вручную, либо с помощью какой-то магии.

    В целом, всё не плохо и правильно, ты даже ввел свойство updated, за это отдельный респект.

    Только я не понял этого:

    if(isset($object->id)) {
                    $this->properties = json_decode(json_encode($object), true);
                }


    я не могу представить как сделать получение нескольких записей + к каждой этой записи добавить метод save
    метод findCollectionById, к примеру. Возвращает тебе массив объектов. Проходишься циклом по этому массиву и для каждого объекта вызываешь save()
    Ответ написан
    Комментировать
  • С чего начинать разработку движка?

    php666
    @php666
    PHP-макака
    Правильный ответ звучит так - начинать разработку движка не надо.
    Это, безусловно, дает +100 очков к знаниям, сужу по себе, тк разрабатывал свой "движок" несколько лет.
    Но с практической точки зрения это потеря времени и прямой путь к выгоранию.

    По сути, если бы ты был строителем, твой вопрос звучал бы примерно так: с чего начать строительство многоэтажного небоскреба. Очевидно, что небоскребы не строятся в одиночку. Так же и с движками. Никто не делает сейчас движки. У тебя не хватит жизни на это, ибо в нынешнее время любой "движок", в твоей терминологии, это совокупность множества очень сложных, отлаженных независимых компонентов, над каждым из которых трудились десятки людей.

    Ты не напишешь ничего. А что напишешь - будет куском г-на, который не нужен будет даже тебе.
    Сейчас всё что угодно можно скачать в два клика, установить и сразу использовать.
    Займись чем-нибудь более полезным.
    Ответ написан
    2 комментария
  • Ошибка в коде, синтаксис или что?

    Комментировать
  • Попинайте. Работодатель сказал, что у меня код PHP устаревший. В чем именно проблемы?

    php666
    @php666
    PHP-макака
    die ( mysql_error () );
    последние 10 лет программил
    на зоне программил с отсутствием интернета?

    По факту отстал настолько, что можно смело искать другую работу. Точнее не отстал, а даже не вышел за пределы новичка.

    Правда, ищи другую работу. Тебя просто порвут по скилам молодые мальчики.
    Ответ написан
    Комментировать
  • PHP стоит ли изучать язык по материалам 2015 года?

    php666
    @php666
    PHP-макака
    Изучать пхп можно и по книжкам уровня PHP4, ничего кардинально нового, кроме объектной модели, в языке с тех пор не появилось. Код, написанный на PHP4 исправно работает на PHP7 с минимальным количеством правок, которые разруливаются за 5 минут работы.
    Ответ написан
    Комментировать
  • Считать ли опыт разработки под битрикс полноценным опытом в php?

    php666
    @php666
    PHP-макака
    Кто видел код битрикса, тому АД не страшен.
    Ответ написан
    Комментировать
  • Хорошая книга по ООП?

    php666
    @php666
    PHP-макака
    Ответ написан
    Комментировать
  • PHP, как отфильтровать нежелательные символы UTF-8 в текстовой строке?

    php666
    @php666
    PHP-макака
    при дальнейшем выводе в браузере может получиться каша
    что значит каша?
    В какой кодировке данные в базе? В какой кодировке ответ сервера?

    Есть мнение, что надо просто унифицировать кодировку проекта к utf8mb4 и не заниматься ерундой.
    Ответ написан
    Комментировать
  • Как изучить быстро php?

    php666
    @php666
    PHP-макака
    Как изучить быстро php?
    никак
    Ответ написан
    Комментировать
  • Что лучше использовать для корзины покупок?

    php666
    @php666
    PHP-макака
    Но есть люди которые запрещают их использование путем установок некоторых расширении в браузеры.
    это их проблемы

    корзина будет работать для абсолютно любых пользователей, авторизованных и просто гостей
    на почитай.
    в статье рассматривается пример с накоплением статистики просмотренных товаром анонимного пользователя, который впоследствии регистрируется и эта статистика привязывается к его аккаунту. идеально подходит под твою задачу - аноним добавляет товары в корзину, во временном хранилище в БД хранишь UID пользователя и товары, при обработке формы делаешь скрытую регистрацию. будут вопросы - спрашивай.
    Ответ написан
    1 комментарий
  • Правильно ли реализованы классы?

    php666
    @php666
    PHP-макака
    Высокоуровневые методы (например, find****) должны быть обёрткой над кодом, который использует билдер запросов. У тебя дубляж низкоуровневого кода работы с PDO повсеместно.

    Когда я свою ORM писал, у меня это выглядело так:

    // высокоуровневый метод делающий ТОЛЬКО выборку по id
        public function findModelById($id): Model
        {
                return $this->findModelByParams(
                    array('where' => array('`id` = ?i' => array($id)))
                );
        }
    
        // УНИВЕРСАЛЬНЫЙ низкоуровневый метод, находящий объект модели по любым параметрам
        public final function findModelByParams(array $params=array()): Model
        {
            $res = parent::createQuerySelect($params);
    
            $object = $this->createModelFromDatabaseResult( is_object($res) && $res->getNumRows() ? $res->fetch_assoc() : array() );
    
            return $object;
        }
    
        // построитель любого sql-запроса на SELECT, его исполнение и возвращение объекта типа РЕЗУЛЬТАТ
        protected final function createQuerySelect(array $params)
        {
            $params = self::makeSqlFromParams($params); // это сам билдер!!!!!!!!!!!!!!
    
            $sql = 'SELECT' . $params['what'] . 'FROM ?f' . $params['join'] . $params['where'] . $params['order'] . $params['limit'];
    
            array_unshift($params['args'], $this->getTableName());
            array_unshift($params['args'], $sql);
    
            $result = call_user_func_array(array($this->getDb(), 'query'), $params['args']);
    
            return $result;
        }


    Аналогично был метод на удаление:

    protected final function createQueryDelete(array $params)
        {
            $params = self::makeSqlFromParams($params);
    
            $sql = 'DELETE FROM ?f ' . $params['where'] . $params['limit'];
    
            array_unshift($params['args'], $this->getTableName());
            array_unshift($params['args'], $sql);
    
            return call_user_func_array(array($this->getDb(), 'query'), $params['args']);
        }


    insert/update в подобном билдере не нуждались, они были частью метода save, в точности как у тебя.

    Твоя обертка будет работать, но дубляжа кода много, это прям бросается в глаза. Ты можешь не писать билдер запросов, но тогда ты будешь описывать каждый новый метод и в каждом методе у тебя везде будет написано одно и тоже - prepare/execute/fetch

    Это всё будет давить, особенно когда тебе понадобится сделать методы типа findUserByIdOrNameAndSurname($id, $name, $surname)
    где нужно будет исполнить запрос вида select * from users where id = ? OR name = ? AND surname = ?

    Тут уже не спасет твой метод findByAttribute.

    Тебе захочется иметь "красивый" метод высокого уровня, в итоге ты либо напишешь его в привычной стилистике

    public static function findUserByIdOrNameAndSurname($id, $name, $surname)
        {
            $stmt = self::$db->prepare('SELECT * FROM `' . static::getTableName() . '` WHERE id = ? or name = ? and surname = ?');
            $stmt->execute([$id, $name, $surname]); // или как тут правильно, не знаю..
            $r = $stmt->fetch();
    
            return $r ? new static($r) : null;
        }


    либо сам придешь к необходимости создать метод findModelBySql($sql).

    Но и то и то будет нагромождением повторяющихся кусков кода.

    spoiler
    PS дзен AR ты познал, крайне советую остановиться и не повторять моих ошибок. Я тоже писал свою ОРМ, только это никому нахер не нужно. И твоя ОРМ тоже не нужна, даже тебе. Есть проверенные решения, тот же eloquent. Не занимайся ерундой.
    Ответ написан
    Комментировать
  • Как убрать php-врезки из html?

    php666
    @php666
    PHP-макака
    или комбинировать html с php это нормально и так и надо делать?
    если ты посмотришь на "скомпилированный" шаблона код ЛЮБОГО php-шаблонизатора, будь то smarty или что-то поновее, то увидишь, что в итоге получается html-шаблон со вставками php. Это абсолютно нормально.

    Ну и на статью на эту тему.
    Ответ написан
    Комментировать
  • Зачем Laravel/Symfony/etc если можно собрать из библиотек свой «фреймворк солянку»?

    php666
    @php666
    PHP-макака
    Ведь они тащат за собой кучу ненужных вещей
    заблуждение. Не надо думать, что ты умнее коллективного мозга опенсорс-проектов. Всё там нужно, а если и не нужно конкретно тебе, то скорее всего потому, что ты не прочитал доки и не знаешь, какие возможности дает тот или иной пакет.

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

    если можно собрать из библиотек свой «фреймворк солянку»?
    ты соберешь хорошую машину из солянки запчастей ВАЗа, БМВ и Тойоты? При большом опыте работы с этими машинами - возможно. Только это сизифов труд.
    Ответ написан
    5 комментариев
  • Чем чревато использование модификатора public?

    php666
    @php666
    PHP-макака
    чем же всё-таки на реальном примере чревато использование public
    Ну смотри.
    Представь себе, что ты - объект, а все твои свойства (сердце, печень, желудок) - публичные. Я могу к тебе подойти, тыкнуть пальцем в сердце и ты помрешь. Так же и в объектах - те свойства, которые ответственны за работоспособность объекта класса, которые не должны быть доступны извне, делают private/protected.

    Как в закрытое свойств (желудок) поместить еду? Сделаем публичный метод ЕСТЬ(), который поместит туда еду. На вход подаем пищу.
    Зачем нужен метод, если, теоретически, желудок можно было бы сделать public и класть в него пищу напрямую, с помощью лопаты? Очевидно, метод ЕСТЬ() имеет кое-какую проверку входящих данных. Например, если ты засунешь себе в рот тухлятину, то эта "еда" просто не пойдет дальше - сработает рвотный рефлекс.
    Такая же аналогия с программированием - хорошая практика - делать т.н. сеттеры/геттеры методы, которые принимают и возвращают свойства объектов. На эти методы можно повесть некую логику. Например, при установки свойства проверять его корректность, а при возвращении - отдавать в определенном формате.

    Когда нужны public-свойства? В очень редких случаях, например когда объект выполняет роль некого хранилища, например это \stdClass -объект верхнего уровня PHP. Но в реальной разработке это очень редкие явления.
    Все классы должны иметь закрытые свойства, а для манипуляции с ними - геттеры/сеттеры. Это хорошая практика.

    Ну и пример банальный:

    // класс для работы с mysql
    class Database
    {
        /**
         * Ресурс соединения с mysql 
         * @var mysqli
         */
        public $connection;
    
        public function __construct()
        {
            $this->connection = mysqli_connect(/**/);
        }
    }
    
    $db = new Database();
    
    // какой-то петя в коде написал случайно:
    $db->connection = 123; // все сломалось
    Ответ написан
    1 комментарий