Задать вопрос
  • Обычный метод копируется для каждого объекта или PHP оптимизирует и не делает копию методов для объектов?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    У каждой функции в PHP есть два контекста: Статический и объекта. Метод - это обычная именованная функция, у которой заранее объявлены оба этих контекста. Таким образом мы получаем, что метод один и выделение памяти под него тоже одно, но для разных объектов меняется контекст (т.е. ссылка на this), а значит создание нового объекта - это всего лишь выделение this контекста для метода, т.е. тупо один адрес.

    Помимо этого, создавая новый объект память не выделяется вообще. Если объект идентичен предыдущему, то адрес нового объекта соответствует предыдущему с пометкой разделения ZVAL-структуры при мутациях (до некоторого времени даже баг был, когда функция spl_object_hash возвращала одну и ту же строчку для двух разных объектов, которые содержали одни и теже данные). Во время изменений объектов - ссылка на изменённое поле разделяется и новое значение пытается занять память тех переменных (напоминаю, что структура ZVAL едина для всех типов переменных), которые были помечены для уничтожения через GC (т.е. refcount=0), это позволяет избавиться от лишних аллокаций памяти. Такая модель поведения, например, позволяет делать клонирование (оператор clone) и инстанциирование (оператор new) объектов без выделений памяти вообще.

    P.S. Так было в какой-то из 5.х веток, когда я исследовал поведение пыха. Сейчас же, когда на носу 7.3 - я уже хз, много поменяли, хотя в основном работа была проведена по уменьшению потребления памяти zval объектами, DCE оптимизациям и AVX/SSE инструкциям, так что не думаю что сильно.
    Ответ написан
    Комментировать
  • Как построить архитектуру веб-сервиса на PHP?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Возможно, это всё не нужно и лучше использовать готовые решения, а не велосипед?

    Не возможно, а точно.

    P.S. Это даже не мини, а просто набор файлов времён php 4)))
    Ответ написан
    Комментировать
  • Простой пример SLL для docker-compose?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    composer create-project kelunik/acme-client
    php vendor/bin/acme auto


    https://github.com/kelunik/acme-client

    Только не забывай, что у тебя всё это на сервере должно быть развёрнуто, т.к. сертификат привязывается к домену.
    Ответ написан
    Комментировать
  • LARAVEL Trying to get property of non-object как исправить?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    LARAVEL Trying to get property of non-object как исправить?


    Если сообщение "нельзя обратиться к полю того, что не является объектом", то исправление простое:
    Надо попытаться получить поле у объекта, а не у чего-то другого.

    Можно не благодарить. Всегда рад помочь.
    Ответ написан
    2 комментария
  • Почему запрос к бд возвращает ошибку?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Ураааа, новая классическая дырища в сайте!

    Вы ведь понимаете, что благодаря этому коду, после того как он заработает - вас сможет взломать любой школьник?
    Ответ написан
    Комментировать
  • Можно ли в symfony динамически внедрять зависимости?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    По-умолчанию симфонёвый контейнер это не позволяет. Есть 3 варианта развития:
    1) Не сопротивляться и не использовать в этом случае контейнер, а использовать, например, фектори (т.е. чтобы контейнер возвращал этот самый фектори, который в зависимости от чего-либо возвращал нужный сервис).
    2) Если Symfony 3.x и нужен сервис в контроллерах, то можно использовать Param Resolver: https://symfony.com/doc/current/controller/argumen...
    3) Можно написать свой бридж на более мощный контейнер, например Laravel, в этом случае надо в обязательном порядке наследоваться от симфонёвого (чёртова симфонёвая кодогенерация) и зарегистрировать его внутри AppKernel (там есть метод получения класса контейнера).

    P.S. А ещё в последних симфонях добавили Service Locator механизм (слайс контейнера), в теории можно придумать что-нибудь с ним.
    Ответ написан
    3 комментария
  • Консольный скрипт php?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Правильно ли я понимаю, что т.к. PHP не асинхронный язык,

    Нет, не правильно.

    то если пользователь 1 отправил запрос (например он будет выполняться 10 секунд), а через 2 секунды пользователь 2 отправит тоже запрос, то он обработается только тогда, когда запрос от 1 юзера будет готов?


    Зависит от реализации и наличии блокирующих операций.

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

    Есть некая реализация вебсокетов на php (реализовано на основе этого).

    Феерический трешак. Ни тестов, ничего. Да и в коде глобалсы. Жесть
    Ответ написан
    Комментировать
  • Как сделать связанные мутации в GraphQL?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Я так и не понял в чём проблема.

    Схема
    type Mutation {
        works: ProtfolioMutation!
    }
    
    type ProtfolioMutation {
        add(work: WorkInput!, images: [WorkImageInput!]! = []): Response
    }
    
    input WorkInput { title: String!, ... }


    И запрос:

    mutation {
        works { add(work: {title: "My new article"}, images: [...]) }
    }
    Ответ написан
    3 комментария
  • Какие есть на C++ фрейморки для веб как Laravel на PHP?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Из похожих по возможностям в мире можно выделить только RoR (но это как бы руби).

    В C++ же "фреймворками" называется то, что идёт в самих "веб-языках" из коробки, в стандартной библиотеке языка, что можно наглядно увидеть по ссылкам выше от Станислав Макаров .

    Можно посмотреть ещё в сторону компонентов boost, вроде логгера или локализации, но очевидно, что это всего лишь пара-тройка составляющих и то, довольно топорно выполненных.
    Ответ написан
  • Как отформатировать php + html код?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    намешал php и htm

    намешаны пробел и tab

    переносы строк и скобки.


    Лучший вариант: Ctrl+A -> Delete

    Вариант чуть похуже, но тоже ничего: PhpStorm -> Ctrl+Shift+Alt+L -> Enter
    Ответ написан
    2 комментария
  • Обучение PHP: как праквильно практиковаться в нем?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Хотите практики - запилите бложик себе. Самое популярное занятие в '18ом году после туду листов
    Ответ написан
    1 комментарий
  • Как усовершенствовать функцию?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    return \collect((array)$requestTags)->map(function($tag): int {
        return \is_numeric($tag) ? (int)$tag : Tag::upsert(['name' => $tag])->id;
    });
    Ответ написан
    1 комментарий
  • Что за баг с :after?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Потому что пробелы влияют на вёрстку inline элементов.
    0 пробелов в коде: 0 в результате
    1 пробел в коде: 1 в результате
    2 пробела в коде: 1 в результате
    3 пробела в коде: 1 в результате
    4 пробела...

    Короче, магия *вжух*
    Ответ написан
    1 комментарий
  • Как правильно протестировать метод?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    mockery?
    Ответ написан
    Комментировать
  • В чем отличие контроллера от экшена?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Немного о наболевшем:

    В MVC нет экшенов. MVC работает следующим образом:
    - Во вьюхе располагается модель (например "текстовое поле")
    - Любые изменения в модели сразу же изменяют вью (изменяем текст в текстовом поле и этот текст визуализируется/рендерится)
    - Контроллер подписывается на события вьюхи (например "изменение текста в текстовом поле") и выполняет какое-либо действие, в том числе изменяет модели (ну хз, например проверяет что длина не более 10 символов. Или другой пример. Контроллер подписывается на событие нажатия кнопки "delete" и удаляет текст из модели текстового поля, а модель сразу же перерисовывается, т.к. напрямую связана с представлением).

    MVC-Process.png

    Всё это прекрасно видно на картинке, которая взята с вики: https://ru.wikipedia.org/wiki/Model-View-Controller

    В вебе реализация MVC без сокетов не возможна физически (который, к слову, в районе 80х-90х годов назывался MVCE: Model-View-Controller-Editor, не суть). Большинство существующих решений - это вариации MVP (Laravel/Symfony/etc) с небольшими нюансами. Контроллер там называются контроллерами, а не презентером по принципу GRASP и никак не связан с MVC.

    НО. Есть такая штука как коллективное мнение. Например, по правилам русского языка можно писать "парашут", а не "парашют" начиная с какого-то там 2010го года. Это теперь норма. Хз. Короче безграмотных неучей дохрена. И т.к. таких реально дохрена, кто не может отличить одно от другого и не быть неучем, то решили что назовём-ка мы это дело "MVC с пассивными моделями", потому что называть этот подход MVP слишком сложно, это же читать надо ещё, учиться, лучше будем терминами кидаться, подумают что умный.

    Так вот, к чему я веду. Классический MVP в вебе неудобен (что можно увидеть на примерах первого Zend, Phalcon и прочих догматов), по-этому добавили прослойку в виде роутера, который говорит: "По адресу /users при GET запросе отправляйся мне вот в этот класс и выполни вот этот метод", например: "$router->get('/users', 'UserClass', 'action')". Сам метод, возвращает нужную вьюшку с данными и называется "экшен", а класс, который содержит набор этих самых "экшенов" называется "контроллер" или "презентер". Во вьюшке, с помощью читов (шаблонизатора) можно указать, например, какой хедер\футер (лайаут) использовать, какой тайтл и прочее. Таким образом мы получаем разные страницы по разным адресам с разными данными, с возможностью сохранить основное оформление и пересипользовать какие-то другие куски вьюшек.
    Ответ написан
    1 комментарий
  • Как запустить проект yii2 на localhost?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Так там же докер есть.
    docker-compose up --build

    И всё. Если всё настроено нормально, то весь стек должен подняться, включая операционную систему.
    Ответ написан
    Комментировать
  • Где могут пригодиться итераторы PHP?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Ну раз нужны примеры, то что-нибудь придумаю...

    Задача следующая. Надо делать запросы к АПИ по всем доступным страницам, ну я не знаю, например полчаем статьи с хабра. Алгоритм следующий:
    - Работаем до тех пор, пока страница не является последней
    - Получаем список статей и начинаем их возвращать.
    - Как только они кончатся, проверяем, является ли текущая страница последней.
    - И так до тех пор, пока страница не кончится.

    class HabraArticles implements \IteratorAggregate 
    {
        // ...
        // Какие-то методы настроек апишки
        // ...
    
        public function getIterator(): iterable
        {
            $page = 0;
    
            do {
                $response = // запрос_к_апи?page=$page++
                yield from $response['articles'];
            } while ($response['last_page'] !== $page);
        }
    }


    И использование. Мы создаём новый объект нашего апи и настраиваем его. Как только начинаем по нему пробегаться через foreach - автоматом вызывается нужный метод интерфейса (в нашем случае getIterator, т.к. заюзали интерфейс IteratorAggregate).
    $articles = (new HabraArticles)
        ->какой_то_метод_настроек(23)
        ->ещё_какой_то_метод_настроек(42);
    
    foreach($articles as $article) {
        \var_dump($article); // Пробегаемся по всем существующим статьям и не думаем о том, как оно работает.
    }


    Схожим образом реализован, например, симфонёвый файндер: symfony.com/doc/current/components/finder.html
    Ответ написан
    1 комментарий
  • Какую кодировку выбрать для базы чтобы можно было сохранять строки на любом языке и не парить себе мозг?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Стоит везде выставить utf8mb4_unicode_ci (работает точнее при сортироваках и проч.) или utf8mb4_general_ci (чуть быстрее работает, крайне незначительно, так что имеет смысл именно первый вариант).

    P.S. Указанные выше utf8_general_ci/utf8_unicode_ci поддерживают лишь половину диапазона utf8, отсюда сохранение, например эмодзи, будет физически невозможным.

    P.P.S. Суффикс "ci" означает Case Insensitive (нечувствителность к регистру при поиске и сравнении).
    Ответ написан
    4 комментария
  • Почему в Сервисах не работают сессии?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Сессия запускается из миддлвари во время запроса/ответа. Начиная, если не путаю, с Laravel 5.2.

    Пыщ: https://github.com/laravel/laravel/blob/master/app...

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