Php 类型提示:默认参数
PHP5引入了类型暗示。函数现在可以强制参数成为对象(通过在函数原型中指定类的名称)或Php 类型提示:默认参数,php,type-hinting,default-parameters,Php,Type Hinting,Default Parameters,PHP5引入了类型暗示。函数现在可以强制参数成为对象(通过在函数原型中指定类的名称)或数组(自PHP5.1以来)。但是,如果将NULL用作默认参数值,则允许它作为以后任何调用的参数 以下摘录自上述内容: 如果将NULL用作默认参数值,则允许它作为以后任何调用的参数。 以上的意思是: 如果默认参数与类型提示一起使用,则只能将NULL作为默认值 即代码1中的代码错误,导致: 致命错误:带有类类型提示的参数的默认值只能是NULL 代码1: 其中代码2中的as代码是正确的: 代码2: 为什么在php中分
数组(自PHP5.1以来)。但是,如果将NULL
用作默认参数值,则允许它作为以后任何调用的参数
以下摘录自上述内容:
如果将NULL
用作默认参数值,则允许它作为以后任何调用的参数。
以上的意思是:
如果默认参数与类型提示一起使用,则只能将NULL
作为默认值
即代码1中的代码错误,导致:
致命错误:带有类类型提示的参数的默认值只能是NULL
代码1:
其中代码2中的as代码是正确的:
代码2:
为什么在php中分配此约束?您不能键入提示字符串,只能键入提示对象和数组,因此这是不正确的:
function setName ( string $name = "happ") {
(这里没有出现编译时错误的原因是PHP将“string”解释为类的名称。)
文件中的措辞意味着,如果您这样做:
function foo(Foo $arg) {
function foo(Foo $arg = null) {
function foo(array $foo = array(1, 2, 3))
那么传递给foo()的参数必须是对象foo的实例。但如果你这样做:
function foo(Foo $arg) {
function foo(Foo $arg = null) {
function foo(array $foo = array(1, 2, 3))
然后,传递给foo()的参数可以是对象foo的实例,也可以是null。还要注意,如果您这样做:
function foo(Foo $arg) {
function foo(Foo $arg = 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]
从PHP5.4开始,您可以键入提示可调用:
function foo(callable $callback) {
call_user_func($callback);
}
[Edit 2]
从PHP7.0开始,您可以键入hintbool
、float
、int
和string
。这使得问题中的代码语法有效。从PHP7.1开始,您可以键入提示iterable
这是编译时间与运行时值之间的关系。编译时只允许文本值(字符串、数字、布尔值和NULL)。PHP处理器此时无法知道所有可能的类,因此无法在函数参数中创建对象的实例
我从摘录中所期望的是,在通常情况下,将NULL传递给类型提示函数将引发异常/错误。如果将默认值设置为NULL,那么如果传递NULL,则不会引发此异常。我还没有测试它,这正是我所期望的。(在PHP5中也称为类型提示)PHP7支持字符串类型
这些措施包括:
- 类/接口名称(>=PHP5.0.0)李>
self
(>=PHP5.0.0)李>
数组
(>=PHP5.1.0)李>
callable
(>=PHP5.4.0)李>
bool
,float
,int
,string
(>=PHP7.0.0)李>
- iterable—可遍历(>=PHP7.1.0)的数组或实例
感谢:这是编译时间与运行时值的问题。编译时只允许文本值(字符串、数字、布尔值和NULL)。
第二段请参考上述答案。这是一个非常过时的答案。我只想告诉未来的读者,php很可能在不久的将来支持某种形式的标量类型提示,所以这个答案已经过时了。@rambocoder我们仍然在等待PHP5.6中的标量类型提示。类型提示字符串和其他标量现在在PHP7中是可能的,但我在键入hintedboolean$foo=true
时遇到了这个错误,因为它必须是bool$foo=true
。也就是说,当类型无效时会出现此错误。