Задать вопрос
  • Зачем в обычном проекте может понадобиться использование __invoke?

    @Vitsliputsli
    Роми, только, если вы завязались на тип callable и не можете с него слезть.
    Т.е. у вас есть метод:
    function method(callable $func)
    Вы можете создать мутанта $mut и скармливать его:
    $class->method($mut)
    а можете создать обычный объект Common $obj с методом methodLikeInvoke:
    $class->method([$mut,'methodLikeInvoke'])
    или так, как вы писали выше:
    $class->method('Common::methodLikeInvoke')
    Вариант с мутантом, работает, потому как можно сделать так $mut(). Это чистой воды процедурный подход, вы создали функцию и потом ее вызываете, в код случайно затесались какие-то объекты, но это уже не ООП.
    Еще раз, если вы используете процедурный подход, то вопросов нет, но если вы пишите с помощью ООП, то все эти функции из процедурщины нужно заменить на нормальные объекты. Чтото вроде такого:
    function method(ActionInterface $action) {
        return $action->methodLikeInvoke();
    }
    
    Interface ActionInterface 
    {
        public function methodLikeInvoke() : bool
    }
    Class Action implements ActionInterface
    {
        public function methodLikeInvoke() { ... }
    }

    Все, все в рамках ООП, используются объекты, никакой процедурщины, никаких процедурных функций, который нужно маскировать под объекты, никаких процедурных вызовов, контракты описаны, с указанием типов, никаких callable, которые не несет никакой информации о бизнес-объекте, а просто говорят что это функция, т.е. еще одна часть из процедурного подхода.
  • Зачем в обычном проекте может понадобиться использование __invoke?

    @Vitsliputsli
    Максим Федоров, ну где здесь функциональный? Функциональный это совсем другое, это функция в математическом понимании.
    Если вы объявляете функцию, а потом ее вызываете - это чистый процедурный подход. Если вы функцию замаскировали под объект, но все равно все работает как в предыдущем предложении - это процедурный подход. Если вы в классе наделали статических функций и вызываете только их - это процедурный подход со странным неймспейсами через классы.
    в любом случае в invoke и ответственность закрывается одна
    в случае паттернов появляется гибкость, да одни плюсы, минусов просто нет... не понимаю вас

    Это вам хочется верить, что ответственность одна, потому что у недообъекта только один метод-функция, ответственность абсолютно от этого не зависит, даже в одном методе можно нафигачить все что угодно.
    Второе предложение вообще не понял. О каких паттернах идет речь? И что за плюсы и минусы, можно их перечислить?
  • Зачем в обычном проекте может понадобиться использование __invoke?

    @Vitsliputsli
    Максим Федоров,
    вы ошибаетесь, если представить процесс объектом, то как раз его функциональное представление — наиболее лаконичное и целостное представление

    Если "масло масленное", то назовите
    $validator->process($obj)
    да, немного подлиннее, чем
    $validator($obj)
    но несколько лишних символов, это не та проблема, которую нужно решать путем ввода новой сущности мутанта "объект-функция" и переходом от ООП стиля к процедурному.

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

    @Vitsliputsli
    Максим Федоров,
    а вот так лаконично
    class Validator {
    public function __invoke($data)
    }

    $validator($obj)

    а вот так еще лаконичнее:
    function validate($data)
    validate($obj)

    В ООП мы вводим объекты не потому что так лаконичнее, а потому что с их помощью структурируем код, поэтому зачастую приходится писать даже больше. Если вы пишите в процедурном стиле и объекты в него затесались случайно, то это норм, но это не ООП,
  • Зачем в обычном проекте может понадобиться использование __invoke?

    @Vitsliputsli
    Роми, процедурное, функциональное. Но я имел ввиду другое, если используем ООП, значит ориентироваться должны на объекты, а не на функции.
    А давайте посмотрим на этот метод:
    Guard

    /**
         * Retrieve the authenticated user for the incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @return mixed
         */
        public function __invoke(Request $request)
        {
            if ($user = $this->auth->guard(config('sanctum.guard', 'web'))->user()) {
                return $this->supportsTokens($user)
                            ? $user->withAccessToken(new TransientToken)
                            : $user;
            }
    
            if ($token = $request->bearerToken()) {
                $model = Sanctum::$personalAccessTokenModel;
    
                $accessToken = $model::findToken($token);
    
                if (! $accessToken ||
                    ($this->expiration &&
                     $accessToken->created_at->lte(now()->subMinutes($this->expiration)))) {
                    return;
                }
    
                return $this->supportsTokens($accessToken->tokenable) ? $accessToken->tokenable->withAccessToken(
                    tap($accessToken->forceFill(['last_used_at' => now()]))->save()
                ) : null;
            }
        }


    Круто, что есть описание: "Retrieve the authenticated user for the incoming request.", но почему-то return mixed, с чего бы это, если вроде как нам должен быть возвращен user, Почему не return User ?
    Внутри еще интересней:
    return $accessToken->tokenable->withAccessToken(
                    tap($accessToken->forceFill(['last_used_at' => now()]))->save()
                )

    Что это? save неожиданно что-то вернет и это будет "authenticated user"? Я бы не сказал, что это очень понятный код, поэтому invoke используется скорее всего просто потому, что автору так нравится.
  • Зачем в обычном проекте может понадобиться использование __invoke?

    @Vitsliputsli
    Роми,
    Но я все равно не понял :)
    А почему мы просто не можем вызвать
    SomeClass::someStaticMethodInsteadInvoke()
    в чем именно преимущество Invoke перед обычными методами?
    // я просто пытаюсь понять, могу ли я где-то применить Invoke в своих проектах, и главное: нужно ли мне это?))

    Правильно, что не поняли, т.к. вам никто и не ответил.
    Совершенно верно, можно просто указать метод, там где тип callable, и разницы нет никакой.
    А можно как, выше написал Лентюй, просто вызвать метод класса, а его необходимость описать в интерфейсе без всяких callable вовсе.
    Если вы используете ООП, то invoke вам не нужен, оперируйте объектами, а не функциями, и не мутантами вида "объект как функция".
  • Как защититься от двойного списания в многопоточном приложении?

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

    А вы применяли этот уровень изоляции на хорошо нагруженной системе?
  • Как защититься от двойного списания в многопоточном приложении?

    @Vitsliputsli
    DevMan, просто транзакции здесь недостаточно.

    Stalker_RED, а если 2 разных запроса с разными order_id?

    user_of_toster, а вы применяли его на хорошо нагруженной системе?
  • Как можно ускорить работу Exception?

    @Vitsliputsli
    Максим Федоров, 15000 исключений при работе с СУБД, это 15000 ошибочных sql-запросов, так? Я не могу придумать ни одного варианта, когда такое было бы оправдано.
  • Как можно ускорить работу Exception?

    @Vitsliputsli
    Максим Федоров, да это я понял, но мне интересен пример бизнес-логики, которая при нормальной работе использует 15000 исключений.
  • Как можно ускорить работу Exception?

    @Vitsliputsli
    HellWalk,
    мне не интересно сейчас спорить по поводу терминов.

    Для меня удаление 99 из 100 Exception в коде - это удаление exception. Для кого-то это "правильное использование" (хотя для меня это костыли), сути правок не меняет.

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

    @Vitsliputsli
    Максим Федоров, а можно пример?
    Я понимаю ситуацию, когда мы обратились к базе, а там не нашлось объекта (например, он динамически создается) - упали в исключение, обработали его, т.е. создали нужный объект, и вернулись к нормальной работе.
    Но что за ситуация, когда нужно 15000 исключений?
  • Как можно ускорить работу Exception?

    @Vitsliputsli
    HellWalk, неа, он говорит об использовании исключений по их назначению - для исключительных ситуаций.
  • Как устроиться консультантом по ИБ?

    @Vitsliputsli
    Круто, подводя итог, с тем, кто соответствует хотелкам конторы.
  • Как улучшить код?

    @Vitsliputsli
    Удалите все и будет идеально.
    Иначе, не совсем хорошо расписан phpdoc, плохо выбрано название, и т. д., и т. п. Конечно, все это так. Но работающий код гораздо эффективнее грёз об идеальном. Это не значит что нужно писать говно, просто находить баланс между сроками и требованиями, и кодом, который им удовлетворяет. Да, нужно правильно выбирать названия методам и переменным, но мы все не идеальны. Да, нужны проверки и защиты, но не всюду и везде.
    Поэтому в отрыве от всего кода, вопрос бессмысленен.
    Хотя вопрос есть, вы что phpdoc вручную писали? Есть же ide.
  • Сколько времени должен занимать такой запрос MySQL?

    @Vitsliputsli
    Откуда взялись индексы умноженные на 2? И почему только индексы, он и сами данные запихнул в память, быть может даже полностью.
  • Есть ли такая книга-учебник по PHP, в которой описан стиль программирования близкий к эталону?

    @Vitsliputsli
    Роми, стандарт в php - это PSR. В ООП почти все признают SOLID и наверное GRASP, но это не стандарты, а принципы, т.к. не несут чётких требований. Всё остальное, ещё менее чёткое и ещё более спорное, в том числе шаблоны проектирования.
  • Как протестировать производительность функций начинающему php-разработчику?

    @Vitsliputsli
    AgentSmith72,
    дело в том что вы просто нарисовались здесь не принеся ни байта полезной информации. Во мне ли дело или в вас пустословах?

    так ты не меня риторически спрашивай, спроси себя. Представь говорит тебе какая-нибудь персона: "Все кругом имбицилы, которых головой роняли в детстве, и один я охрененно классный парень". Какие ты сделаешь предварительные выводы о нем?
    Тебе могут принести диск с терабайтами полезной информации, но если ты их не сможешь прочитать, они действительно бесполезны. И ладно, что не сможешь, всякое бывает, но обвинять других, если что-то не осилил, тупо.
  • Как протестировать производительность функций начинающему php-разработчику?

    @Vitsliputsli
    AgentSmith72,

    Vitsliputsli, ты ничего не понял.

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

    А ты перечитай самое первое предложение в ответе. Вся остальная дичь связана не с "твоим идеальным кодом", а с кодом который будет использоваться в том или ином "подходе". Потому как твои словесные изливания нисколько не говорят о коде, лишь о твоих поверхностных представлениях.
    Я не предлагаю тебе строить какую-то "чистую" архитектуру, я отвечаю на твой вопрос, но не прямо и тупо, потому что ты пытаешься себе отстрелить ноги, а поясняя, что ты не понял того, кто проводил ревью. Как не понимаешь меня, и походу всех окружающих. Поэтому самое время спросить себя, точно ли дело в окружающих?