PHP进阶(第八弹:函数)

基本语法

自定义函数语法如下:

function 函数名称([参数名称[=默认值]]) {
    函数体;
    return 返回值;
}

要注意,函数名称不能包含特殊字符,可以包含数字字母下划线,以字母或下划线开头。
函数名称不区分大小写。
函数名称不支持重名,如果重名在运行时会报错:Fatal eror: Cannot redeclare….。

可以使用funciton_exists检测函数名称是否存在,存在返回true,不存在返回false:

var_dump(funciton_exists('test'));

在函数体内使用全局变量

如下例,i和j是两个全局变量,但是在函数体内也是无法直接访问的,这样会报错:

<?php
$i=1;
$j=2;

function test(){
    var_dump($i,$j);
}

test();

通过global关键字或$GLOBALS超全局变量可以在函数体内访问全局变量:

<?php
$i=1;
$j=2;

function test(){
    global $i;
    global $j;
    // 也可以写在一行里面:global $i,$j;
    var_dump($i,$j);

    // 也可以在函数体内使用global定义新的全局变量
    global $m;
    $m=3;

    // 还可以通过$GLOBALS超全局变量来访问
    print_r($GLOBALS);
    echo $GLOBALS['i'];
    echo $GLOBALS['j'];
    // 也可以修改全局变量的值
    $GLOBALS['i']=10;
}

test();
var_dump($);

函数传值和传引用的区别

传值:默认情况下,函数参数通过值传递,所以即使在函数内部改变参数的值也不会改变函数外部的值。
传引用:可以通过在参数前添加&符号,代表通过引用传递参数,在函数内部对其所做更改会影响外部的值。

<?php
// 传值
function test1($i){
    $i+=1;
}
function test2(&$i){
    $i+=1;
}
$i=2;
test1($i);
var_dump($i);// 输出会是2
test2($i)
var_dump($i);// 输出会是3
// 注意,只有变量才能当做引用被传递,
// 如果这么写:test2(3),会报错:
// Fatal error:Only variables can be passed by reference...

特殊形式的函数

可变函数

在PHP中如果将函数名称赋予字符串类型的变量,但是在使用该变量时,如果带有小括号,那么PHP引擎将解析为函数,如:

<?php
header('content-type:text/html;charset=utf-8');
$funcName='md5';
echo $funcName('tom');// 相当于调用了md5('tom')

// 对于自定义函数也是如此
function test(){
    echo 'test';
}
$funcName='test';
$funcName();// 相当于调用了test()

要注意的是,可变函数不能用于像echo,print,unset(),isset(),empty(),include,require以及类似的语言结构,需要自己封装之后实现。

回调函数

回调函数就是调用函数的时候将另一个函数的名称当做参数传递进去,并且在函数体中进行调用。

<?php
header('content-type:text/html;charset=utf-8');
function hi(){
    echo 'Hi world!';
}
function hello(){
    echo 'Hello world!';
}
funtion sayWhat($funcName){
    $funcName();// 通过可变函数的形式进行调用
}

sayWhat('hello');

系统函数中也有应用了回调函数的,比较经常用到的有array_maparray_walkarray_filter

以上例子是通过可变函数的形式在函数体中进行调用的,还可以通过call_user_func()call_user_func_array()进行调用。如:

call_user_func('md5','abc'); // 调用md5函数,传参数为'abc' call_user_func('test','1','2'); // 调用test函数,传参数为'1''2' call_user_func_array('test',array('1','2')); // 同上,调用test函数,以数组的形式传参数'1''2'

匿名函数

匿名函数也叫闭包函数,允许临时创建一个没有指定名称的函数,最经常用作回调函数参数的值。
匿名函数也可以作为变量的值来使用。

匿名函数可以这样定义:

$func=funciton(){
    return 'hello';
};
echo $func();

$func=funciton($name){
    return 'hello'.$name;
};
echo $func();

还可以通过create_function()来定义:

$func=create_function('','echo "hello";'); $func(); $func=create_function('$x,$y','return $x+$y'); echo $func(1,2);

不过这种方法比较难以使用。

递归函数

如果函数A需要调用函数B,而发现函数B的代码实现与函数A完全相同,此时就需要封装为递归函数。
像PHP实现目录的遍历,目录的复制、删除非空目录操作必须通过递归函数实现。无限极分类也可以通过递归实现。

递归函数通俗讲就是自己调用自己的函数,通过特定条件结束执行。

包含文件

可以使用requirerequire_onceincludeinclude_once来包含文件,如:

<?php
require 'common.php';
...

使用requirerequire_once包含不存在的文件时,会产生一个致命错误和一个警告,程序终止执行。
使用includeinclude_once包含不存在的文件时,会产生两个警告,程序继续执行。
requirerequire_once的区别在于,require包含同一个文件多次时,就真的包含了多次,而require_once引用同一个文件多次时,只会包含一次。

猜你喜欢

转载自blog.csdn.net/lianjiww/article/details/77860186