Плагин Magento2 вокруг метода, различного между параметрами callable и Closure, для параметра $ continue

12

Я проверил magento2, есть два типа параметров, которые можно отправить

вокруг метода

  • \Closure $proceed пример aroundSave(\Magento\Catalog\Model\Product $subject, \callable $proceed)
  • \callable $proceed пример aroundSave(\Magento\Catalog\Model\Product $subject, \Closure $proceed)

Теперь мой вопрос:

  1. Чем отличается замыкание от вызываемого?
  2. Зачем использовать мы определяем два разных типа для параметра $ continue?
  3. Каковы использование этих двух типов параметров?

Могу ли я описать это подробно

Амит Бера
источник
1
Хороший вопрос! Амит
Ракеш Джесадия
может кто-нибудь объяснить это снова простыми словами? это будет очень полезно
Аравинд

Ответы:

9

У вас есть ответ здесь: https://stackoverflow.com/a/29730810/4629261

Разница в том, что [ Closure] должна быть анонимной функцией, где [ callable] также может быть нормальной функцией.

Вы можете увидеть / проверить это на примере ниже, и вы увидите, что вы получите ошибку для первого:

function callFunc1(Closure $closure) {
    $closure();
}

function callFunc2(Callable $callback) {
    $callback();
}

function xy() {
    echo 'Hello, World!';
}

callFunc1("xy"); // Catchable fatal error: Argument 1 passed to callFunc1() must be an instance of Closure, string given
callFunc2("xy"); // Hello, World!

Так что, если вы хотите только напечатать подсказку, используйте анонимную функцию: Closureи если вы хотите также разрешить использование обычных функций в callableкачестве подсказки типа.

http://php.net/manual/en/class.closure.php

http://php.net/manual/en/language.types.callable.php

В документе Magento они предлагают использовать [callable]

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

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

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html#defining-a-plugin

Vinz
источник
хорошо, так что же лучше использовать в методе вокруг к magento?
Амит Бера
1
Я редактировал выше, Magento предложить использование [вызываемая]
Vinz