类型提示:默认参数

时间:2011-12-15 16:04:30

标签: php type-hinting default-parameters

  

PHP 5 Type Hinting

PHP 5引入了类型提示。 现在,函数可以强制参数为对象( ,方法是在函数中指定类的名称原型 )或arrays 自PHP 5.1 )。但是,如果NULL用作默认参数值,则允许将其作为后续调用的参数。

以下摘录如下:

如果将NULL用作默认参数值,则可以将其作为后续调用的参数。

上述意思是:

如果要使用默认参数并使用类型提示,则只能将 NULL 作为默认值。

即。 code1中的代码错误,导致:

致命错误:具有类型提示的参数的默认值只能是NULL

代码1:

 function setName ( string $name = "happ") {
  ...
  }

代码2中的代码是正确的:

码2:

 function setName ( string $name = NULL) {
  ...
  }

为什么在php中分配了这个约束?

3 个答案:

答案 0 :(得分:74)

你不能输入提示字符串,你只能输入提示对象和数组,所以这是不正确的:

function setName ( string $name = "happ") {

(这里你没有得到编译时错误的原因是因为PHP将“string”解释为类的名称。)

文档中的措辞意味着如果你这样做:

function foo(Foo $arg) {

然后传递给foo()的参数必须是对象Foo的实例。但如果你这样做:

function foo(Foo $arg = null) {

然后传递给foo()的参数可以是对象Foo的实例,也可以是null。另请注意,如果您这样做:

function foo(array $foo = array(1, 2, 3))

然后你不能调用foo(null)。如果您需要此功能,可以执行以下操作:

function foo(array $foo = null) {
    if ($foo === null) {
        $foo = array(1, 2, 3);
    }

[Edit 1] 自PHP 5.4起,您可以输入提示callable

function foo(callable $callback) {
    call_user_func($callback);
}

[Edit 2] 从PHP 7.0开始,您可以输入提示boolfloatintstring。这使得问题中的代码成为有效的语法。从PHP 7.1开始,您可以输入提示iterable

答案 1 :(得分:4)

PHP 7支持Type declarations(在PHP 5中也称为类型提示){。{1}}类型。

valid types是:

  • 类/接口名称(> = PHP 5.0.0);
  • string(> = PHP 5.0.0);
  • self(> = PHP 5.1.0);
  • array(> = PHP 5.4.0);
  • callableboolfloatint(> = PHP 7.0.0);
  • iterable - 数组或Traversable实例(> = PHP 7.1.0)。

答案 2 :(得分:1)

这是编译时间与运行时间值的关系。在编译时,只允许使用文字值(字符串,数字,布尔值和NULL)。 PHP处理器目前无法知道所有可能的类,因此您无法在函数参数中创建对象的实例。

我期待的摘录是,虽然通常将NULL传递给类型提示函数会抛出异常/错误。如果将默认值设置为NULL,则在传递NULL时不会抛出此异常。我没有测试过,正是我所期待的。