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

У меня есть код, например, так:

class Repository
{
private $number;

function __construct(int $number)
{
$this->number = $number;
}

//example where $number is required
function readQuote()
{
return $this->db->runSql("select * from quote where id = $this->number");
}
}

я кладу $number в конструкторе, потому что Repository относится к Quote объект с определенным номером и Quote не может существовать без номера. Таким образом, имеет смысл форсировать число, находящееся там, когда Quote номер известен.

Однако … Есть ситуация, когда номер еще не известен. Например, когда я впервые загружаю страницу и не определил (выбрал / выбрал) номер, который хочу показать, и все же я хочу, чтобы страницы загружались и работали.

В частности, у меня есть такой код:

$controller = new Controller(new Repository($number));

//this line does not require Repository,
//and hence $number can be uninitialized
$controller->generateIndexPage();
...

//this one does, but it is called only when number is already known
$controller->getQuote();

Когда я знаю номер, все работает хорошо. Когда он еще не инициализирован и nullмой код ломается с PHP TypeError ошибка (PHP Engine ожидает int, это становится null),

Вопрос

Как мне справиться с этой ситуацией?

мысли

Два решения, которые я могу придумать:

  • инициализировать число $ в -1, который сделает PHP счастливым, но это также волшебная ценность, и я думаю, что это нежелательно
  • изменить мой конструктор, чтобы сказать function __construct(int $number = null), который избавится от TypeError, но это раздражает меня на каком-то уровне, потому что я ослабляю конструктор, чтобы принять nullвместо того, чтобы держать его закаленным, чтобы принять int только.

0

Решение

Дайте переменной значение в параметрах функции, например:

class Repository{
private $number;

function __construct($number = 'x'){
// Check if the $number is provided and value of $number has changed.
if(is_numeric($number) && $number != 'x'){numeric
$this->number = $number;
}
}
}
0

Другие решения

С кивком на комментарий Алекса на мой вопрос, я думаю о том, чтобы пойти с этим методом:

Сделать это где Controller может принять Repository или null, из-за ситуации, когда хранилище не является обязательным параметром для моего контроллера. Но продолжай $number обязательно на Repository,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector