• Почему все быстро надоедает?

    php666
    @php666
    PHP-макака
    Любое действие должно давать результат.
    Нет смысла изучать что-либо просто так, как в школе изучают химию, физику, алгебру, а через месяц эти знания улетучиваются.
    Должна быть мотивация. Нужно видеть результат своих трудов.
    Ты его не видишь в виду того, что ты просто изучаешь инструмент. А изучение инструмента без реальной практики - бессмысленно, вне зависимости от того, сколько тебе лет.

    Возьми технологию и придумай себе реальную задачу - создать что-либо, законченный продукт. Это будет мотивировать тебя на данном этапе.
    Если мотивации не будет при придуманной задаче - значит, действительно, не твоё. И тут не нужно впадать в истерику, на одном IT свет клином не сошелся, это далеко не самая лучшая сфера деятельности, что бы посвятить ей всю жизнь.

    Еще я соглашусь с Юлия Бедросова. Конечно, это не совсем твой случай, тебя еще мамка кормит, но суть очень близка - если ты не получаешь морального удовлетворения от работы, то должен получать материальное. Деньги за свою работу ты еще не скоро будешь получать, это я так, к слову.

    В итоге ты сейчас не получаешь ни морального удовлетворения (в силу бессмысленности изучения этих бесконечных технологий), ни материального. И это на протяжении 1.5 лет! Твой мозг провоцирует совершенно естественную реакцию - он не хочет заниматься тем, что не даёт тебе (скажем грубо) "счастья".
    Ответ написан
    Комментировать
  • Работа в IT после 30, возможно ли?

    php666
    @php666
    PHP-макака
    Ответ написан
    Комментировать
  • Правильно ли реализованы классы?

    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. Не занимайся ерундой.
    Ответ написан
    Комментировать
  • Как обстоит дело с корпоративами в западных компаниях?

    php666
    @php666
    PHP-макака
    Будучи интровертом
    Интроверты (или то, что мы обычно вкладываем в это понятие) работают водителями на газелях/дальнобоях. Там уж точно никаких контактов!

    Признайся себе, в глубине души ты избегаешь не людей, а офисных задротов, тебя от них тошнит и ты их всех ненавидишь, как я!
    Ответ написан
    5 комментариев
  • Какой язык распространён для работы на фрилансе?

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

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

    мне в 21 год, после 2-х часовой лекции о комнатных рыбках в магазине потенциального заказчика, хватило мозгов понять, что мне такая сфера деятельности нахрен не сдалась.

    фриланс может существовать лишь в рамках почасовых работ с низкой квалификацией. будь то капание траншей, услуги разгрузки-погрузки или переезда. там не нужно тратит время и энергию на договоры, там все предельно просто и ясно.
    фриланс в мире it - это абсурд
    Ответ написан
    Комментировать
  • Как убрать 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 комментарий
  • Перспективы карьерного роста в интернет-провайдере?

    php666
    @php666
    PHP-макака
    Лол)
    "Интернет-провайдер" и "карьера" - слова антиподы.
    Ответ написан
  • Как правильно реализовать автозагрузку в PHP, не жертвуя использованием use?

    php666
    @php666
    PHP-макака
    Переформулируй свой вопрос.
    Ничего не понятно.
    Автозагрузка и пространства имен никак не связаны, в чем конкретно затык?
    Что значит
    Я не могу использовать use, что меня сильно напрягает
    Ответ написан
    5 комментариев
  • Как правильно сделать аутентификацию пользователя?

    php666
    @php666
    PHP-макака
    аутентификация - это не сфера класса пользователь
    аутентификация - это сфера класса Authorization (или как хотите его назовите)

    авторизация:
    $auth = new Authorization(/* передаем объект запроса или _REQUEST */);
    if ($auth->processAuthorization('login', 'password') {  // set cookies/sessions and redirect
    // redirect to other
    }


    аутентификация:
    $auth = new Authorization(/* передаем объект запроса или _REQUEST */);
    $current_user = $auth->processAuthentication(); // или null если не аутентифицировались
    Ответ написан
  • Что делать, если покраснели глаза?

    php666
    @php666
    PHP-макака
    Глаза не должны краснеть из-за ПК, это обывательский миф.
    Любое покраснение - признак расстройства или болезни.
    Только к врачу.
    Ответ написан
    Комментировать
  • Автозагрузка обязывает указывать namespace у всех классов?

    php666
    @php666
    PHP-макака
    1) С точки стандартов программирования, насколько правильно указывать у каждого класса namespace?
    да, это правильно. Один файл, один класс, который должен лежать в определенном пространстве имен.

    2) Какой подход для использования spl_autoload_register из двух перечисленных является более правильным?
    Второй. Ибо это стандарт. "Вызывать несколько раз, в качестве аргумента указав функции, подключающие классы из разных директорий" - это когда у тебя мешанина из кода и ты пытаешься всё это натянуть на современные реалии.

    Сейчас дефакто композер стандарт, не изобретай велосипед, не стоит заморачиваться на то, что само по себе практически не используется (spl_autoload_register) в проектах.

    1. Возьми композер (у меня под виндой phar работает, если запускать через php), инициализируй его у себя в проекте:
    php ../composer.phar init

    2. Создай в корне директорию в app с именем Test - это будет пространство имен App\Test, туда положи файл Test.php, в котором объяви класс Test с указанием пространства имен namespace App\Test;

    3. В файле composer.json допиши:
    {
    .....
        "autoload": {
            "psr-4": {
                "App\\": ["app/"]
            }
        }
    }

    где app - будет весь код твоего приложения, те твоих чудо-классов.
    Запусти php ../composer.phar dump-autoload

    3. Подключи лишь одну строку: require('./vendor/autoload.php');в файл индекса или в те файлы, где нужны классы с автоподгрузкой.

    4. Должно получиться это:
    5ea45cd48bcdf580929185.jpeg
    Ответ написан
    1 комментарий
  • Как создать свое приложение, используя laravel?

    php666
    @php666
    PHP-макака
    поставь это и посмотри как правильно писать
    не надо заниматься отсебятиной
    то, что ты написал - полнейшая ересь
    Ответ написан
  • Разработчик недисциплинированно трекает время. Что делать?

    php666
    @php666
    PHP-макака
    Упаси бог работать в столь токсичной среде.
    Сидеть и отчитываться за каждую минуту/час.
    Идеальный информационный концлагерь.
    Ответ написан
    7 комментариев
  • Насколько плохо все для начинающих программистов на рынке?

    php666
    @php666
    PHP-макака
    найти работу начинающему программисту сейчас невероятно сложно.
    не верно

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

    мы ищем человека на Ларавел. Мой опыт на Ларавеле - полгода. Приходят кандидаты, которые позиционируют себя как спецы по этому фреймворку с несколькими годами практики и не в состоянии ответить на тривиальные вопросы. Люди не знают, чем отличается абстрактный класс от интерфейса. О паттернах CRUD они не слышали ничего. Используя фреймворк они не знают те или иные вещи, которые просто лежат на поверхности в работе (скопы, мутаторы, аццессоры).

    Вывод один - просто надо учиться, а не считать себя самым умным. Распечатать на листке бумаги надпись "Я тупое го#но, ничего не знаю и ничего не умею" и лицезреть этот листок всю свою карьеру, что бы не было соблазна расслабляться. Тогда и работа будет.
    Ответ написан
    2 комментария
  • Что творится на рынке труда сегодня?

    php666
    @php666
    PHP-макака
    Вангую, скоро будет плохо у всех.
    Айтишники не получают деньги из неоткуда.
    Что бы заплатить айтишнику, надо иметь доход.
    Что бы нанять айтишника, надо иметь доход.

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

    Кстати, вот тут и потерпят неудачу в первую очередь те ораторы, которые всем советовали не идти работать в банки, госструктуры и прочие "бюрократические" компании, выбирая работу по принципу "офис как в гугле" с печенками и настольным теннисом.
    Ответ написан
    7 комментариев
  • Загрузка изображения перед его загрузкой. Как это делают?

    php666
    @php666
    PHP-макака
    Я так делал.

    Рисуется скрытый фрейм:
    <iframe width="0" height="0" name="iframe"></iframe>

    Рисуется форма ПОСЛЕ основной формы поста:
    Форма для загрузки изображений с кнопкой выбора файла:
     <form action="/thumbnail.php" method="post" enctype="multipart/form-data" target="iframe">
         <input type="file" name="file" id="file" />
     </form>


    При выборке картинки срабатывает событие submit и грузит её в скрытый фрейм на /thumbnail.php.
    thumbnail.php преобразовывает изображение, сохраняет на ФС, записывает кое-что в таблицу (см далее), после чего отдает путь к превью, JS из родительского окна браузера рисует блок изображения с URL этого превью.
    Рисуется в основной форме поста hidden поле вида
    <input type="hidden" name="thumbnail[]" value="123">

    где 123 - ID картинки, которую мы положили уже на сервер и записали в таблицу вида
    id | id_post | file_name | file_date
    получается что-то вроде записи
    123 | null | file.jpeg | 20-02-2020
    при посте самой формы мы делаем update, пробегаемся по массиву thumbnail из POST и у каждой записи обновляем id_post на тот, что получили в результате сохранения поста:
    update images set id_post = 1 where id = 123

    крон ходит раз в 15 минут и убивает все картинки, где id_post is null и file_date < now()-1 час
    Ответ написан
    1 комментарий
  • Cms или фреймворк?

    php666
    @php666
    PHP-макака
    Пошел на курсы backend разработки PHP
    значит, знаний ноль
    в частности упор на laravel
    все равно, что солдату из 18 века дать управлять танком Т90 хотя бы без образования средней школы и ПТУ
    структура ужасная, разобраться сложно и нет нормальной документации
    скорее всего, это твое субъективное мнение. ты увидел реальный код и испугался.
    найти работу на фреймворке
    стесняюсь спросить, а кому ты нужен на современный серьезный проект с нулевым опытом и знаниями?

    Ты посиди годика 2-3 на чудовищном коде 20-и летней давности, научись подводным камням языка, набей руку, тогда, возможно, попадешь и на фреймворк.

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