PHP之函数

PHP函数

函数概念

定义:PHP中函数其实是一个具有复杂逻辑的代码块,而这种代码块通常可以在很多地方重复使用。函数是使用了一种特殊的结构来将要重复使用的代码进行包裹,后期可以通过定义的函数名字来直接实现重复代码块的调用。

函数结构:函数是一种特殊的结构,包括多个要素:

  • function关键字:PHP内置的一种关键字,用来申明结构的本质
  • 自定义函数名:紧跟function关键字,是一种见名知意的字符串,由字母、数字和下划线组成,其中不能使用数字开头(和变量一样),不区分大小写
  • 参数结构:是一种外部对函数内部数据进行调整的机制(数据输入),

    • 分为形参(定义结构时使用的参数)
    • 实参(调用函数时传入的实际数据)
    • 也可以没有参数
  • 函数体:函数的核心逻辑部分,用来实现某个功能的具体代码,在函数体中可以写普通的业务逻辑实现代码
  • 返回值:return + 数据,将函数得到的结果对外返回,谁调用返回给谁(数据输出),可以没有返回值,系统默认返回NULL

函数基础语法:

<?php
    function 函数名(形式参数){
        // 函数体
        return 返回值;
    }
?>

例子:

<?php
function hello(){
    echo "hello, My name is Taoy";
    
    return 'Taoy';
}
// hello();  // 调用函数
$h = hello();
echo '<br />'.$h; // 打印返回值

?>

上面程序输出:

hello, My name is Taoy
Taoy

函数内存原理

  • 函数不会自动运行,必须通过调用才会执行函数内部的代码块
  • 函数是一种结构,PHP会先编译结构加载到内存(代码段),然后才会从第一行开始执行代码(函数的定义与调用没有顺序关系:PHP特殊)
<?php
hello();     // 先调用(不建议)

function hello(){
    echo "hello, My name is Taoy";
    
    return 'Taoy';
}

# 输出: hello, My name is Taoy
?>
  • 函数的调用是在栈中开辟内存运行
  • 函数运行结束后,会自动释放函数所占用的所有内存(即函数内部的数据变量不能在函数外访问)

参数说明

定义:函数的参数,是指函数在定义过程中所要考虑的外部数据的变化来影响最终结果而定义的虚拟变量(不代表任何真实数据:形参),以及实际调用过程中外部传入主导数据运行的实际数据(实参)

函数的参数分为两种:

  • 定义结构的时候虚拟的数据,叫做形式参数(形参)
  • 调用函数时传入的实际参数(实参)
<?php
function number($n){    // $n 为形式参数, 一旦定义了参数,调用时就必须传参数,否则报错
    echo $n * $n.'<br />';
}

$num = 10;         // 定义实参
number($num);      // $num 为实参
// number();      // 报错,因为无参数
# 输出结果: 100
?>

形参与实参的关系和工作原理

  • 形参:是一种形式,是用来保存函数调用时外部出来的实际数据在函数内部运行的变量
  • 实参:是一种数据,可以是数据值也可以是变量代表的数据
  • 工作原理:实参在函数调用时,将数据或者变量代表的数据传递给形参,而函数一旦运行结束,内部的形参所代表的实际数据就会消失

参数默认值

定义:参数默认值,即函数在定义的时候,发现有些数据是外部可变,但是不需要经常改变的数据的时候,可以对形参指定一个对应的数据,这样用户在调用的时候,即便不给对应的形参传递实参,形参也会有数据去支持函数运行

<?php
function number($n = 3){
    echo $n * $n.'<br />';
}

number(5);
number(); // 不会报错, 自动使用默认值 3

# 输出:25
#        9
?>

默认值使用注意事项

  • 函数形参可以没有默认值也可以有多个默认值
  • 函数有默认值的参数必须定义在所有参数的最后(系统把实参传递给形参是按顺序给)

参数传值方式

