08-PHP函数的应用


函数定义

函数是一段完成指定任务的以命名代码块。 函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。在php中有两种函数:自定义函数和系统函数

函数的优越性

  • 控制程序设计的复杂性
  • 提高软件的可靠性
  • 提高软件的开发效率
  • 提高软件的可维护性
  • 提高程序的重用性

判断函数是否存在

function_exists():判断函数是否存在

自定义函数

定义

自定义函数语法格式:

function 函数名称([参数1[,参数2[,...]]]){
    程序内容叙述(函数体);
    [return 返回值;]//如需函数有返回值时使用
}
//return也有终止函数运行的意思

函数的使用:

函数名称([参数1[,参数2[,...]]]);

自定义函数的名称

它是函数在程序代码中的识别名称,函数名可以是以字母或下划线开头后跟零个或多个字母、下划线和数字的任何字符串。函数名不区分大小写,命名函数时不可使用已声明的函数,或php内建的函数名称。

参数

所谓的参数就是用来把数值由函数外部传入函数体中,并用来加以运算处理。参数之间用","号隔开。当函数不需要任何数值传入时,可以省略参数。

返回值

当调用函数时需要它返回一些数值,那么就要函数体中用return
语句实现。return 返回值;

变量

局部变量
函数内部声明的变量,只能在函数内部调用,这就是------++局部变量++
函数的参数就是一个局部变量,声明是形成的,可以在调用时,给值,传值

全局变量
全局变量,在函数外部声明的变量,可以在每个函数中使用(顺序)。
在函数内部如果需要使用函数外部的变量,需要使用global关键字,将外部变量引入

<?php
$name="姓名";
function text(){
    global $name;
    echo $name;
}
text();
?>
输出:姓名

静态变量
一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的用关键字static。 通常,静态变量的第一次使用时赋予一个初始值

<?php
function test(){
    static $a=0;
    echo $a;
    $a++;
}
test();
test();
test();
test();
test();
?>
输出:01234

常规参数的函数

  • 常规函数格式说明:String example(string name,int age, double height)
  • 常规参数的函数,就是实参和形参应该个数相等、类型一致。
  • 上面函数有三个参数,调用时传递的参数个数和顺序必须一致

伪类型参数

  • 伪类型参数的函数格式说明:mixed funName(mixed $a,number $b,callback $c)
  • 三种伪类型:mixed(任意类型)、number、callback(函数类型)

引用参数的函数

  • 引用参数的函数格式说明:void funName(array &args)
  • 当该数值在函数中有任何变动时,会连带队父程序造成影响
  • 注意:如果在函数的形参中使用"&"修饰的参数,在调用函数时必须传入一个变量给这个参数,不能传递一个值。
<?php
$a=0;
function age(&$a){
    $a+=100;
    echo $a;
}
age($a);
echo $a;
?>
输出:100100

默认参数的函数

  • 默认参数的函数格式说明:mixed funName(string name[,string value [,int num]])
  • 在php中,支持函数的默认方式调用,如果在调用函数时没有知道参数的值,在函数中会使用参数的默认值
  • 注意:默认参数必须列在所有没有默认值参数的后面。
<?php
function test($a,$b=1,$c=2){
    echo $a+$b+$c;
}
test(10);
?>
输出:13

可变个数参数的函数

  • 可变个数参数的函数格式说明:mixed funName(string arg1[,string ...])
  • 通常用户定义函数时,设置的参数数量是有限的。如果希望函数可以接受任意数量的参数,需使用一下函数:
    • func_get_args()//返回一个数组,包含所有参数
    • func_num_args()//返回参数总数
    • func_get_arg()//接收一个数字参数,返回指定参数

变量函数

如果将一个函数名称,给一个变量,然后再这个变量后面加上括号,就会调用这个变量值对应函数

例子:

<?php
function add($a,$b){
    return $a+$b;
}
function subtract($a,$b){
    return $a-$b;
}
function multiply($a,$b){
    return $a*$b;
}
function divide($a,$b){
    return $a/$b;
}

$ari=1;
$ar;
switch ($ari) {
	case 1:
		$ar="add";
		break;
	case 2:
		$ar="subtract";
		break;
	case 3:
		$ar="multiply";
		break;
	case 4:
		$ar="divide";
		break;
}

echo $ar(12,16);
?>
输出:28

