阿里云新用户优惠

第四章 PHP函数应用

一、函数的定义

  • 定义:函数,是将一段完成特定任务的程序封装而成的独立代码块。它通过参数获取外界程序的数据,并通过返回值将函数中的运行结果,反馈给外界程序
  • 优点:在程序设计过程中,经常需要在不同地方重复进行某种相同的运算操作如果每次都重新书写一次程序代码,不仅大大增加程序员的工作量,而且对程序后期的维护,也带来很大的不便,还会降低了程序的运行效率。将这些代码封装成函数以后,既可以简化代码结构,实现代码的重用,而且能够减少代码编写工作量与程序的后期维护。
  • 分类:PHP中的函数,分为三类:系统函数、自定义函数以及变量函数。

二、常用系统函数

系统函数是PHP预先已经提供的函数,用户使用这些函数时,不需要再对函数进行定义,也不需关心实现其功能的内部程序,只需根据其参数需求,直接引用即可实现所需的功能。

1、数据检查函数

is_numeric()函数

is_numeric()函数用于检查数据是否为数字,其参数可以是一个变量也可以是一个标量。如果参数中的内容,全部都是数字(包括小数),函数的返回值是true,否则为false。
需要注意的是,is_numeric()只检查数据内容,不检查数据类型,只要数据内容是数字,无论它是数值型还是字符串型,is_numeric()都返回true。

<?php 
    $A = 123;
    $B = "123";
    if(is_numeric($A)){
        echo "A是数字<br>";
    } 
    if(is_numeric($B)){
        echo "B是数字<br>";
    }
?>

为了检测表达式的值是否符合期望的数据类型,PHP提供了一组is_*()的内置函数,如果检测的值符合检测的数据类型,则返回true,否则返回false.

函数名称 功能描述 举例
is_bool() 检测是否属于布尔类型 is_bool(1 > 2) = true
is_string() 检测是否属于字符串类型 is_string(“12ab”) = true
is_float() 检测是否属于浮点类型 is_float(12.3) = true
is_int() 检测是否属于整型 is_int(12) = true
is_null() 检测是否属于空值 $a = null; is_null($a) = true
is_array() 检测是否属于数组 $A = []; is_array($A) = true

2、时间日期函数

PHP中的时间日期,使用的是unix的时间戳机制,以格林威治时间1970-1-100: 00:00为0秒,向后以秒为单位累加计时,如1970-1-1 01:00:00的时间戳是3600。这与现实生活工作中的时间使用习惯区别很大,PHP为此提供了一系列时间日期的格式转换函数。

date()函数

date()函数是PHP中最常用的日期函数,它的主要功能是用于格式化服务器的本地日期。
其基本语法格式是:
date(string $format, int $timestamp = ?): string
“format”是必填参数,用于指定用户需要的日期输出格式,该参数须依据PHP已经规定的系统关键字进行设置。 下面列出了一些常用于日期的字符:

  • d - 表示月里的某天(01-31)
  • m - 表示月(01-12)
  • Y - 表示年(四位数)
  • 1 - 表示周里的某天
    “timestamp”“是可选参数,用于指定需要转换格式的时间戳。如果不填,默认为系统当前的时间戳。
<?php
    echo "今天是 " . date("Y/m/d") . "<br>";
    echo "今天是 " . date("Y.m.d") . "<br>";
    echo "今天是 " . date("Y-m-d") . "<br>";
    echo "今天是 " . date("l");
?>

使用 date() 函数在网站上自动更新版本年份:

© 2020-<?php echo date("Y")?>
strtotime()函数

strtotime()函数的功能是将日常阅读习惯中的日期时间换算为unix时间戳,它的参数可以是类似“年-月-日”格式的时间表达式,也可以是类似“today”、“yesterday”类的时间单词,还可以是“last month”类的时间短语。

