类型提示:默认参数

Thi*_*key 44 php type-hinting default-parameters

PHP 5类型提示

PHP 5引入了类型提示.函数现在能够强制参数为对象(通过在函数原型中指定类的名称)或arrays(自PHP 5.1起).但是,如果将ifNULL用作默认参数值,则允许将其作为后续调用的参数.

以下摘录如下:

if NULL用作默认参数值,它将被允许作为任何后续调用的参数.

上述意思是:

如果要使用默认参数,请使用类型提示,它只能具有NULL默认值.

code1中的代码是错误的,并导致:

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

代码1:

 function setName ( string $name = "happ") {
  ...
  }
Run Code Online (Sandbox Code Playgroud)

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

码2:

 function setName ( string $name = NULL) {
  ...
  }
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*sky 77

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

function setName ( string $name = "happ") {
Run Code Online (Sandbox Code Playgroud)

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

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

function foo(Foo $arg) {
Run Code Online (Sandbox Code Playgroud)

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

function foo(Foo $arg = null) {
Run Code Online (Sandbox Code Playgroud)

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

function foo(array $foo = array(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

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

function foo(array $foo = null) {
    if ($foo === null) {
        $foo = array(1, 2, 3);
    }
Run Code Online (Sandbox Code Playgroud)

[Edit 1]从PHP 5.4开始,您可以输入提示callable:

function foo(callable $callback) {
    call_user_func($callback);
}
Run Code Online (Sandbox Code Playgroud)

[Edit 2]由于PHP 7.0,你可以typehint bool,float,int,和string.这使得问题中的代码成为有效的语法.从PHP 7.1开始,您可以输入提示iterable.

  • 现在可以在PHP 7中输入提示字符串和其他标量,但是当我输入提示`boolean $ foo = true`时我得到了这个错误,因为它必须是`bool $ foo = true`.也就是说,当类型无效时,您会收到此错误. (4认同)
  • 谢谢你的详细解释. (2认同)
  • @rambocoder我们还在等待PHP 5.6的标量类型提示. (2认同)

ken*_*orb 5

stringPHP 7支持类型的类型声明(在PHP 5中也称为类型提示)。

有效的类型是:

  • 类/接口名称(> = PHP 5.0.0);
  • self (> = PHP 5.0.0);
  • array (> = PHP 5.1.0);
  • callable (> = PHP 5.4.0);
  • boolfloatintstring(> = PHP 7.0.0);
  • 可迭代 -可遍历的数组或实例(> = PHP 7.1.0)。