PHP函数类型声明总结
从语法上,PHP的函数定义经过了几个时代:
远古时代(PHP 4)
定义一个函数非常的简便,使用 function name(args) {body}的语法声明。不克不及指定参数和返回值类型,参数和返回值类型有无穷种大概。这是到当前为止最常见的函数声明方式。
数组和援用类型参数值声明(PHP 5)
数组(array)、类(class)、接口(interface)、函数(callable)可以用在函数声明中。从5.6开端,支撑常量(包罗类常量)为默许参数,乃至参数数组(以省略号...为前缀)。例如:
function sum(...$numbers) { $sum = 0; foreach ($numbers as $number) { $sum += $number; } return $sum; }
留意:假如参数的值大概为null,null必需为参数的默许值,不然调取时会出错。例如:
function foo(array $arr = null) { ... }
标量类型和返回值声明(PHP 7)
函数正式支撑标量类型(int, bool, float,string)和返回值类型(可声明类型同参数)声明。从这个版本开端,除了语法差别,函数声明情势上可以做到像强类型说话。
遗憾是假如函数返回值有大概是null,就不克不及指定返回值类型。例如:
function getModel() : Foo { if ($this->_model === null) { $this->_model = xxxx; // get from db or otherelse } return $this->_model; // 假如$this->_model仍是null,运转出错 }
参数和返回值可为null乃至void返回类型声明(PHP 7.1)
当参数和返回值类型有大概是null时,类型前以问号(?)润饰,可以解决null值问题(与默许参数不冲突);类型声明新增iterable,同时还支撑void类型返回值。例如:
function getModel(?int $id) : ?Foo { if ($id !== null) { $this->_model = xxxx; } else { $this->_model = yyyy; } return $this->_model; } // 调取 $foo->getModel(null); $foo->getModel(100); // 函数声明了参数并且没有供给默许参数,调取时不传入参数会激发错误 // 将函数声明改成 getModel(?int $id = 100) {},可以不传参数 $foo->getModel();
当函数返回值为void时,函数体的不克不及return任何东西(return void;的写法也是错误的!),或者可以省略return语句。
function test(array $arr) : void { if (!count($arr) { return; } // 不要return; array_walk($arr, function ($elem) {xxxx}); }
回忆以上历史变动,可以看到在PHP 7.1中函数类型声明已经十分完美(虽然实践中用的不多)。留意,文章说的是参数和返回值类型声明,PHP不包管运转历程中参数类型不变,即下面的代码是合法的:
function foo(array $arr) : array { // change $arr from array to int $arr = 3; return []; }
从这点上看,PHP还是弱类型说话,不克不及做静态编译。
再说说实践中踩到的坑。按照官方文档,函数参数和返回值类型声明可用的类型有:
● 类/接口
● self,只能用在本身的办法上
● array
● bool
● callable
● int
● float
● string
● iterable
● void(仅用在返回值)
留意列表中并没有boolean和double类型!除非你定义了这两个类型,不然用在参数和返回值中是错误的!
这也是PHP有点蛋疼的地方。平常使用时的double和float两个关键字几乎等同,例如doubleval是floatval的别号,is_double是is_float的别号,转换时用(double)和(float)结果雷同。但在用在类型声明就不一样,一样的状况显现在bool和boolean身上。
总结
当前PHP 7.2不乱版已经公布,倡议在新项目中尽量使用PHP 7.1及后续版本。为了写出清楚和可保护的代码,引荐声明类型。倡议援用类型或者string才使用null值,int/float等标量类型的参数尽量不要用null。func_get_argc等函数,如非必要,尽量不使用。
以上就是PHP函数类型声明总结的具体内容,更多请关注百分百源码网其它相关文章!