<?php
    $d1 = strtotime("today");
    $d2 = strtotime("yesterday");
    $d3 = strtotime("2021-09-01");

    echo $d1."<br>";
    echo $d2."<br>";
    echo $d3."<br>";
    echo "<hr>";
    echo "今天日期是:".date("Y-m-d", $d1)."<br>";
    echo "昨天日期是:".date("Y-m-d", $d2)."<br>";
    echo '$d3日期是:'.date("Y-m-d", $d3)."<br>";
?>
checkdate()函数

checkdate()函数用于检查一个日期是否属于有效日期,但不检查时间。其语法格式如下: checkdate(month,day,year) 其中,month、day与year三个参数都是整型。如果参数中的值属于有效日期,函数返回true,否则返回false。

<?php
    $y = 2021;
    $m = 2;
    $d = 30;
    if(checkdate($m, $d, $y)){
        echo "合法日期";
    } else {
        echo "无效日期";
    }
?>

3、随机函数

mt_rand()函数

PHP的常用的随机函数是mt_rand()。其语法格式如下: mt_rand([min_num,max_num]); 如果指定参数min_num与max_num的值,即随机返回一个[min_num, max_num]之间的整数,如果不指两个参数的值,即随机返回一个整数,其取值范围与系统的字长有关。 例子:生成随机验证码

<?php
    $seed = "ABCDE12345";
    $max = strlen($seed) - 1;
    $vc = "";
    for($i = 0; $i < 4; $i++){
        $index = mt_rand(0, $max);
        $vc .= $seed[$index];
    }
    echo $vc;
?>

三、自定义函数

1、自定义函数的定义

自定义函数是程序员根据实际需要,编写的一段完成特定功能的、可重复调用的代码。
自定义一个函数的语法格式如下: function 函数名([参数1|参数2|参数3]) { 函数体; return 返回值; }

<?php
    //函数定义后不调用是不会执行的
    function my_fun($A, $B)
    {
        echo "两数之和是".($A + $B);
    }
?>

2、函数的调用

不管是自定义的函数还是系统函数,如果函数不被调用,就不会执行。只要在需要使用函数的位置,使用函数名称和参数列表进行调用即可。

函数被调用后开始执行函数体中的代码,执行完毕返回到调用的位置继续向下执行。所以在函数调用时函数名称可以总结出以下三个作用。

  • 通过函数名称可以调用函数,并让函数体的代码运行,调用几次函数体就会执行几次;
  • 如果函数有参数列表,还可以通过在函数名后面的小括号中传入对应的值给参数,在函数体中使用参数来改变函数内部代码的执行行为;
  • 如果函数有返回值,当函数执行完毕时就会将 return 后面的值返回到调用函数的位置,这样就可以把函数名称当做函数返回的值使用。 例子:
<?php
    function add($num1,$num2){
        $a = $num1 + $num2;
        return $a;
    }
    $sum = add(11,5);
    echo '$sum = '.$sum.'<br>';
    echo '6 + 33 ='.add(6,33).'<br>';
    echo '42 + 21 ='.add(42,21).'<br>';
    echo '167 + 153 ='.add(167,153);
?>

将随机生成验证码定义为函数

<?php
 function create_code($len = 4)
{
    $seed = "ABCDE12345";
    $max = strlen($seed) - 1;
    $vc = "";
    for($i = 0; $i < $len; $i++){
        $index = mt_rand(0, $max);
        $vc .= $seed[$index];
    }
    return $vc;
}
$code = create_code();
echo $code;    
?>

3、参数的传递

在调用函数时,需要向函数传递参数,被传入函数的参数称为实参,而函数定义的参数称为形参。而向函数传递参数的方式有四种,分别是值传递、引用传递、默认参数和可变长度参数。

  • 值传递
    值传递是 PHP 中函数的默认传值方式,也称为“拷贝传值”。顾名思义值传递的方式会将实参的值复制一份再传递给函数的形参,所以在函数中操作参数的值并不会对函数外的实参造成影响。因此如果不希望函数修改实参的值,就可以通过值传递的方式。 例子
