如何最好地处理 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 .

【问题讨论】:

如果$numberRepository 的必填项,除非您知道号码,否则不要实例化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 可以接受 Repositorynull 的位置。但在Repository 上保持$number 为必填项。

【讨论】:

以上是关于如何最好地处理 PHP 中构造函数接收强制非空值的情况,该值可能并不总是被初始化?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中获取第一个非空值?

计算非空值的行

Mysql - 转换非空值第 2 部分

加入后如何删除具有非空值的重复列? [复制]

退出构造函数时,不可为空的属性必须包含非空值。考虑将属性声明为可为空

Java 8中 Optional 类源码实现与分析