types提示:默认参数

types提示

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

以上摘录如下:

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

以上是否意味着:
如果要使用缺省参数并使用types提示,则只能使用NULL作为缺省值。

即代码1中的代码是错误的,并导致:
致命错误:具有types提示的参数的默认值只能为NULL

代码1:

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

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

码2:

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

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

您不能键入提示string,只能键入提示对象和数组,所以这是不正确的:

 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,你可以这样做:

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

编辑:从PHP 5.4起,还可以键入可调用对象:

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

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

我期望的是,通常将NULL传递给一个types的提示函数会抛出exception/错误。 如果将默认值设置为NULL,则在传递NULL时不会抛出此exception。 我没有testing过,只是我所期望的。

您不能键入string,只能键入对象和数组。

真?

所以,看看这个: https : //gist.github.com/qeremy/cd5de6397dd732751fec

@ThinkingMonkey; 如果您愿意,可以随时用这种方式使用它,但只能将NULL作为默认值传递。

 function foo(int $x, float $y) { print $x * $y; } foo(3, 1.5); foo(3, 1); // boom! class User { public function theName(string $name) { print $name; } } $u = new User(); $u->theName('kerem'); 

尝试这个

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