<?php
    function swap($a, $b){
        echo '函数内,交换前 $a = '.$a.', $b = '.$b.'<br>';
        $temp = $a;
        $a = $b;
        $b = $temp;
        echo '函数内,交换后 $a = '.$a.', $b = '.$b.'<br>';
    }
    $x = 5;
    $y = 7;
    echo '函数外,交换前 $x = '.$x.', $y = '.$y.'<br>';
    swap($x, $y);
    echo '函数外,交换后 $x = '.$x.', $y = '.$y;
?>
  • 引用传递
    参数的引用传递就是把实参的内存地址复制一份,然后传递给函数的形参,实参和形参都指向同一个内存地址,因此函数对形参的操作,会影响到函数外的实参。
    引用传递的方式就是在值传递的基础上加上一个&符号,如下所示:
<?php
    function swap(&$a, &$b){
        echo '函数内,交换前 $a = '.$a.', $b = '.$b.'<br>';
        $temp = $a;
        $a = $b;
        $b = $temp;
        echo '函数内,交换后 $a = '.$a.', $b = '.$b.'<br>';
    }
    $x = 5;
    $y = 7;
    echo '函数外,交换前 $x = '.$x.', $y = '.$y.'<br>';
    swap($x, $y);
    echo '函数外,交换后 $x = '.$x.', $y = '.$y;
?>
  • 默认参数
    默认参数就是给函数的某个或多个形式参数指定一个默认的值,如果调用函数时不传入对应的值,那么函数就会使用这个默认值,这样可以避免调用时出现没有参数的错误,也可以使一些程序显得更加合理。如果传入对应的参数,就会替换这个默认值。
<?php
    function add($a, $b=56){
        echo $a.' + '.$b.' = '.($a+$b).'<br>';
    }
    add(11);
    add(37, 29);

    // 默认参数也可以是多个,而且默认参数必须放在非默认参数右边,并且指定默认参数的值必须是一个具体的值,如数字、字符串,而不能是一个变量。

    function add($a, $b=33, $c=57){
        echo $a.' + '.$b.' + '.$c.' = '.($a+$b+$c).'<br>';
    }
    add(11);
    add(31, 22);
    add(64, 9, 7);
?>
  • 可变长度参数 在 PHP 5.6 及以后的版本中,函数的形式参数可使用 来表示函数可接受一个可变数量的参数,可变参数将会被当作一个数组传递给函数。示例如下:
<?php
    function test(...$arr){
        print_r($arr);
    }
    echo '<pre>';
    test(1, 2, 3, 4);
    test(5, 6, 7, 8, 9, 10);
?>

4、递归函数

递归函数即自调用函数,也就是函数在函数体内部直接或间接地自己调用自己。需要注意的是使用递归函数时通常会在函数体中附加一个判断条件,以判断是否需要继续执行递归调用,当条件满足时会终止函数的递归调用。

<?php
//声明一个函数,用于测试递归
function test($n){
    echo $n."&nbsp;";        //在函数开始输出参数的值
    if($n>0)
    {                      //判断参数是否大于0
        test($n-1);         //如果参数大于0则调用自己,并将参数减1后再次传入
    }
    else
    {                    //判断参数是不大于0
        echo "<-------->  ";
    }
    echo $n."&nbsp;";
}
test(10);                   //调用test函数将整数10传给参数
?>
//运行结果:10 9 8 7 6 5 4 3 2 1 0 <--------> 0 1 2 3 4 5 6 7 8 9 10 

5、变量函数

PHP 中支持可变函数的概念(也叫变量函数),可以这样理解,如果一个变量名后有小括号( ),那么 PHP 就会寻找与变量值同名的函数并执行它。也就是说如果给一个变量赋不同的值,程序就会调用不同的函数。

<?php
function come(){
    echo "谁进门了?<br>";
}
function go($name="tom"){
    echo "$name 出门了<br>";
}
function back($str){
    echo "$str 重新进门 <br>";
}
$func = "come";        //声明一个变量并赋值
$func();               //使用变量函数来调用函数come()
$func = "go";          //重新给变量赋值
$func("jane");         //使用变量函数来调用函数go()
$func = "back";        //重新给变量赋值
$func("jack");         //使用变量函数来调用函数back()
?>
/*
运行结果:
    谁进门了?
    jane 出门了
    jack 重新进门
*/

