• Вопрос по внедрению CRM?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1c крутится на сервере, а у бухгалтера - только клиент.
    Ответ написан
  • Как создать данамический PHP-сайт?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Почитайте: Попросили проверить код, на что смотреть нужно?

    Подскажите ресурс, где я смогу найти разложенную по полочкам для новичков "дорожную карту" по созданию динамических сайтов.

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

    Ресурс, который отвечал бы на банальные вопросы.

    Вы уже на нем.

    Те интересует не сам язык, а опорные точки.

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если мало времени, то выбирайте Erlang
    Ответ написан
    Комментировать
  • Как начать работать с Docker?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Контейнер дохнет, если основной процесс внутри закончился. Смотрите логи
    docker logs НАЗВАНИЕ_КОНТЕЙНЕРА
    НАЗВАНИЕ_КОНТЕЙНЕРА вытягиваем через
    docker ps -a
    Ответ написан
    5 комментариев
  • Как в 20 17 учить node.js?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Изучение nodejs чем-то принципиально отличается от изучения других платформ / языков?))
    Идете в книжный, просите книгу, читаете произвольный абзац гдето по средине. Если ввобще не понятно о чем написано - книга вам не подходит, просите другую.
    Читаете и практикуете.
    Ответ написан
    8 комментариев
  • Что за структура функции в Go?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    book - это структура, методом которой является эта функция
    Ответ написан
    9 комментариев
  • Как PHP работает с ОЗУ?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Имеет смысл явно дергать gc_collect_cycles в конце обработки каждой пачки данных, так как GC может запуститься слишком поздно.
    Для исследования куда утекает - xhprof
    Ответ написан
    Комментировать
  • CMS Для серьезных проектов как банк и т.д?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    CMS Для серьезных проектов как банк и т.д?

    У серьезных проектов, как правило, фронт - это маленькая часть проекта. Бизнес логика уникальна и сложна, так что выбирать cms для этого - очень хреновая затея. Иначе придется "воевать" с этой cms. По моему исключением может быть разве что Magento.
    Ответ написан
  • Почему не работает этот код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    "$arr[0][$x]"
    Зачем вы вообще это делаете?)) Так не пишут, интерпретатор трактует это как
    $arr . '[0][' . $x . ']'

    Если вам нужно приведение типа $arr[0][55] то это делается по другому

    substr((string) $arr[0][55], 7);
    Ответ написан
    2 комментария
  • Как распарсить json?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    JSON парсится с помощью стандартного пакета json. Если в структуру - поля должны быть экспортируемыми, в те, что с маленькой буквы - вставка данные вставляться не будут. Ну, разве что вы имплементируете интерфейс json.Unmarshaler
    Ответ написан
  • Зачем пользовательский тип в go?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если тип посложнее, например такой map[string][]my_package.MyStructure
    Ответ написан
    Комментировать
  • Локальная разработка и Docker?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. GIT не относится не посредственно окружения для вашего кода, так что его имеет смысл использовать глобальный. А вот всякие composer / php / node / gulp / yarn /... - это часть окружения для выполнения, и их лучше держать прямо в контейнере.

    Ладно там PHP со своими версиями, но эти же обычно обратносовместимы и не трубуют хранения зоопарка версий.

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

    Да и PhpStorm можно один раз настроить указав путь в Git, ноде, File Watchers.

    Это да.

    Ведь с докером мне на каждом проекте все эти минификаторы, композеры указывать заново?

    Да

    Действительно ли оправдано использовать Docker одному или небольшой группой?

    Да. Например хотите посмотреть проект годичной давности, но обратная совместимость зависимостей вашего проекта потеряна, такое сплошь и рядом.

    Возможно, мои проекты не такого уровня, но мне действительно не критично воссоздать dev и prod окружение 1 в 1.

    1 в 1 никто и не создает, а вот максимально похоже по стеку технологий - вот это правильно.

    Ну и пусть там на боевом крутится php 5.6, когда у меня 7.1.

    В таком окружении смысла нема. Ваш код будет работать по другому, на боевом сервере и на вирутальном окружении.

    А если ты разрабатываешь с нуля и не знаешь какая будет конфигурация на боевом?

    Ко боевому можно предъявлять требования.

    Действительно ли деплой так прост, что заменяет все фтп-заливки, jenkins'ы, git-пуллы?

    Нет
    Ответ написан
    Комментировать
  • Какие требования для web-developer php?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    с какими каркасами он должен работать

    какие дополнительные (или основные) фрейм-ворки должен знать для наших задач

    Этот вопрос нужно задавать человеку, для которого вы ищите специалиста. Техническое собеседование вы вряд ли сможете сделать самостоятельно.

    Помогите, пожалуста, определить требования и критерии отбора, которые помогут найти нужного специалиста

    Судя по требованиям вам нужна целая команда, так как зона ответственности довольно большая.
    Ответ написан
  • Как работать за двумя ПК?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1) Хз, узелок на палец повесьте
    2) У гита с этип проблем не особо. Если же у вас инет слабенький - щито поделать
    3) Используйте подходящую файловую систему
    4) Можете docker попробовать

    Резюмируя: похоже на системную ошибку шины между компьютером и стулом.
    Ответ написан
    2 комментария
  • Стоит ли изучать паттерны проектирования, если ты всю жизнь будешь писать на фреймворках?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Стоит ли изучать паттерны проектирования, если ты всю жизнь будешь писать на фреймворках?

    Стоит ли пить вино, если всю жизнь будешь есть сыр?

    Изучать стоит, что бы понимать, зачем в том, или ином фреймворке использован подход А, а не подход Б. Или почему, например, laravel - сборник антипрактик.
    Ответ написан
    Комментировать
  • Кто может дать комментарии по поводу кода PHP ООП (Code review)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если в двух словах, ваш класс - днище. Вы попытались объединить вместе принципиально разные вещи, что не правильно. SOLID - это важно.
    Что касается оформления - PSR-1, PSR-2, PSR-4 - учим и используем.
    Юзайте скалярный тайпхинтинг, с ним реально проще жить.

    Собсно какие сущности у вас объеденены:
    1. Система инициализации подключения к БД. У вас это просто хардкод, даже хардкор. Во вне этого класса создаем PDO и передаем аргументом конструктора.
    2. Хранилище иерархических данных (ваши get и set) их вполне можно оставить, только добавьте валидацию.
    3. Исключения:
    - \InvalidArgumentException - "ты впихнул какую-то хрень"
    - \DomainException - "ошибка данных", например пользователя с таким логином нет.
    - \LogicalException - "я хз как такое произошло", например удаляем не существующий файл
    - \RuntimeException - "я хз, что с этим делать", например пытаемся записать в файл, который кто-то удалил
    4. Сериализатор, его тоже не помешает вынести и JSON в бд хранить - плохая идея
    5. Работу с БД стоит вынести в отдельный класс Repository

    <?php
    
    declare(strict_types=1); // !!!! Забыли
    
    namespace MyVendor\MyProject\Path\To; // !!!! Забыли 
    
    /**
     * Class treeData
     * Singleton класс для работы с многомерными пользовательскими массивами
     */
    
    // !!!! Начну с далека: Singleton - антипаттерн, пока что переваривайте эту информацию
    
    class treeData
    {
    
        protected static $_instance, $data, $pdo, $id;
    
        /**
         * @param $id
         * @return treeData
         * @throws Exception
         */
        public static function getInstance(/* !!!! используйте скалярный тайпхинтинг */$id) { // !!!! Не используйте статические методы
            if (self::$_instance === null) {
                self::$_instance = new self($id);
            } else {
                // !!!! 
                throw new Exception("Попытка повторного создания экземпляра Singleton класса");
            }
            return self::$_instance;
        }
    
        /**
         * Соединение с БД
         * @return PDO // !!!! может \PDO?
         */
        private static function db(){ // !!!! Не используйте статические методы
            // !!!! Этому методу тут не место. Connection к БД - это вполне отдельная сущность, а у вас это захардкоженное создание PDO
            $host = '127.0.0.1';
            $db = 'for_test';
            $user = 'root';
            $pass = '';
            $charset = 'utf8';
            $dsn = "mysql:host=$host;dbname=$db;charset=$charset";
            try {
                $pdo = new PDO($dsn, $user, $pass);
            }
            catch (PDOException $e){
                die($e->getMessage());
            }
            return $pdo;
        }
    
        /**
         * @param $id // !!!! А тип где?
         * @return mixed
         */
        private static function getFromDb(/* !!!! используйте скалярный тайпхинтинг */$id){ // !!!! Я понять не могу, вот зачем вам этот метод?
            // !!!! БД - отдельно, претрубации с деревом - отдельно, не мешайте все в кучу!
            $sql = "SELECT `data` FROM tree2 WHERE id = ? LIMIT 1";
            $stmt = self::$pdo->prepare($sql);
            $stmt->execute(array($id));
            $row = $stmt->fetch(PDO::FETCH_LAZY);
    
            return $row;
        }
    
        /**
         * Сохранение в БД.
         */
        private static function saveToDb() {// !!!! Я понять не могу, вот зачем вам этот метод?
            // !!!! БД - отдельно, претрубации с деревом - отдельно, не мешайте все в кучу!
            $sql = "UPDATE tree2 SET `data` = :data WHERE id = :id";
            $stmt = self::$pdo->prepare($sql);
            $stmt->execute(array(':id' => self::$id, ':data' => self::mySerialize(self::$data)));
        }
    
        /**
         * treeData constructor.
         * @param $id // !!!! Указать требуемый тип религия не позволяет?))
         * @throws Exception
         */
        private  function __construct(/* !!!! используйте скалярный тайпхинтинг */$id) {
            if(!is_int($id)){
                throw new Exception("ИД пользователя должно быть целым числом.");
            }// !!!! А что если id = -256?
            self::$pdo = self::db();
            self::$id = $id;
            $row = self::getFromDb($id);
            $data = $row['data'];
    
            //Подготовка данных
            if(empty($data)){ //Массив пуст, создаем новый
                self::$data = array();
            } else{ //Работаем с данными
                self::$data = self::myDeserialize($data);
            }
        }
    
        /**
         * Для предотвращения возможного клонирования объекта
         */
        private function __clone() { //запрещаем клонирование объекта модификатором private
        }
    
        /**
         * Статическая функция для сериализации масива
         * @param $data
         * @return string
         */
        private static function mySerialize(/* !!!! используйте скалярный тайпхинтинг */$data){ // !!!! Зачем сериализация в классе по работе с БД?
            return json_encode(serialize($data));
        }
    
        /**
         * Статическая функция для десиарилизации массива
         * @param $data
         * @return mixed
         */
        private static function myDeserialize(/* !!!! используйте скалярный тайпхинтинг */$data){ // !!!! Зачем десериализация в классе по работе с БД?
            return unserialize(json_decode($data));
        }
    
        /**
         * Обеспечивает возможность получения конкретной переменной из приватной переменной data
         * @param String $path // !!!! В php нет типа String, есть string
         * @return array
         * @throws Exception
         */
        public static function get(/* !!!! используйте скалярный тайпхинтинг */$path){ // !!!! get что?
            // !!!! Что если path - исключение?
            $pathArray = explode('/', $path); //Получаю массив с путем
            $level = self::$data; //Начальный массив
            foreach ($pathArray as $key){
                if(array_key_exists($key, $level)){
                    $level = $level[$key];
                } else {
                    throw new Exception("Индекса '$key' не существует");
                }
            }
            return $level;
        }
    
        /**
         * беспечивает возможность установки новой или замещения текущей переменной.
         * @param $path // !!!! где типы данных?
         * @param $value
         */
        public static function set(/* !!!! используйте скалярный тайпхинтинг */$path, $value){ // !!!! set что?
            // !!!! Что если path - исключение?
            //Получаем путь
            $pathArray = explode('/', $path);
            //Вносим в массив данные
            $level =& self::$data;
            foreach ($pathArray as $key) {
                if (!array_key_exists($key, $level) or !is_array($level[$key])) {
                    $level[$key] = [];
                }
                $level =& $level[$key];
            }
            if(is_array($level) && is_array($value)){
                $level = array_merge($level, $value);
            } else {
                $level = $value;
            }
            //Запись в БД
            self::saveToDb();
    
        }
    
    }
    Ответ написан
    Комментировать
  • Как определиться с зарплатой?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Умиляют меня такие вакансии)) специалист который им соответсвует стоит 3к$ минимум (по меркам Киева). На самом же деле ищется затычка во все дыры, согласный работать за еду, и не понимающий, что опыта тут он не особо получит.
    Ответ написан
    5 комментариев
  • Laravel vs Yii vs Symfony для проект требовательного к скорости?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Laravel vs Yii vs Symfony для проект требовательного к скорости?

    Вообще говоря для скорости - не php.

    Для небольших проектов - yii. Для средних и больших - Symfony. Laravel - люто не рекомендую (увы этот фреймворк - солянка из антипрактик).

    Но все зависит от конкретной задачи. Дело в том, что фреймворк должен помогать вам в написании приложения. Тот же Lumen - по сути роутер с хэлперами, Silex - грубо говоря да, только эти хэлперы - компоненты Symfony. Если вам этого достаточно - смело трогайте Silex.
    Ответ написан
    Комментировать
  • Обнулить и сохранить?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Зачем вам 2 запроса?
    UPDATE `table`
    SET `active` = IF(`id` = :id, 1, 0);
    Ответ написан
    Комментировать