如何最好地处理PHP中的情况,其中构造函数接收到一个强制的非null值,这可能并不总是被初始化?

时间:2017-04-13 16:34:58

标签: php constructor initialization php-7 type-hinting

我有一些像这样的代码:

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

2 个答案:

答案 0 :(得分: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;
    }
  }
}

答案 1 :(得分:0)

对Alex对我的问题的评论表示赞同,我正在考虑采用这种方法:

使Controller接受Repositorynull的位置,因为存储库不是我的控制器的必需参数。但请$number强制Repository