四、PHP变量的作用域

1、局部变量

局部变量就是在函数的内部定义的变量,只能在定义的函数内使用。局部变量会在函数调用结束时自动销毁。

<?php
    function example(){
        $a = "PHP基础学习";  // 在函数内定义变量 a
        echo "局部变量 a 的值为:".$a."<br>";
    }
    example();
    if($a){                  // 在函数外部调用 $a,如果 $a 存在则会打印下面的内容
        echo "在函数外部调用函数内的局部变量 a,其值为:".$a;
    }
?>

2、全局变量

全局变量就是定义在所有函数以外的变量,其作用域是当前源码的任何地方。在程序运行期间全局变量会一直存在,只有程序结束运行时才会被销毁

<?php
    $a = "PHP基础学习";      // 在函数外部定义全局变量 a
    function example(){
        if($a){
            echo "在函数内部调用全局变量 a,其值为:".$a;
        }
    }
    example();
    echo "在函数外部调用全局变量 a,其值为:".$a;
?>

在函数中使用全局变量必须使用global关键字先声明,global 关键字只能用来引用函数外部的全局变量,在引用时不能直接赋值,赋值和声明语句需要分开写.

<?php
    $a = 1;
    $b = 2;
    $c = 3;
    function demo(){
        global $a, $b;
        echo "变量 a:".$a;
        echo "<br>变量 b:".$b;
        echo "<br>变量 c:".$c;
    }
    demo();
?>

3、静态变量

静态变量是一个特殊的局部变量。静态变量在初始化之后,会在程序运行期间会一直存在,不过,尽管该变量还继续存在,但不能使用它。当再次调用定义它的函数时,才又可以继续使用。 使用static 变量 = 值;

<?php
    function demo(){
        static $a;  //定义静态变量
        $b = 0;
        $a++;
        $b++;
        echo '第 '.$a.' 次运行 demo 函数, 局部变量 $b 的值为:'.$b.'<br>';
    }
    demo();
    demo();
    demo();
    demo();
?>

五、综合案例

1、验证码验证

demo.php

<?php
    session_start();    
    function create_code($len = 4)
    {
        $seed = "ABCDE12345";
        $max = strlen($seed) - 1;
        $vc = "";
        for($i = 0; $i < $len; $i++){
            $index = mt_rand(0, $max);
            $vc .= $seed[$index];
        }
        return $vc;
    }
    $code = create_code();
    $_SESSION["user_code"] = $code;    
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码验证</title>
</head>
<body>
    <form action="check.php" method="POST">
        <p>验证码:<?php echo $code; ?></p>
        <input type="text" name="code" placeholder="请输入验证码">
        <input type="submit" name="postcode" value="确认">
    </form>
</body>
</html>

check.php

<?php 
session_start();
$message = "请输入验证码";
if(isset($_POST["postcode"]) && isset($_POST["code"]) && strlen($_POST["code"]) == 4){
    if($_SESSION["user_code"] != NULL && $_SESSION["user_code"] == $_POST["code"]){
        $message = "验证成功";
        unset($_SESSION["user_code"]);
    } else {
        $message = "验证码不正确,正确的验证码是 :".$_SESSION["user_code"];
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码验证</title>
</head>
<body>
    <div>
        <a href="demo.php"><<返回上一层</a>
        <h3><?php echo $message; ?></h3>
    </div>
</body>
</html>

2、定义函数is_leap(),用于测试参数($year) 指定的年份是否是 闰年,并返回一个布尔型的值。参数($year)的默认值是2000。

分析:
闰年分为普通闰年和世纪闰年。
闰年的条件是:普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年(如2004年、2020年就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。

<?php
    function is_leap($year = 2000)
    {
        $isFalse = false;
        if($year%4==0 && $year%100!=0 || $year%400==0){
            $isFalse = true;
        }
        return $isFalse;
    }
?>

关注微信公众号,与我交流吧~

分享