Возврат $ это после наблюдателя


27

В интернете и в сторонних модулях я вижу некоторую противоречивую информацию - является ли это обязательным требованием или наилучшей практикой возвращаться $thisв конце метода наблюдателя?

Например:

MyCompany_Module_Model_Observer.php

public function salesOrderSaveAfter($observer){
    //do stuff
    return $this;
}

Ответы:


30

Ядро всегда return $this;в контексте методов наблюдателя - но на самом деле нет причин для этого.

Проследуя назад, dispatchEvent()вы найдете основной метод, который вызывает методы наблюдателя (в ./app/Core/Model/App.php)

protected function _callObserverMethod($object, $method, $observer)
{
    if (method_exists($object, $method)) {
        $object->$method($observer);
    } elseif (Mage::getIsDeveloperMode()) {
        Mage::throwException('Method "'.$method.'" is not defined in "'.get_class($object).'"');
    }
    return $this;
}

Но ни в коем случае возвращаемое значение никогда не использовалось или не использовалось для передачи другому наблюдателю по цепочке.

Возможно, Magento подумал о том, чтобы использовать его как средство для сохранения / передачи данных внутри $thisэкземпляра класса вне использования сессий / реестра; или это мог быть устаревший код, который только что застрял .

Я не вижу убедительной причины return $this- но, как говорится, если они делают это в основном, это то, что мы делаем.

Как правило, независимо от того, что делает ядро ​​- мы считаем наилучшей практикой. За исключением шокирующих орфографических ошибок :)


6
"Укринглиш" :-)
отметки

Мне стыдно признаться, что я иногда возвращаю $ наблюдатель, чтобы избавиться от предупреждения IDE о неиспользованном параметре ...
Даниэль Слооф

@Daniel - просто не добавляйте параметр в подпись наблюдателя. PHP не против. Но опять же, переданный параметр может понадобиться в будущем.
nevvermind

7

$ this (каламбур предназначен) называется свободным интерфейсом. Это позволяет вам вызывать несколько методов внутри объекта, не обращаясь к определенной переменной.


1
Спасибо - я понимаю беглые интерфейсы. Я ищу вескую причину, чтобы вернуться, $thisкогда нет смысла использовать беглые интерфейсы для наблюдателей.
Philwinkle

1
@Kevin - Вам не нужен свободный интерфейс в наблюдателях Мага. Не то, что я знаю о.
nevvermind

5

Это просто соглашение Magento - всегда возвращать $thisвместо void(ничего), если метод не имеет другого возвращаемого значения, независимо от того, используется ли он для свободного интерфейса где-либо или нет.

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


0

Несколько лет спустя ... :)

Ядро всегда возвращает $ this; в контексте методов наблюдателя - [...]

или

Это просто соглашение Magento всегда возвращать $ this вместо void (ничто), если у метода нет другого возвращаемого значения [...]

Нет, правда. Только что проверил некоторых наблюдателей в 1.9.3.x и многие ничего не возвращают ( void). Так что не совсем понятно "что делает основной код";)

Я тоже использовал $return $this;в своем коде, но сегодня - в коде M1 не будет никаких изменений - я бы оставил это. Я думаю - если я читаю чужой код - voidметод более понятен, чем метод с слепым добавлением return $this, который никогда не используется.


Редактировать:

Если вы используете Aoe_Scheduler, вы также можете вернуть stringили, arrayчтобы отобразить его в хронологии.

введите описание изображения здесь

Не удается найти какие-либо документы для этих функций ... связанный код здесь: https://github.com/AOEpeople/Aoe_Scheduler/blob/master/app/code/community/Aoe/Scheduler/Model/Schedule.php#L229- L259

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.