PHP之回顾函数的概念

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>> hot3.png

  • 目录
  • 1.前言
  • 2.自定义函数
  • 2.1执行原理
  • 2.2函数名称要求
  • 2.3函数要求
  • 2.4函数返回值
  • 2.5判断重名方法
  • 3.局部变量,全局变量和超全局变量
  • 3.1局部变量
  • 3.1.1动态变量
  • 3.1.2静态变量
  • 3.2全局变量
  • 3.3超全局变量 $GLOBALS
  • 4.PHP传值和传引用的区别
  • 4.1传值
  • 4.2传引用
  • 5.特殊形式函数剖析
  • 5.1可变函数
  • 5.2回调函数
  • 5.2.1自定义回调函数
  • 5.2.2系统提供回调函数
  • 5.2.3调用回调函数
  • 5.3匿名函数
  • 5.4 递归函数
  • 6.函数实战
  • 6.1封装截取文件扩展名
  • 6.2封装获得日期时间星期形式函数
  • 7.总结

1.前言

函数就是用来完成某些功能的代码段,PHP函数又分为系统函数和自定义函数,其中系统函数指的是字符串、数字、数组、日期时间等已封装好的函数;而自定义函数则是按照具体需求封装的函数。

2.自定义函数

原则上一个函数只完成一个功能

2.1执行原理

函数不调用不执行,当封装完函数之后将其载入到内存中,当调用函数的时候,找到对应的函数,执行函数体,当碰到return语句或者执行到函数的末尾,再控制权交到调用的函数的位置上,接着程序继续向下执行。

2.2函数名称要求

不能包含特殊字符,必须以下划线或者字母开头,跟上数字字母下划线;遵循驼峰命名法或者下划线,最好以动词开始,含义明确,不区分大小写,但是尽量遵循大小写调用,比如:getExt(),uploadFile(),但注意不支持重名,重名会报致命错误。

2.3函数要求

可以有参数,也可以没有参数;可以有返回值,也可以没有。

2.4函数返回值

  • 函数只有0个或一个返回值,如果要返回多个值,可以通过返回数组或者对象实现
  • 函数遇到return就立即结束
  • 函数的返回值可以是任意类型
  • 函数默认返回NULL

2.5判断重名方法

那么怎么判断函数名称是否重名?这里有个函数function_exists();

//检查函数名称是否存在重复
//function_exsits($funcName)://存在则返回true,否则返回false

注意:下面该函数,函数内包含函数,如果要调用test6(),必须先调用一次test5()

function test5(){
    function test6(){
        echo "123";
    }
}
test5();
test6();

3.局部变量,全局变量和超全局变量

3.1局部变量

函数体内声明的变量为局部变量,局部变量分为动态变量和静态变量

3.1.1动态变量

什么是动态变量?函数执行完毕就立即释放的,比如下面这个函数,输出:1111

//局部变量——动态变量
function test4(){
    $i =1;
    echo $i,'<br/>';
    ++$i;
}
test4();
test4();
test4();
test4();

3.1.2静态变量

什么是静态变量?通过static关键字声明的变量为静态变量,当第一次调用函数时候相当于初始化静态变量,当函数执行完毕之后静态变量没有释放而是保存到静态内存中,当再次调用函数的时候首先从静态内存中取出变量值接着执行,比如下面这个函数,输出:1234

//局部变量——静态变量
function test4(){
    static $i =1;
    echo $i,'<br/>';
    ++$i;
}
test4();
test4();
test4();
test4();

3.2全局变量

函数体外声明的变量或者在函数体内通过global关键字声明的变量为全局变量,全局变量在函数内函数外都能够使用,比如下面的函数,先输出12,再输出35

//全局变量
$i = 1;
$j = 2;
function test6()
{
    var_dump($i, $j);
}

function test7()
{
    global $i, $j;
    var_dump($i, $j);
    $i = 3;
    $j = 5;
}
test7();
test6();

注意:

在函数中修改全局变量函数内外都会发生变化。

在创建全局变量时候不能同时赋值,比如global $i=1;这是错误的写法。

3.3超全局变量 $GLOBALS

<?php
function test()
{
    $foo = "local variable";
    echo '$foo in global scope:' . $GLOBALS["foo"] . "n";
    echo '$foo in current scope:' . $foo . "n";
}
$foo = "Example content";
test();

输出的是:

$foo in global scope: Example content
$foo in current scope: local variable

4.PHP传值和传引用的区别

4.1传值

默认情况下,函数参数通过值传递,即便在函数内部改变参数的值也不会改变函数外的值,它们的内存空间是独立的。

4.2传引用

通过在参数前添加&符号,代表引用传递参数,在函数内部对其所做操作影响其本身

注意:引用参数只能传递变量给函数,不能传递非变量,如下图所示

function test1(&$j){
    $j+=20;
    var_dump($j);
}
$m=5;
test1($m);
var_dump($m);
echo '<hr/>';
test1(3);//报错,只有变量被引用才能传递,3是一个值

up-2887c2a397ab7cb9a7cc0f491d36f5f9ac6.png

5.特殊形式函数剖析

特殊函数又分为可变函数,递归函数,匿名函数,回调函数和可变参数形式的函数,下面我们一一来看看这些特殊函数的使用情况。

5.1可变函数

如果将”函数名称”赋予字符串类型变量,在使用该变量带有小括号,那么就会解析成为函数

