从语法上,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函数范例声明总结的细致内容,更多请关注ki4网别的相干文章!