国强极客
有问题请加微信:guoqiang7585
国强极客

7、php函数基础 参数 可变函数 匿名函数 系统函数

7、php函数基础 参数 可变函数 匿名函数 系统函数
全国大流量卡免费领

7.1.函数的概念与作用

函数不是数!
函数是一种代码形式(语法形式)。
函数是将“若干行代码”以一种语法形式包装成的一个整体。
该整体可以做到“需要的时候就去执行它”(就是执行其中的若干行代码)。
函数是解决在不同情形(不同代码位置)下需要执行相同代码的有效方式——即所谓代码重用
函数通常用于“专业的事由专业的人来做”这种现实世界的常见现象。
比如油条摊:专门做油条,顾客随时需要,就随时可以买(付钱就可以)。
比如轮胎厂:专门生产不同型号轮胎,汽车制造厂随时需要就随时提供(付钱)。
比如豆浆机:专门制作豆浆,人们随时需要豆浆就随时可以启动豆浆机制作豆浆(提供豆子和水)。

  • 课堂练习##7.2.函数的定义与调用
    ###定义语法形式:
    php
    function 函数名($形参1,$形参2, ...... ){ //形参,就是形式参数,是变量
    //函数体语句块; //就是若干行代码
    }

    ###调用语法形式:
    php
    函数名($实参1,$实参2, ...... ); //实参就是实际参数,是数据

    说明:
    1,函数名的命名规则,跟变量名一样;
    2,定义函数的目的就是为了以后能够调用;
    3,调用函数,其实就是执行函数中代码;
    4,形参,其实就是变量,是只能在该函数内部使用的变量;
    5,实参,其实就是数据,是会传入函数内部的数据(是一一对应地赋值给形参变量);
    ####案例演示:可以给定一个半径,求对应圆面积
    写一个函数,可以给定一个半径,求对应圆面积。
define("PI", 3.14);
//求半径为r的圆的面积
function circleArea($r)
{
    $s = PI * $r * $r;
    return $s;  //返回计算的结果
}
$s1 = circleArea(1);
echo "<br>半径为1的圆面积为:$s1";
$s2 = circleArea(3);
echo "<br>半径为3的圆面积为:$s2";
$s3 = circleArea(5.7);
echo "<br>半径为5.7的圆面积为:$s3";

课堂练习:年份数(整数)是否为闰年

定义一个函数,该函数可以判断一个年份数(整数)是否为闰年。
扩展(进一步):利用该函数,输出2000年到2100年范围中的所有闰年。

