【问题标题】:Type hinting in PHP constructors?PHP 构造函数中的类型提示?
【发布时间】:2012-08-15 13:16:05
【问题描述】:

有什么可以阻止我在 __construct() 括号中输入这样的提示吗?

<?php

    class SomeClass extends BaseClass {

        public function __construct(array $someArray) {

            parent::__construct($someArray);
        }

还是只能这样?

<?php

    class SomeClass extends BaseClass {

        public function __construct($someArray = array()) {

            parent::__construct($someArray);
        }

编辑:

这是有效的:(感谢@hakra 和@Leigh)

<?php

    class SomeClass extends BaseClass {

        public function __construct( array $someArray = NULL ) {

            parent::__construct( (array) $someArray);
        }

对我来说,它看起来既漂亮又干净,我确切地知道它应该意味着什么。

【问题讨论】:

  • 看起来合法 - php.net/manual/en/language.oop5.typehinting.php 为什么不试试呢?
  • 两者都可以:__construct(array $arr=array())
  • 你已经输入了代码,为什么不直接运行一下?
  • @Pekka,是的,我想我只需要测试一下 :)
  • 我需要能够使数组可选。前任__construct(数组 $someArr = false)。你认为它有效吗?

标签: php class oop constructor


【解决方案1】:

这是没有默认值的类型提示,表明参数必须给出,并且它的类型必须是一个数组

public function __construct(array $someArray) {


如果没有传递参数,这将提供参数的默认值,没有类型提示。

public function __construct($someArray = array()) {


它们是两个不同的东西。

在第二种情况下,您可以不带参数调用该函数,它会起作用,但第一种不会。

如果需要,可以将两者结合起来,指定默认值并指定所需的类型。

public function __construct(array $someArray = array()) {

或者正如@hakre 所说,您可以这样做:

public function __construct(array $someArray = NULL) {

【讨论】:

  • 如果您将其设为可选(array $someArray = NULL),则不必,检查NULL,使其可选。
  • __construct(array $someArray) 不会接受 null 作为其参数。
  • array $someArray = array() 可以正常工作,在我看来,使用 null 只是误导。
  • @Jack 没错,它只能提供 NULL 作为默认值。
【解决方案2】:

你可以这样做:

public function __construct(array $someArray = NULL)
{
    $someArray = (array) $someArray;
    parent::__construct($someArray);
    ...

这里的情况是利用规则的= NULL 例外。下一行:

    $someArray = (array) $someArray;

只是将NULL 转换为空数组的一些简写,否则将数组保持原样(所谓的castDocs 到数组):

NULL 转换为数组会产生一个空数组。

(来自:Converting to arrayDocs

当然你可以写得更短:

public function __construct(array $someArray = NULL)
{
    parent::__construct((array) $someArray);
}

但它并没有很好地解释它。

【讨论】:

  • 谢谢,我没有意识到规则有 NULL 例外。
  • 感谢这些真正好的解释。我想给你们投票,但我收到了一些无聊的消息。
  • 好的,我试过这个方法,效果很好。对我来说,这样做看起来很棒,就像这篇文章简短方法中描述的 @hakra 一样。谢谢。
猜你喜欢
  • 2013-01-29
  • 2022-12-20
  • 2018-08-31
  • 2015-10-11
  • 2016-01-08
  • 2012-07-12
  • 2011-03-21
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多