48

PHP 5 类型提示

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

以下摘自上述内容:

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

上面的意思是不是:

如果要与类型提示一起使用默认参数,则它只能具有NULL默认值。

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

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

代码1:

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

code2 中的代码是正确的:

代码2:

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

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

4

3 回答 3

83

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

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

(这里没有出现编译时错误的原因是 PHP 将“字符串”解释为类的名称。)

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

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.

于 2011-12-15T16:07:48.437 回答
6

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

有效的类型是:

  • 类/接口名称(>=PHP 5.0.0);
  • self(>=PHP 5.0.0);
  • array(>=PHP 5.1.0);
  • callable(>=PHP 5.4.0);
  • bool, float, int, string(>=PHP 7.0.0);
  • iterable - 数组或 Traversable 实例 (>=PHP 7.1.0)。
于 2018-01-15T16:09:25.787 回答
1

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

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

于 2011-12-15T16:11:46.763 回答