function is_runnian( $year )
{
    if($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

for($i = 2000; $i <= 2100; $i++)
{
    if( is_runnian( $i ) )
    {
        echo "$i ";
    }
}

7.3.函数执行原理(重点/难点)

程序总是运行在一个“内存空间”。
程序开始执行的位置所在的空间,可以称之为“主运行空间”。
实际上,通常函数外面的那些程序,都是运行在主空间中。
那么,函数的运行,就相对独立了——每个函数的每次调用,都是运行在单独的一个自己的空间中。
如下所示:

提示:
在从主空间进入函数空间的时刻,会先将函数调用时的“实参数据”,赋值(传值)给“形参变量”
而后,才开始执行函数内部的语句!

7.4.函数参数(重点)

7.4.1.形参(形式参数)

就是定义函数的时候,在函数名后的小括号中给出的变量名
形参,只能在函数内部使用——即该变量的使用范围仅仅局限于当前函数内部。
形参的本质是变量

7.4.2.实参(实际参数)

就是调用函数的时候,在函数名后的小括号中给出的数据值
实参的本质是数据!

7.4.3.函数参数的传值方式

含义:
实参变量的值,以什么方式传给形参。
说明:
其前提是:实参是一个变量的情况。
所以其实这里讨论的是:两个变量的传值方式问题。
默认情况下是值传递。

可以使用“&”符号设定为引用传递,形式如下:

function  f1( $p1, &$p2, .... ){  
。。。。。 
}

此时,在函数内部,对该形参变量改变其值,则对应的实参变量(在函数外部)的值也改变了。

案例演示:

7.4.4.形参的默认值

形参可以设定默认值。形式为:$形参名 = 某值
设定默认值的形参,只能放在没有设定默认值的形参的后面(右边)。
设定了默认值的形参对应的实参可以不提供数据,此时函数就会使用该默认值当做实参的值。

function  f1($p1,  $p2,  $p3 = 3,  $p4 =true ){
//函数体语句块
}

则此时调用上述函数,以下形式都可以:
f1(1,2);
f1(3, 4, 5);
f1(6,7,8, 9);

案例演示:给定半径的球的体积

定义一个函数,该函数可以计算给定半径的球的体积,其中圆周率π默认使用3.14,也可以根据不同精度的需要给定不同的圆周率。
球的体积:
4PIrrr/3

//定义一个函数,该函数可以计算给定半径的球的体积,
//其中圆周率π默认使用3.14,也可以根据不同精度的需要给定不同的圆周率。

function ball_tiji($r, $pi=3.14)
{
    $s = $pi * 4 * $r * $r * $r / 3;
    return $s;
}
$s1 = ball_tiji(1);
echo "<br>半径为1的球的体积为:$s1";

$s2 = ball_tiji(1, 3.1416);
echo "<br>半径为1的球的体积为:$s2";

7.5.函数返回值(重点)

含义:
一个函数在执行结束时,可以让其返回一个数据,这就是函数的返回值。
语法:

return  要返回的数据;

说明:
1,一般情况下一个函数执行结束都是需要返回一个数据值的。
2,函数也可以在执行的中途返回数据,此时,函数也是结束了的。
3,一个函数执行得到的返回值,可以在任何需要数据的场合使用,跟使用一个变量数据一样。

演示:两数的平方和与两数的平方差相除的结果

计算两数的平方和与两数的平方差相除的结果。

另外,return语句也可以不带后面的数据,此时,就只是单纯地结束函数,并不返回数据(也可以说返回null这个空数据)。

演示:当两个数相等时,报错并结束,不返回数据

将上述案例加强一个判断条件:当两个数相等时,报错并结束,不返回数据。

结论:
只要执行到return语句,函数就会结束,是否返回数据,看该行代码。

7.6.可变函数

含义:
所谓可变函数,就是函数名是一个变量的情形
可变函数实际上就是在调用函数的时候,使用一个变量来表示函数名,并用该变量去调用函数。
注意:定义函数的时候,不可以使用可变函数名!

对比:
可变变量,就是变量名是一个变量,比如:$$v1;

可变函数,就是函数名是一个变量,比如:
调用函数f1的语法是这样:f1();
可以使用可变函数的语法来调用:

$func_name = “f1”;  
$func_name();   //此时实际就是调用f1

可变函数的本质是:一个变量的内容是一个字符串,该字符串是一个函数的名字,比如:

function  f1(){ ....... }
function  f2(){ ....... }
$f  = “f1”;
$f();       //调用了函数f1,这就是可变函数!!
$f  = “f2”;
$f();       //调用了函数f2,这就是可变函数!!
$f = “f3”;
$f();       //报错!因为没有f3这个函数,实际是,就是相当于: f3();

可变函数应用场景演示:

function do_jpg($f){
    echo "<br>处理jpg图片。。。。";
}
function do_gif($f){
    echo "<br>处理gif图片。。。。";
}
function do_png($f){
    echo "<br>处理png图片。。。。";
}
$file = $_GET['file_name']; //用户上传的文件名,比如123.jpg, 456.gif
//haystack表示:干草堆,neele:缝衣针
//strrchr()用于在一个字符串haystack中找出指定的某个字符串needle出现的最后位置往后的所有字符
//$houzhui =  strrchr(haystack, needle)
$houzhui =  strrchr($file, '.');//得到类似这样: ".gif",  ".jpg", ".png"
//substr($v1,位置p,[长度n]):取出字符串v1中从位置p开始之后的n个字符
//如果长度n省略,则一直取到最后
//比如:substr('abcdef', 3, 2): 'de'
//比如:substr('abcdef', 3, 3): 'def'
//比如:substr('abcdef', 3, 4): 'def'
//比如:substr('abcdef', 3):   'def'
$houzhui = substr($houzhui,1);  //得到类似这样:"gif",  "jpg", "png"

$func_name = "do_" . $houzhui;  //构建出可以使用的函数名,可能是上述3个函数之一的名字
$func_name( $file );//这就是可变函数的使用!实际使用的可能是:do_jpg(), do_gif(), do_png()之一

7.7.匿名函数

含义:
就是一个“定义时没有名字”的函数。

此时,就面临一个问题,那就是:没有名字,怎么调用呢?
实际上,此时它通过另一个方式来调用,如下所示:

$f1 = function   (形参...) {  .......  };     //这是定义匿名函数的形式。
$f1(实参);    //这就是调用该调用。可见其调用,跟可变函数的写法非常类似。

案例:两个数的最小公倍数

定义一个匿名函数,该函数可以计算两个数的最小公倍数,并调用该函数算出6和8的最小公约数。

写一个函数,能够计算(求)出3个数中的最大值

//写一个函数,能够计算(求)出3个数中的最大值
//比如:3, 2, 4》》4
//比如:3, 3, 2》》3
//比如:3, 5, 2》》5
function getMaxIn3Value($n1, $n2, $n3)
{
    if($n1 >= $n2 && $n1>= $n3){
        return $n1;
    }
    elseif($n2 >= $n1 && $n2>= $n3){
        return $n2;
    }
    else
    {
        return $n3;
    }
}

定义一个函数,该函数能够判断一个数字是否是一个素数(也叫质数),

/*
定义一个函数,该函数能够判断一个数字是否是一个素数(也叫质数),
是就返回true,否则就返回false。
并利用该函数的功能,输出2-200之间的所有素数。
注:素数就是只能被1和它本身整除的数。——即只有两个可以整除的数
*/
//功能:判断一个数是否为素数
function is_leap($n){
    $count = 0;
    for($i = 1; $i<= $n; $i++)
    {
        if($n % $i == 0)
        {
            $count++;
        }
    }   
    if($count == 2) //只有两个可以整除的数,就是素数
    {
        return true;
    }
    return false;
}
echo "<br>2是否素数:";  var_dump(is_leap(2));
echo "<br>3是否素数:";  var_dump(is_leap(3));
echo "<br>19823是否素数:";  var_dump(is_leap(19823));

echo "<hr>";
$count = 0;
for($i = 2; $i<=200; $i++)
{
    if(is_leap($i))
    {
        echo "$i ";
        $count++;
    }
}
echo "<br>共有{$count}个";

7.8.系统常用函数介绍

7.8.1.跟函数有关的函数

function_exists(“函数名”) //判断一个函数是否已经存在;
func_get_arg( $n )  //在函数内部可用,用于获得第n个实参(n从0开始算起)
func_get_args() //在函数内部可用,用于获得所有实参,结果是一个数组
func_num_args() //在函数内部可用,用于获得实参的个数

上面3个函数,可以让我们在自定义的函数内部,直接访问(使用)实参数据,而不依赖于形参变量。
这种特性,可以给我们定义某种“不确定有几个数据需要计算的”场合。

示例:

function xxx(){
    $v1 = func_get_arg(0);  //1
    echo func_get_arg(2);   //5
    $a = func_get_args();   //结果是数组:[1, 2, 5]
$n = func_num_args();   //3
}
xxx(1,2, 5);

案例:该函数可以求出所给定的若干个数据中的奇数的和。

定义一个函数,该函数可以求出所给定的若干个数据中的奇数的和。

//定义一个函数,该函数可以求出所给定的若干个数据中的奇数的和。
function jishuhe()
{
    $all_args = func_get_args();    //得到所有实参,是一个数组!
    $count = count($all_args);      //取得数组的长度(元素个数)
    $sum = 0;
    //对该数组(也就是所有实参)进行遍历循环
    for($i = 0; $i < $count; $i++)
    {
        if($all_args[$i] % 2 == 1)
        {
            $sum += $all_args[$i];  //累加器
        }
    }
    return $sum;
}
$he1 = jishuhe(1, 5, 2, 8, 7);
echo "<br>和1为:$he1";
$he2 = jishuhe(11, 3, 2, 8, 4, 10, 12);
echo "<br>和2为:$he2";

7.8.2.字符串有关常用函数

输出与格式化:echo , print, printf, print_r, var_dump.
字符串去除与填充:trim, ltrim, rtrim, str_pad
字符串连接与分割:implode, join, explode, str_split
字符串截取:substr, strchr, strrchr,
字符串替换:str_replace, substr_replace
字符串长度与位置: strlen, strpos, strrpos,
字符转换:strtolower, strtoupper, lcfirst, ucfirst, ucwords
特殊字符处理:nl2br, addslashes, htmlspecialchars, htmlspecialchars_decode,

7.8.3.常用数学函数(重点)

max: 取得若干个数据中的最大值
min: 取得若干个数据中的最小值
round: 对某个数据进行四舍五入(可以设定保留几位小数)
ceil: 对某个数“向上取整”:将一个数据往上找出其小的一个整数(含其本身)。
floor: 对某个数“向下取整”:将一个数据往下找出其大的一个整数(含其本身)

$n1 = floor(4.1);   //4
$n2 = floor(4.9);   //4
$n3 = floor(4);     //4
$n4 = floor(-4.1);  //-5

abs: 取得某个数据的绝对值
sqrt: 计算某个数的开方值
pow: 对某个数进行“幂运算”(就是获得某个数的若干次方)

$n1 = pow(3, 2);    //3的2次方,9
$n2 = pow(2, 3);    //8
$n3 = pow(1.5, 2);  //2.25
$n4 = pow(1.5, 2.5);    //。。。。。1.5的2.5次方
$n5 = pow(9, 0.5);      //3,就是开方,相当于sqrt()

rand: 获得某两个数之间的随机整数(含该两个数)
mt_rand: 获得某两个数之间的随机整数(含该两个数),比rand更快。

$n1 = mt_rand(0, 10);   //随机数在0-10之间(含)

演示案例:任意两个数字之间的随机整数

定义一个函数,该函数可以返回所给定的任意两个数字之间的随机整数。

7.8.4.常用时间函数

time:获得当前时间(精确到秒),结果其实一个“整数”而已,代表从1970年1月1日0:0:0秒到当前时刻的秒数。
microtime:获得当前时间(可以精确到微秒)
有两个用法:
microtime(true):获得秒数(跟time一样),是一个数字(浮点数,有4位小数)
microtime(false):获得也是秒数,但因为精度太高,导致浮点数无法表达出来,以致返回的是一个字符串。
mktime:创建一个时间数据,参数为:时、分、秒,月、日、年
$t1 = mktime(10, 8, 5, 7, 12,  2018);
date:将一个时间转换为某种字符串形式
date(“Y-m-d H:i:s”);
idate:取得一个时间的某个单项数据值,比如idate(“Y”)取得年份数
strtotime:将一个字符串“转换”为时间值;
date_default_timezone_set:在代码中设置“时区”
date_default_timezone_get:在代码中获取“时区”
echo "<br>从1970.1.1 0:0:0到现在共经过了这么多秒:". time();
echo "<br>从1970.1.1 0:0:0到现在共经过了这么多秒:". microtime(true);
echo "<br>从1970.1.1 0:0:0到现在共经过了这么多秒:". microtime(false);

案例:课堂电脑性能大比拼:

计算从1加到1000万,看花了多少时间?
做法:先获得一个时间,然后计算,然后再获得一个时间,后一个时间,减前一个时间,就是耗时。

$t1 = microtime(true);  //获得当前时间
$n = 0;
for($s=1;$s<=10000000;$s++)
{
    $n+=$s;
}
$t2 = microtime(true);  //获得当前时间
$t3 = $t2 - $t1;
echo "$n <br>";
echo $t3;
赞赏
全国大流量卡免费领
对内容有疑问,请加我微信:guoqiang7585
# #
首页      全栈教程      php初级      7、php函数基础 参数 可变函数 匿名函数 系统函数

国强极客

7、php函数基础 参数 可变函数 匿名函数 系统函数
7.1.函数的概念与作用 函数不是数! 函数是一种代码形式(语法形式)。 函数是将“若干行代码”以一种语法形式包装成的一个整体。 该整体可以做到“需要的时候就去执行它”(就是执行其中的若…
扫描二维码继续阅读
2019-12-03