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

    @Vitsliputsli
    Максим Федоров, спасибо большое за пример, теперь понятно о чем речь. Да, здесь уже функциональное, но зачем функциональное маскировать под ООП, сделали бы обычными функциями, было бы очевиднее. При процедурном или ООП подходе все выглядело бы еще проще, не проще только, если нужно переиспользование, но и здесь сохранить последовательность шагов не сильно усложнит код. И это я говорю без учета того, что там еще что наверчено внутри класса pipeline.
    ООП не процедурное программирование, от слова совсем. Да, в ООП зачастую не обойтись без отдельных процедурных вещей, впрочем как и в функциональном. Так что это заявление бессмысленно. Но в ООП это используется на нижнем уровне, и вы прекрасно можете использовать ООП по назначению - структурировать код. В функциональном не обойтись без процедурного на самом верхнем уровне, потому как структурировать функционально проблематично.
    Впрочем, спорить о ООП, функционально и процедурном бессмысленно. Я это уже подчеркивал выше, нравится вам функциональный - используйте, хоть прям внутри метода объекта, но маскировать функциональное программирование под ООП - это странно. А вытаскивать функциональное на верхний уровень параллельно с ООП - опасный подход. И выглядит это прекрасно только в примитивном примере с арифметическими опреациями над одной переменной и засчет отказа от функциональной записи и последовательного применения функций. Как-только будет чтото сложное - начнется ад, никто не пишет DSL функционально, поэтому фича забавная, но не более того.
  • Зачем в обычном проекте может понадобиться использование __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,
    дело в том что вы просто нарисовались здесь не принеся ни байта полезной информации. Во мне ли дело или в вас пустословах?

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