PHP函数类型声明总结-php教程

资源魔 36 0
PHP7开端支持标量类型申明,强类型言语的滋味比拟浓。应用这个特点的进程中踩过两次坑:一次是申明boolean类型参数,比来一次是申明double类型参数,都招致运转时犯错。为防止当前持续犯相似谬误,这几天翻阅了民间文档。本文是看完后对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函数类型申明总结的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 PHP函数

抱歉,评论功能暂时关闭!