<rmcreative>

RSS

PHP friendly классы

5 августа 2020

Дружественные классы видят как минимум protected-методы друг друга. В PHP реализуются так:

<?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

  1. №11936
    slavcodev
    slavcodev 05 авг. 2020 г., 11:47:21

    Ненужная штука для Yii ИМХО.

  2. №11941
    Василий
    Василий 06 авг. 2020 г., 13:25:27

    Зачем стрелять в ногу, когда можно её отрезать.

    Выглядит, как баг, который выдан за фичу. Есть где-то упоминание в оф. документации?

  3. №11942
    Sam
    Sam 07 авг. 2020 г., 10:50:04

    Есть. Смотрите "Visibility from other objects".

  4. №11943
    slavcodev
    slavcodev 07 авг. 2020 г., 13:21:44

    Да это не баг, и смысл есть в том что это работает. Вопрос только зачем. Куча реализаций DI и event listeners юзают пуьбличный интерфейс для этого, и много лет это работает без проблем.

    Складывается ощущение что Yii внедрил "фичу", ради фичи, чтоб отличаться от других. Причем это потребовало абстрактный класс AbstractProviderConfigurator вместо интерфейса. И напрашивается вопрос, что более зло лишнее наследование, либо то что метод attach публичный.

  5. №11944
    Артур
    Артур 13 авг. 2020 г., 11:50:06

    Большое спасибо! Вот не хватало мне ключевого слова internal в php с момента как я пересел с C# 9 лет тому назад, а оказывается можно так. Не знал об этом, думал что не существует.

  6. №11946
    Gri
    Gri 18 авг. 2020 г., 12:01:10

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

  7. №11949
    Эльдар
    Эльдар 24 авг. 2020 г., 5:24:28

    Искусственное поднятие порога в понимание программы.

  8. №11951
    Дмитрий
    Дмитрий 07 сент. 2020 г., 16:45:29

    Главное, чтобы потом не было как с extends Object

  9. №11952
    Sam
    Sam 10 сент. 2020 г., 11:47:51

    Дмитрий, да, это минус. В одном случае уже нашли другое решение.

  10. №12166
    Dicr
    Dicr 18 апр. 2021 г., 13:06:54

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

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.