如何最好地处理 PHP 中构造函数接收强制非空值的情况,该值可能并不总是被初始化?
Posted
技术标签:
【中文标题】如何最好地处理 PHP 中构造函数接收强制非空值的情况,该值可能并不总是被初始化?【英文标题】:How to best handle a situation in PHP where constructor receives a mandatory non-null value, which may not always be initialized? 【发布时间】:2017-09-09 21:12:31 【问题描述】:我有一些这样的代码:
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 引擎需要int
,它会得到null)
。
问题
我该如何处理这种情况?
想法
我能想到的两个解决方案是
将 $number 初始化为-1
,这将使 PHP 保持快乐,但它也是一个神奇的值,因此我认为它是不可取的
将我的构造函数更改为function __construct(int $number = null)
,这将摆脱TypeError
,但它在某种程度上让我感到厌烦,因为我正在削弱构造函数以接受null
,而不是让它变硬只接受int
.
【问题讨论】:
如果$number
是Repository
的必填项,除非您知道号码,否则不要实例化Repository
。
谢谢。看起来我的问题是强制在 Controller
上强制使用 Repository
,而在某些情况下不需要它,例如 generateIndexPage()
方法。
【参考方案1】:
在函数参数中给变量一个值,如下所示:
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;
【讨论】:
【参考方案2】:对亚历克斯对我的问题的评论表示赞同,我正在考虑采用这种方法:
由于 Repository 不是我的 Controller 的强制参数的情况,使其成为 Controller
可以接受 Repository
或 null
的位置。但在Repository
上保持$number
为必填项。
【讨论】:
以上是关于如何最好地处理 PHP 中构造函数接收强制非空值的情况,该值可能并不总是被初始化?的主要内容,如果未能解决你的问题,请参考以下文章