PHP friendly классы
5 августа 2020
Дружественные классы видят как минимум protected-методы друг друга. В PHP реализуются так:
abstract class Base { protected function doit() { throw new \RuntimeException('Not implemented'); } } class Closed extends Base { protected function doit() { echo 'done!'; } } class Opener extends Base { public function execute(Closed $closed) { $closed->doit(); } } $closed = new Closed(); $opener = new Opener(); $opener->execute($closed);
Здесь можно запустить. Если что, это не баг.
Как это использовать? В Yii 3 мы так закрываем DI-контейнер и диспетчер событий чтобы в рантайме они были только для чтения, но, при этом их можно было сконфигурировать специальными friendly-конфигураторами на этапе инициализации приложения.
Сделано это чтобы не дать стрелять себе в ногу, в этом плюс. Минус в том, что про такую фичу PHP мало кто знает и это вызывает вопросы:
Комментарии RSS по email OK
Ненужная штука для Yii ИМХО.
Зачем стрелять в ногу, когда можно её отрезать.
Выглядит, как баг, который выдан за фичу. Есть где-то упоминание в оф. документации?
Есть. Смотрите "Visibility from other objects".
Да это не баг, и смысл есть в том что это работает. Вопрос только зачем. Куча реализаций DI и event listeners юзают пуьбличный интерфейс для этого, и много лет это работает без проблем.
Складывается ощущение что Yii внедрил "фичу", ради фичи, чтоб отличаться от других. Причем это потребовало абстрактный класс
AbstractProviderConfigurator
вместо интерфейса. И напрашивается вопрос, что более зло лишнее наследование, либо то что метод attach публичный.Большое спасибо! Вот не хватало мне ключевого слова internal в php с момента как я пересел с C# 9 лет тому назад, а оказывается можно так. Не знал об этом, думал что не существует.
Любой класс становится дружественным, когда к нему привязываешь замыкание.
Искусственное поднятие порога в понимание программы.
Главное, чтобы потом не было как с extends Object
Дмитрий, да, это минус. В одном случае уже нашли другое решение.
Очень правильная статья, нужно закрывать все лишнее, защищая пользователей от самих себя.