回调函数

  • 回调函数格式说明:mixed funName(callback arg)
  • 回调函数就是指调用函数时并不是传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中
    1. 变量函数
    2. 使用变量函数声明和应用的回调函数
    3. 借助call_user_func_array()函数自定义回调函数
    4. 类静态函数和对象的方法回调
<?php
$arr=array("abc","a","aaaa","abcde","aaaaaaaaa");
function mysort($a,$b){
    if(strlen($a)>strlen($b))
        return 1;
    else if(strlen($a)<strlen($b))
        return -1;
    else return 0;
}
print_r($arr);
usort($arr,"mysort");
echo "</br>";
print_r($arr);
?>
输出:
Array ( [0] => abc [1] => a [2] => aaaa [3] => abcde [4] => aaaaaaaaa ) 
Array ( [0] => a [1] => abc [2] => aaaa [3] => abcde [4] => aaaaaaaaa )

制作回调函数

  1. 使用变量函数声明和应用回调函数
<?php
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if($n($i))
            continue;
        echo $i."</br>";
    }
}
//过滤所有的回文数
function test($i){
    //strrev:翻转字符串
    if($i==strrev($i))
            return true;
    else return false;
}

demo(500,"test");
  1. 借助call_user_func_array()函数调用函数
<?php
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if(call_user_func_array($n,array($i))
            continue;
        echo $i."</br>";
    }
}
//过滤所有的回文数
function test($i){
    //strrev:翻转字符串
    if($i==strrev($i))
            return true;
    else return false;
}

demo(500,"test");
  1. 类静态函数和对象的方法回调
<?php
class Filter{
    function one($i){
        if($i%3==0)
            return true;
        else
            return false;
    }
    
    static function two($i){
        if(preg_match('/3/',$i){
            return true;
        }else{
            return false;
        }
    }
}
function demo($num,$n){
    for($i=0;$i<$num;$i++){
        if(call_user_func_array($n,array($i))
            continue;
        echo $i."</br>";
    }
}
demo(500,array(new Filter(),"one"));//类中方法的回调
demo(500,array("Filter","two"));//类中静态方法的回调
?>

系统函数

例如:遍历一层目录

$dirname="./phpmyadmin";
function fordir($dirname){
    //打开目录资源
    $dir=opendir($dirname);
    
    readdir($dir);
    readdir($dir);
    while($file=readdir($dir)){
        $nfile=$dirname.'/'.$file;
        if(is_dir($nfile)
            echo "目录:{$nfile}</br>";
        else 
            echo "文件:{$nfile}</br>";
    }
    closedir($dir);//关闭目录资源
}
fordir($dirname);

递归函数

例子:遍历文件夹下所有的文件,

$dirname="./phpmyadmin";
function fordir($dirname){
    //打开目录资源
    $dir=opendir($dirname);
    
    readdir($dir);
    readdir($dir);
    while($file=readdir($dir)){
        $nfile=$dirname.'/'.$file;
        if(is_dir($nfile)
            echo "目录:{$nfile}</br>";
            fordir($nfile);
        else 
            echo "文件:{$nfile}</br>";
    }
    closedir($dir);//关闭目录资源
}
fordir($dirname);

加载自定义的函数库

  • 代码重用
    • 通过重复使用已有的代码,提高开发效率,降低成本
  • include()和require()函数
    • require()将一个文件在预处理期间被导入,像把文件粘贴到使用函数的地方
    • include()与require()几乎等价,区别在于脚本执行时包含,当处理失败时,include()产生一个警告而require()则导致一个致命错误
  • include_once()、require_once()函数
    • 与include()、require()类似,唯一区别就是:如果该文件中的代码已经被包括,则不会再次包括,只会包括一次。
<?php
require 'config.php';
require('config.php');
?>

匿名函数

例子:

$var=function($a,$b,$c){
    return $a+$b+$c;
};//一定要加分号结束

var_dump($var);

闭包函数

  • PHP闭包实现主要靠匿名函数
  • 将匿名函数在普通函数中当做参数传入,并可以被返回,就实现了一个简单的闭包
  • 通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫闭包
  • 闭包的两个特点:
    1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态
    2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区

连接闭包和外界变量的关键字:USE 闭包可以保存在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用 use 关键字
例子

<?php

function test(){
	$a = 'a';
	$b = 'b';
	$func = function($str) use ($a,$b){
			echo $str;
			echo $a;
			echo $b;
	}
	$func('asdf');
}
test();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值