php基础知识之函数总结

1.用户自定义函数。

用户将代码封装到一起来实现某个功能,封装的这些代码就叫一个函数,给这些封装的代码取一个名称,这个名称叫做函数名。

<?php
    function test($arg1,$agr2,...){
        echo 'do something';
        return $retval;
    }

注意函数名和 php 中其它标识符一样,以字母或者下划线打头,后面跟字母,数字或下划线。

函数的调用不用区分先后关系,除非函数定义在条件语句中,看下面的例子。

<?php

foo(); //可以不区分先后关系
far(); //因为有条件,所以这样写有错误,必须将 far() 放到条件判断下面去
if(true){
    function far(){
        echo 'function far';
    }
}

far(); //下面能够安全使用far(),因为已经被定义
function foo(){
    echo 'function foo';
}

函数名是和大小写无关的,不过在调用函数的时候,使用和定义相同大小写是一个好习惯。

<?php
function foo(){
    echo 'function foo';
}

FOo(); //这样没有错,但是最好避免

php中所有的函数和类都有全局作用域,可以在函数内定义函数,在函数外边调用,反之亦然。

<?php
function foo(){
    function far(){
        echo 'function far in function foo';
    }
}

foo();

far();

function faz(){
    return far();
}

faz();

递归函数:函数内部调用自己。

<?php
function foo(){
    static $count = 1;
    echo $count;
    $count ++;
    if($count < 100){
        foo();
    }
    $count --;
}
递归调用最好不要超过100层,不然可能会使堆栈崩溃从而使当前脚本终止。

2.函数参数

php 函数传参可以通过值传参,引用传参,默认参数,可变参数。

值传参

<?php
function foo($a){
    echo $a;
}
foo(100);

引用传参

<?php
function foo(&$a){
    echo $a;
}

foo(100);

默认传参

<?php
function foo($a,$b = 12,$c=[3,4],$d=NULL){
    if(is_null($d)){
        $c = array_sum($c);
    }
    echo $a+$b+$c;
}

foo(1);
foo(1,42);
默认的参数只能放在函数最后面,php 还能用 array 和特殊类型 NULL 作为默认参数。

可变参数

//php5.6以及5.6以后可以用 ... 来实现
<?php

function test($a,...$b){
    var_dump($b);
}

test(1,2,3,4,5,6);
?>

//php5.6 之前可以用 func_nums_args(),func_get_arg()和func_get_args()来实现

<?php
function test($a){
    echo array_sum(func_get_args());
}

test(1,2,3,4,5);

//关于可变函数的一种骚操作

<?php
function test($a,$b){
    echo $a+$b;
}

test(...[$a,$b]);

类型声明

<?php
//php5.0之后 支持类名和接口名的类型声明
class C{}
interface B{}
class D implementS B{}

function test(C $c,B $b){
    var_dump($c,$b);
}
$c = new C();
$d = new D();
test($c,$d);
//php 5.1添加 array 类型提示。
function test(C $c,B $b,array $e){
    var_dump($c,$b,$e);
}
//php5.4之后添加 callable 回调函数类型声明。

///php 7.0 后添加 bool float int string 类型声明。
严格模式:默认情况下,如果能做到的话,PHP将会强迫错误类型的值转为函数期望的标量类型。 例如,一个函数的一个参数期望是string,但传入的是integer,最终函数得到的将会是一个string类型的值。

可以基于每一个文件开启严格模式。在严格模式中,只有一个与类型声明完全相符的变量才会被接受,否则将会抛出一个TypeError。 唯一的一个例外是可以将integer传给一个期望float的函数。

严格类型适用于在启用严格模式的文件内的函数调用,而不是在那个文件内声明的函数。 一个没有启用严格模式的文件内调用了一个在启用严格模式的文件中定义的函数,那么将会遵循调用者的偏好(弱类型),而这个值将会被转换。

严格类型仅用于标量类型声明,也正是因为如此,这需要PHP 7.0.0 或更新版本,因为标量类型声明也是在那个版本中添加的。

3.可变函数。

php 支持可变函数,可变函数就是如果一个变量名后有圆括号,像这样 $val(), php 就会去寻找变量名值相同名的函数,并执行它。可变函数可以实现回调函数,函数表之类的一些用途。

<?php
function foo(){
    echo 'function foo';
}

$val = 'foo';

$val();

可变函数不能用于 echo 、 print 、 unset() 、 isset() 、 empty() 、 include 、 require 以及类似的语言结构,需要使用自己的包装函数来将这些结构用作可变函数。

function echoit($val){
    echo $val;
}

$val = 'echoit';
$val('echo');

可以用可变函数来调用一个对象的方法。

<?php
class A{
    public function foo(){
        echo 'class A function foo';
    }
}

$val = 'foo';

$a = new A();
$a->$val();

当调用静态方法的时候,函数调用要比静态属性优先。

<?php
class A{
    public static $val = 'static val';
    
    public static function foo(){
        echo 'static function foo';
    }
}

$val = 'foo';

A::$val();

4.匿名函数。

匿名函数,也叫做闭包函数,允许临时创建一个没有指定名称的函数。常常用作回调函数(callback) 参数的值。

匿名函数目前是由 Closure 类来实现的。

<?php
$func = function ($a,$b){
    echo $a+$b.PHP_EOL;
};

$func(1,3);

call_user_func($func,1,4);

闭包函数可以作为变量的值来使用。php 会自动把此种表达式转成内置类 Closure 对象,并赋值给一个变量,这种写法与普通的变量赋值一样,需要再最后加上 ; 分号。

<?php
$func = function ($a,$b){
    echo $a+$b.PHP_EOL;
};

$func(1,3);

call_user_func($func,1,4);

闭包函数可以从父作用域继承变量。任何变量都需要用 use 语言结果传递进去。php 7.1 后不能传入此超全局变量,$this 或者和参数重名。

<?php
$message = 'php';

$closure = function () use ($message){
    echo 'hello' .' '. $message;
};

$closure();
可以再闭包中使用 func_num_args() 、 func_get_arg() 和 func_get_args() 。

Snail's Blog
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.3 -develop 搭建 © 2014-2018 www.snail-c.cn 版权所有 ICP证:蜀ICP备18023253号-1
  • 联系邮箱:459921737@qq.com