Lopar
@Lopar
системный администратор

Как передать переменную в подключаемый класс?

Упрощённый пример вводных:

class Model
{
  protected string $foo = '';
  protected function foo() {echo $this->$foo;}
}

class ModelOne extends Model
{
  public function __construct($text)
  {
    $this->foo = $text;
  }

  public function bar()
  {
    $this->foo;
  }
}

class Control
{
  private ModelOne $baz;
  public function test()
  {
    $this->baz->bar();
    //...??????
  }
}


И вот на этом этапе у меня затык.

Мне вроде нужно в конструктор ModelOne передать значение, но если писать $this->baz->bar(), то его некуда вставить, а если писать $this->baz('SOMETEXT')->bar(), то система закономерно ругнётся, что метода baz нет в классе Control.
При этом в текущем исполнении IDE говорит, что у меня нет ошибок. То есть как бы она считает эту ситуацию совершенно валидной.

Вроде бы напрашивается $this->baz = new ModelOne('SOMETEXT');, но останавливает, что даже без инициализации IDE даёт работать с классом, будто он уж инициализирован. И потом, делать new в классе вроде плохой тон, правильно передавать сразу всё целиком
public function test(ModelOne $baz)
  {
    //...
  }

Но тогда нельзя его использовать везде. А если делать это в конструкторе, значит вызывать его придётся ещё выше класса Control, и там, похоже, вся конструкция теряет смысл...

Что я упускаю?

Пожалуйста, не надо советовать фреймворки.
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
Не совсем понятно. Но вы либо в конструктор Control передаете уже созданную модель, аля:
class Control
{
    public function __construct(private ModelOne $baz){}
    public function test()
    {
        $this->baz->bar();
    }
}

(new Control(new ModelOne('some text')))->test();


Либо сам класс определяет внутри себя:

class Control
{
    private ModelOne $baz;
    public function __construct(){
          $this->baz = new  ModelOne('some text');
    }
    public function test()
    {
        $this->baz->bar();
    }
}

(new Control())->test();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы