Как стать автором
Обновить

Комментарии 14

Спасибо, не знал. Действительно, полезно перечитывать документацию.


Но так все же зачем конкретно в колбэке для usort (приведенном в начале статьи) static? Просто по привычке (кабы не было чего)?

Спасибо за фидбек.

Этот коллбек вырван из контекста. Он как раз находился в методе класса ExampleTest , который показан на скрине чуть ниже по тексту (там где я сделал дамп и показал, что внутри анонимной функции мы действительно можем обратиться к this.

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

С другой стороны, если ты просто пишешь скрипт, то static никак не повредит. В целом можно в команде договориться о правиле вроде "Ставь везде static, убирай только там, где обращаешься к $this" (по аналогии с final напр.).

Ну даже в ExampleTest — нет там никакой утечки даже без static, разве не так?
Я бы даже сказал, что утечка будет в каких-то экзотических (синтетических, по большей части) случаях — вроде примера с LargeObject

Да, верно, как таковой проблемы в примере нет. А вот насчет синтетических или экзотических случаев я тут не совсем соглашусь. Из моей практики очень часто всплывало то, что "маловероятно" или "такого вообще никогда не произойдет". Особенно эта боль бывает когда обсуждают бизнес требования :) Но ладно, речь о другом. Так вот, введя правило для своей команды из моего предыдущего комментария, как мне кажется, мы избавляем себя от лишней головной боли и можем не думать о том "может ли здесь произойти утечка".

В таком случае она никогда не произойдет, а все места где может — они сделаны осознанно и их легче проконтролировать.

Но здесь каждый разработчик и команда должны сами выбирать, как с этим работать, главное знать, что такая ситуация возможна :)

Дополняя ваш комментарий, могу сказать, что можно установить плагин EA Extended в шторме и он будет подсвечивать коллбеки, которые можно безопасно сделать статическими.

В php-cs-fixer вроде как можно включить добавление static для всех анонимных функций без использования $this. МБ даже стоит у себя активировать...

Интересно, что в Kotlin подобная функциональность реализована явно с помощью receiver'ов. Непонятно, зачем неявно привязывать лямбды к this. У PHP снова свой собственный путь:)

Только вот релиз Kotlin, судя по Википедии, выпущен в 2016.
А PHP 5.3 (если не путаю версию в котором завезли \Closure) с этим функционалом выпущен в 2009.
И у кого тут «свой собственный путь»?

Я не о том кто первый, а о том, что это крайне сомнительное неявное поведение по умолчанию.

тоже самое в js, as3, haxe, c#…
Спасибо, познавательно!

Какая короткая и какая полезная статья! Спасибо огромное за повышение моего скилла!

Очень искусственный пример. На практике в большинстве случаев выигрыш по памяти будет в разы ниже.

Чтобы не оценивать «большинство случаев» и не проверять код на «искусственность/неискусственность», разумно принять предлагаемое правило: всегда использовать static для анонимных функций, когда не нужен доступ к $this.

Автор напоминает (спасибо!), как работает ключевое слово в функциях-замыканиях, и говорит о том, что без static в замыканиях можно случайно нарваться на неоправданные затраты памяти. Вы каждый раз (!) избегаете риска утечки памяти с ключевым словом static в случаях необращения к $this в замыканиях. Зачем рисковать?!

Расшифруйте, пожалуйста, в чем состоит ваше возражение? Помните: отвергая, предлагай? Почему бы вам не предложить собственные рекомендации по теме?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации