PHP 5 Type Hinting
PHP 5引入了类型提示。 现在,函数可以强制参数为对象( ,方法是在函数中指定类的名称原型 )或arrays
( 自PHP 5.1 )。但是,如果NULL
用作默认参数值,则允许将其作为后续调用的参数。
以下摘录如下:
如果将NULL
用作默认参数值,则可以将其作为后续调用的参数。
上述意思是:
如果要使用默认参数并使用类型提示,则只能将 NULL
作为默认值。
即。 code1中的代码错误,导致:
致命错误:具有类型提示的参数的默认值只能是NULL
function setName ( string $name = "happ") {
...
}
代码2中的代码是正确的:
function setName ( string $name = NULL) {
...
}
为什么在php中分配了这个约束?
答案 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开始,您可以输入提示bool
,float
,int
和string
。这使得问题中的代码成为有效的语法。从PHP 7.1开始,您可以输入提示iterable
。
答案 1 :(得分:4)
string
(> = PHP 5.0.0); self
(> = PHP 5.1.0); array
(> = PHP 5.4.0); callable
,bool
,float
,int
(> = PHP 7.0.0); 答案 2 :(得分:1)
这是编译时间与运行时间值的关系。在编译时,只允许使用文字值(字符串,数字,布尔值和NULL)。 PHP处理器目前无法知道所有可能的类,因此您无法在函数参数中创建对象的实例。
我期待的摘录是,虽然通常将NULL传递给类型提示函数会抛出异常/错误。如果将默认值设置为NULL,则在传递NULL时不会抛出此异常。我没有测试过,正是我所期待的。