函数定义
函数是一段完成指定任务的以命名代码块。 函数可以遵照给它的一组值或参数完成特定的任务,并且可能返回一个值。在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)
- 回调函数就是指调用函数时并不是传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中
- 变量函数
- 使用变量函数声明和应用的回调函数
- 借助call_user_func_array()函数自定义回调函数
- 类静态函数和对象的方法回调
<?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 )
制作回调函数
- 使用变量函数声明和应用回调函数
<?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");
- 借助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");
- 类静态函数和对象的方法回调
<?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);
递归函数
例子:遍历文件夹下所有的文件,
<?php
$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');
?>
匿名函数
例子:
<?php
$var=function($a,$b,$c){
return $a+$b+$c;
};//一定要加分号结束
var_dump($var);
闭包函数
- PHP闭包实现主要靠匿名函数
- 将匿名函数在普通函数中当做参数传入,并可以被返回,就实现了一个简单的闭包
- 通俗的说:子函数可以使用父函数中的局部变量,这种行为就叫闭包
- 闭包的两个特点:
- 作为一个函数变量的一个引用,当函数返回时,其处于激活状态
- 一个闭包就是当一个函数返回时,一个没有释放资源的栈区
- 连接闭包和外界变量的关键字:
USE
闭包可以保存在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use
关键字 - 例子 ```php <?php
function test(){ $a = ‘a’; $b = ‘b’; $func = function($str) use ($a,$b){ echo $str; echo $a; echo $b; } $func(‘asdf’); } test(); ```