header('content-type:text/html;charset=utf-8');
//可变变量
$funcName = 'md5';
echo $funcName('fangzhijie');
echo '<br/>';
echo md5('fangzhijie');

这里有个方法,可以得到所以已经定义的函数,方便我们查看

//get_defined_functions()得到所有已定义的函数,返回数组,包含系统函数和用户自定义函数
print_r(get_defined_functions());

5.2回调函数

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

5.2.1自定义回调函数

<?php
header('content-type:text/html;charset=utf-8');
//自定义回调函数
function study(){
    echo "this is a return function....";
}

function doWhat($funcName){
    echo '调用回调函数:';
    $funcName();
}
doWhat('study');

5.2.2系统提供回调函数

array_map($callback,$arr1):将回调函数作用到给定数组的单元上,返回一个数组,包含$arr1所有单元经过callback作用之后的单元。

//系统提供回调函数
$array = [1,2,3,4,5];
function test1($var){
    return $var*2;
}
$res = array_map('test1',$array);
print_r($array);
echo '<br/>';
print_r($res);

up-e571973941641e03bf5b10fc49fc1ab9981.png

array_walk($arr1,$callback):使用用户自定义函数对数组中的每个元素做回调处理。

//系统提供回调函数array_walk($arr1,$callback)
$array = [1,2,3,4,5,6,7,8];
function test2($var){
    return $var*3;
}
var_dump(array_walk($array,'test2'));

array_filter():用回调函数过滤数组中的单元

//系统提供回调函数array_filter($arr1,$callback)
$array = [1,2,3,4,5,6,7,8];
function odd($var){
    if($var%2==1){
        return $var;
    }
}
$res = array_filter($array,'odd');
var_dump($res);

up-388ab2a0ed00125783dd7641fc30f96f990.png

5.2.3调用回调函数

可以通过call_user_func()和call_user_func_array()可变函数的形式在函数体中进行调用

call_user_func($callback,$dataString):把第一个参数作为回调函数调用

function study($username){
    echo $username.'is studying...<br/>';
}
function play($username){
    echo $username.'is playing...<br/>';
}
call_user_func('study','queen');

up-c8640d2558d9a27ae8765b3893b6bb6e617.png

注意使用系统函数也行,比如md5

echo call_user_func('md5','fangzhijie');
call_user_func_array($callback,$dataArray):把第一个参数作为回调函数调用
//call_user_func_array($callback,$dataArray):把第一个参数作为回调函数调用
function add($x,$y){
    return $x+$y;
}
echo call_user_func('add',1,3);
echo '<hr/>';
echo call_user_func_array('add',array(2,3));

5.3匿名函数

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

<?php
header('content-type:text/html;charset=utf-8');
//匿名函数形式
$func = function(){
    return 'this is a test';
};
echo $func();
//通过create_function()
$func =create_function('','echo "this is a test2~"');
echo '<hr/>';
$array = [1,2,3,4,5];
$res = array_map(function($var){return $var*2;},$array);
print_r($res);
echo '<hr/>';
call_user_func(function($username){echo "hello ,{$username}";},'fangzhijie');

5.4 递归函数

如果函数A需要调用函数B,而函数B和函数A的代码实现一样,那么就需要封装为递归函数,通俗来讲,就是自己调用自己的函数,通过特定条件结束执行。

比如:

PHP实现目录遍历,目录复制,删除非空目录操作,无极限分类,递归函数除了在函数体内调用自己的函数名,还可以使用__FUNCTION__从而调用自己

注意事项:

对于多处使用的自定义函数,使用包含函数文件方式可以避免多处写相同的函数,因此在这里讲一下require()/require_once()/include()/include_once()的区别

  • 通过require()/require_once()包含文件不存在的时候,会产生一个致命错误和一个警告,程序终止执行
  • 通过include()/include_once()包含文件不存在的时候,会产生两个警告,程序继续执行

6.函数实战

6.1封装截取文件扩展名

/**
 * 截取文件扩展名
 * @param string $filename
 * @return string
 */
function getExt($filename){
    return strtolower(pathinfo($filename,PATHINFO_EXTENSION));
}

注意:

pathinfo() 函数以数组的形式返回文件路径的信息。

语法:pathinfo(path,options)

其中path表示要检查的文件路径,options可选,表示要返回的数组元素,默认all

options可能的值:

  • PATHINFO_DIRNAME - 只返回 dirname,目录
  • PATHINFO_BASENAME - 只返回 basename,文件名
  • PATHINFO_EXTENSION - 只返回 extension,文件名后缀

6.2封装获得日期时间星期形式函数

/**
 * @param string $del1 分隔符,默认年
 * @param string $del2 分隔符,默认月
 * @param string $del3 分隔符,默认日
 * @return bool|string
 */
function getDateStr($del1='年',$del2='月',$del3='日'){
    $dayArr=array('日','一','二','三','四','五','六','日');
    $day=date('w');//一周内第几天0~6
    return date("y{$del1}m{$del2}d{$del3} 星期".$dayArr[$day]);
}
echo getDateStr();
echo getDateStr('/','/',null);

7.总结

通过本次学习,让我们对函数的一些概念有了更加深刻的认识,让我懂得了函数的一些要求(名称,变量,返回值等),以及变量的类型(局部变量(动态和静态),全局变量和超全局变量),又了解了传值和传引用的区别,以及函数的类型(可变函数,回调函数,匿名函数,递归函数),总的来说,本次可以算是一次较深的知识回顾,希望自己再接再厉~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值