定义:参数传值是指函数在调用时,实参到底是如何传递给形参的,他们之间的传值方式是在函数定义时决定的,传值方式就是变量的传值方式。默认的传值方式是值传递。

函数 参数传值方式:值传递,就是将变量的值传递给形参,从而是两个不同变量;引用传值,就是将实参的内存地址传递给形参,两个变量指向同一个地址。

<?php
function number($a, &$b){
    // & 表示地址符号,表示获取的是外部参数的地址
    $a++;
    $b++;
}
$a = 2;
$b = 2;
number($a, $b);  // 这里 $b 是引用传值,所以函数内部改变的是外部变量$b的值
echo $a.'<br />';
echo $b;
?>

输出:

2
3

静态变量

定义:静态变量,即在函数内部使用static关键字修饰的变量,这种变量是在函数第一次调用时执行,而且只执行一次,在函数再次调用时,会自动跳过这一行(不会再次执行)。这种变量能够在同一个函数多次调用共享数据的变化。

使用static关键字修饰变量,通常静态变量都会在定义的时候进行初始化(即给定值)

静态 变量与函数内定义的普通变量的区别在于,初始化那行只会执行一次

<?php

function Demo_static(){
    static $a = 0;
    $b = 0;

    echo $a++;
    echo $b++;
}
Demo_static();  // 输出: 0 0
Demo_static();     // 输出: 1,0 $a 不用初始化,而 $b 需要初始化
?>

静态变量的作用域:虽然静态变量允许跨函数共享数据,但是静态变量只允许在当前函数内部使用,其他任何地方都用不了

作用域

定义: 作用域(scope),指的是变量所定义的环境决定的能够被访问的工作区域。在PHP中变量的作用域分为三种:全局作用域、局部作用域和超全局作用域

  • 全局作用域:用户自定义全局变量,但是是在函数外部定义的变量。全局作用域的变量能够在函数外部的任何地方使用,其生命周期是从定义直到脚本执行结束(手动释放除外)
  • 局部作用域:用户在函数内部定义的局部变量。局部变量只能在函数内部访问,函数外部不能够访问,其生命周期是函数运行时
  • 超全局作用域:能够在PHP脚本的任何地方使用,包括函数内部(以后还包含在类内部)。是系统定义的超全局变量,生命周期是脚本周期
<?php
$a = 3; // 全局变量,在全局作用域中访问
$_GET['b'] = 1; // 超全局变量

function Demo_echo(){
    $b = 4; // 局部变量,只能在局部作用域访问(函数自身内部)
    echo $a; // 报错 系统提示该变量未定义
    echo $_GET['b'];
}
// echo $b 报错 系统提示该变量未定义
Demo_echo();
?>

如果要在局部作用域(函数内部)访问全局变量:

  • 所有定义的全局变量都会放到$GLOBALS中,而$GLOBALS是超全局变量,可以在任意地方访问
<?php
$a = 1;
function echo_a(){
    echo $GLOBALS['a'];   //全局变量:使用超全局变量可以访问所有全局变量
}
echo_a();     // 输出 1
?>
  • 可以通过函数的参数将外部变量传递到函数内部,如果想要函数内部访问且改变的话,可以采用引用传值
<?php
$a = 1;
function echo_a(&$out){     // 引用传值
    echo $out.'<br />';     
    $out = 2;                 // 修改引用传进来的值
}
echo $a.'<br />';             // 1
echo_a($a);                    // 1
echo $a;                    // 2 因为被函数内部修改了

代码输出:

1
1
2
  • 可 以使用global关键字在函数内部进行引入:global关键字是一个全局引用/定义变量,如果是引入全局变量,必须使用global定义一个外部同名变量(global只能声明变量,不能赋值)
<?php
$a = 1;
function echo_a(){
    global $a;
    echo $a;
}
echo_a(); // 输出 1
?>

如果函数内部定义的局部变量想在外部全局作用域访问

  • 引用传值:内部能访问外部,固然外部也能访问内部
  • 使用global关键字:global关键字的特性是如果全局作用域存在同名变量,则引入;否则创建一个对应的全局变量
