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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Почитайте symfony the book
    Ответ написан
  • Как сделать парсер?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Легко, нанимаем школьника с маленькую сумму, говорим, что делать и вуаля
    Ответ написан
    Комментировать
  • Зачем делают вот такую конструкцию?

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

    чего вдруг 100 раз? 1 раз интерпретатор запустился, выполнил документа, забросил данные в opcache и в следующий раз уже с оперативки вытащит.
    Затем, что php так спроектирован, и для такого использования он хорош.
    Ответ написан
    Комментировать
  • Как PHP работает с ОЗУ?

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

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

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

    substr((string) $arr[0][55], 7);
    Ответ написан
    2 комментария
  • Какие требования для web-developer php?

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

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

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

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

    Судя по требованиям вам нужна целая команда, так как зона ответственности довольно большая.
    Ответ написан
  • Кто может дать комментарии по поводу кода 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();
    
        }
    
    }
    Ответ написан
    Комментировать
  • 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.
    Ответ написан
    Комментировать
  • Корректно ли реализована DI?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    1. Не используйте публичные свойства
    2. Для описания параметров имеет смысл использовать константы
    Ответ написан
  • А это не говнокодерство?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Читаем про PSR, так же SOLID, так же Попросили проверить код, на что смотреть нужно?
    <?php
    /**
     * Created by PhpStorm.
     * User: Ember
     * Date: 8/23/2017
     * Time: 2:47 PM
     */
    // ^^^^ Этот коментарий конечно же дофига полезный, но удалите его, он не нужен
    
    namespace Controller;
    
    
    use Model\Pageconfig; // Use CamelCase Luke!
    
    class Site extends \Controller // Не используйте такие абстрактные названия
    {
    // \Base - замечательное название, ясно понятно, что оно делает))
    // $f3 - а почему не f12?
    // $params - юзайте DTO
        public function __construct(\Base $f3, $params)
        {
    // Эээ... Это что роутер что ли?
            $pageconfig = new Pageconfig();
    // а что будет, если $params = new \Exception() ?
            $loaded = $pageconfig->load(['route = ?', $params[0]]);
    
    // В константы
            switch ($f3->get('FALLBACK')) {
    // Вообще говоря для переводов давно придуманы PO файлы, юзайте на здоровье
                case 'az':
    // Что будет, если такого ключа нет?
                    $this->setTitle($loaded['title_az']);
                    $this->setDescription($loaded['description_az']);
                    $this->setBackground($loaded['background']);
    
                    break;
    //...
            }
    
            parent::__construct();
        }
    
        public function home(\Base $f3) {
    // setContent по идее вставляет контент, а не название файла, не путайте людей!
            $this->setContent('empty.html');
        }
    
    //...
    }
    Ответ написан
    1 комментарий
  • Чего не хватает моим функциям?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    чего не хватает и вообще всей логике написания.

    качества, это ж полный П!

    Читал, что использование global ЗЛО

    Верно

    но таков стиль кода моего начальника (а у него опыт 15 лет)

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

    И да, сторонними библиотеками мы не пользуемся, только велосипеды свои.

    Это далеко не всегда так плохо, как кажется.

    Приведенный вами код - говнище, начальник ваш - юниор, почитайте на досуге почему: Попросили проверить код, на что смотреть нужно?
    Ответ написан
  • Можно ли как-нибудь вывести интервал (напр. 10-15) через PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    sprintf('%d-%d', $a, $b);
    Ответ написан
    Комментировать
  • Есть ли способы спарсить facebook?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Да, такое есть: набираете за копейки кучку школоло, даете им задачу, платите и получаете результат.
    Ответ написан
    1 комментарий
  • Сокеты - это безопасно?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    У вас какая-то каша в голове. То, что через веб сокет на сторону сервера можно послать что угодно - вполне норм, вы должны проверять все, что приходит в любой ситуации. Что дальше уже делать с проверенным сообщением - уже дело вашей бизнес логики.
    Ответ написан
    5 комментариев
  • Как сделать оптимизацию JPG и PNG на чистом PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Я правильно понимаю, вы хотите обрабатывать изображения на процессоре гипер текста?

    Конечно можно попробовать для спортивного интереса, но для реальных проектов - это плохая затея
    Ответ написан
    Комментировать
  • Как сжать видео средствами PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    a4d7b5c2db524e1680bf487ca0b107cb.jpg
    Ответ написан
    Комментировать
  • Как настроить репозиторий (API)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вы путаете вместе систему контроля версий, систему непрервыной интеграции и систему непрервыной доставки.

    Контроль версий, сборка и диплой на ваши хостинги - это разные задачи. И хотеть такое врядли стоит.

    Если же по отдельности - смотрите git, gitlab ci/cd
    Ответ написан
  • Применим ли BEM в MySQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    14132802653482.jpg
    Ответ написан
    Комментировать
  • Как организовать логирование ошибок в PHP7?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    monolog
    Ответ написан
    Комментировать