У меня есть код, например, так:
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
только.Дайте переменной значение в параметрах функции, например:
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;
}
}
}
С кивком на комментарий Алекса на мой вопрос, я думаю о том, чтобы пойти с этим методом:
Сделать это где Controller
может принять Repository
или null
, из-за ситуации, когда хранилище не является обязательным параметром для моего контроллера. Но продолжай $number
обязательно на Repository
,