<?php
function echo_a(){
    global $a;
    $a = 1;
}
// echo $a;  // 报错
echo_a();
echo $a; // 输出 1
?>

可变函数

<?php
function a(){
    echo "taoy";
}
// 定义一个变量:保存一个字符串与函数名同名
$n = 'a';
// $n() = a()
$n(); // 输出: taoy  

PHP常用系统函数

常见输出类:帮助程序员进行数据输出或者调试数据

  • echo:一种语法结构,不是函数,不需要使用括号
  • print_r:输出变量的结构,方便查看
  • var_dump:也是一种语法结构,详细打印变量的结构和数据
  • exit/die:输出消息并终止脚本执行

时间日期类:帮助程序员进行时间操作管理

  • time:获取当前时间的时间戳(从格林威治时间1970年1月1日0点0分0秒开始)
  • date:按照指定格式输出时间,可以是当前时间也可以是指定时间戳
  • strtotime:将任何英文文本日期时间描述转换成时间戳
  • microtime:获取时间戳和微妙数(精度高)

数学类:帮助程序员进行数学操作

  • max:获取多个数中最大的(可以是数组)
  • min:获取多个数中最小的(可以是数组)
  • floor:舍去法取整(向下取整),获取不大于当前数值的最大整数
  • ceil:进一取整(向上取整),获取不小于指定数值的最小整数
  • mt_rand:获取指定区间或者0到最大数之间的一个随机整数
  • round:根据指定的小数位进行四舍五入

字符串类:帮助程序员对字符串进行基本操作

  • addslashes:对ASCII中的特殊字符进行转义,通常对用户输入的内容进行特殊处理
  • htmlsmpecialchars:将HTML特殊符号转换成实体
  • htmlspecialchars_decode:将实体符号转换成普通字符
  • chr:将ASCII对应的数值转换成对应的符号
  • ord:将ASCII字符转换成对应的数值
  • explode:将字符串按照指定的符号分隔,得到一个数组
  • implode:将一个数组按照指定的符号连接成一个字符串
  • md5:使用md5算法对数据进行加密
  • str_repeat:将字符串重复指定次数
  • str_replace:字符串替换
  • str_shuffle:随机打乱一个字符串
  • str_split:按照指定长度将数组分割,返回数组
  • strip_tags:去除HTML和PHP标记
  • strlen:获取字符串的长度(字节长度)
  • stripos/strpos:查找字符串中首次出现目标字符串的位置
  • substr:从字符串中截取指定位置和长度的子字符串
  • trim:去除字符串两边的空格(默认是空格,也可以是其他字符)
  • ucfirst:将字符串首字母大写
  • strtolower:将所有字母小写
  • strtoupper:将所有字母大写
  • strstr:获取字符串中某个字符首次出现到最后的字符串

6.数组函数:帮助程序员对数据进行操作

  • array_key_exists:判断下标是否在数组中存在
  • array_keys:获取数组全部下标,或某个确定值的下标
  • array_merge:合并数组元素(相同字符串下标元素是覆盖)
  • array_pop:从数组最后弹出一个元素(原数组元素减少)
  • array_push:从数组最后加入一个元素(原数组元素增加)
  • array_unshift:从数组最前面加入一个元素(原数组元素增加)
  • array_shift:从数组最前面弹出一个元素(原数组元素减少)
  • shuffle:将原始数组打乱
  • in_array:判断元素是否在数组中存在
  • range:生成一个规则数值数组
  • current:获取当前数组指针所在位置的值
  • next:将数组元素指针向后移动一位,并获取新元素的值
  • prev:与next相反,向前移动
  • end:指针移动到最后一个元素,并获取元素值
  • reset:重置数组指针(回到第一个元素)
  • list:语法结构,从数组中获取数据,并且将数据赋值给变量

本文链接:

https://www.betao.cn/archives/phpreview05.html
1 + 6 =
快来做第一个评论的人吧~