类型提示:默认参数

2022-08-30 10:43:57

PHP 5 类型提示

PHP 5 引入了类型提示。函数现在能够强制参数成为对象(通过在函数原型中指定类的名称)或(从 PHP 5.1 开始)。但是,如果 用作默认参数值,则将允许将其用作以后任何调用的参数。arraysNULL

以下摘自上述内容:

如果 NULL 用作默认参数值,则将允许它作为以后任何调用的参数。

以上是否意味着:

如果默认参数与类型提示一起使用,则它只能将 NULL 作为默认值。

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

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

代码 1:

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

code2 中的 as code 是正确的:

代码 2:

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

为什么在 php 中分配此约束?


答案 1

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

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);
    }

[编辑1]从 PHP 5.4 开始,您可以键入:callable

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

[编辑2]从 PHP 7.0 开始,您可以键入 、 、 和 。这使得问题中的代码具有有效的语法。从 PHP 7.1 开始,您可以键入 。boolfloatintstringiterable


答案 2

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

有效类型包括:

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

推荐