渐进式编程之旅:探寻PHP函数的奇妙世界

前言

欢迎来到渐进式编程之旅!在编程的世界中,函数是一种强大而重要的工具,而PHP函数更是让我们能够创造出令人惊叹的网络应用程序和网站的关键。你是否曾经想过探寻PHP函数的奇妙世界,深入了解它们的工作原理以及如何利用它们来解决编程难题?本文将带你踏上这个神奇之旅,一起揭开PHP函数的面纱,探索这个渐进式编程世界的无限可能性。

这是本篇文章的脉络图:


一、 函数的定义和调用

1.1 初识函数

1.1.1 函数分类

PHP 的真正威力源自于它的函数。在 PHP 中,提供了超过 1000 个内建的函数。

php函数分为:系统内部函数和自定义函数。

函数:封装一段用于完成特定功能的代码。

当使用一个函数时,只需关心函数的参数和返回值,就可以完成一个特定的功能。

PHP 函数准则:

1.函数的名称应该提示出它的功能

2.函数名称以字母或下划线开头(不能以数字开头)

1.1.2 自定义函数

自定义函数顾名思义,就是需要我们自己来定义的函数。我们在实际开发当中需要很多功能去反复调用,而这些反复要使用到的功能,我们可以定义成功能(函数)。

函数的定义由以下4部分组成:

1.关键字function

2.函数名

3.参数

4.函数体

格式

lua 复制代码
function 函数名([参数1, 参数2, ......])
{
函数体......
}

注:

1.function:在声明函数时必须使用的关键字。

2.函数名:要符合PHP的标识符,且函数名是唯一的,不区分大小写。

3.[参数1, 参数2...]:外界传递给函数的值,它是可选的,多个参数之间使用逗号","分隔。

4.函数体:函数定义的主体,专门用于实现特定功能的代码段。

5.返回值:需要使用return关键字将需要返回的数据传递给调用者。

函数只有被调用后,才开始真正执行函数中的代码,执行完毕,返回调用函数的位置继续向下执行。

注:

1、通过函数名实现调用,可以在函数声明之前调用,也可在之后。

2、如果函数有参数,可以通过传递参数改变函数内部代码执行。

3、如果函数有返回值,当函数执行完毕后,函数名可以当作保存值的变量使用。

1.1.3 return关键字

在大部分编程语言中,return关键字可以将函数的执行结果返回,PHP中return的用法也大同小异,对初学者来说,掌握PHP中return的用法也是学习PHP的一个开始。

首先,它的意思就是返回,return()是语言结构而不是函数。 它的作用是将函数的值传递给调用者,同时终止函数。它只有一个返回值。

注意:如果执行了return,则return语句后面的内容将不会被执了。

例如:

php 复制代码
<?php
function demo(){
return "111111";
echo "3333";
return "222222";
}
echo demo();
?>

输出结果:

1.2 参数设置

对于函数来说,参数的不同设置,决定了其调用和使用方式。

1.2.1 无参函数

适用于不需要提供任何的数据即可以完成指定功能的情况。

例如:

csharp 复制代码
function shout()
{
return 'come on';
}
echo shout();// 输出结果:come on

1.2.2 按值传递参数

PHP默认支持按值传递参数,按此种方式定义的函数,在函数内部可以随意对用户传递的参数进行操作。

例如:

php 复制代码
// 方式一
echo add(5, 7);
// 方式二
$x = 5;
$y = 7;
echo add($x, $y);
function add($a, $b)
{
    $a = $a + $b;
    return $a;
}

注意:默认值必须是常量表达式,不能是变量。如果函数有多个参数,可以为多个参数指定

默认值。但是,带默认值的参数只能位于参数列表的最后,即一个默认值参数的右边不能出

现没有指定参数值的参数。

例如:

php 复制代码
function setPoint($x,$z,$y=0){
echo "{".$x.",".$y.",".$z."}";
}
setPoint(5,90);

1.2.3 引用传参

在开发中,若需要函数修改它的参数值,则需通过函数参数的引用传递。实现方式只需在参数前添加"&"符号即可。

例如:

php 复制代码
$var = 'food';
extra($var);
// 输出结果:food and some extra
echo $var;
function extra(&$str)
{
    $str .= ' and some extra';
}

1.2.4 设置参数默认值

函数参数在设置时,还可以为其指定默认值,也就是可选参数。当调用者未传递该参数时,函数将使用默认值进行操作。

例如:

perl 复制代码
function say($p, $con = 'say "Hello"')
{
return "$p $con";
}
// 输出结果:Tom say "Hello" 
echo say('Tom');

1.2.5 指定参数类型(弱)

在PHP 7.0及以上的版本后,在自定义函数时,可以指定参数具体是哪种数据类型。

当用户调用函数时,如果传递的参数不是int类型,程序会将其强制的转换为int型后,再进行操作,这种方式称为弱类型参数设置。

例如:

php 复制代码
function sum1(int $a, int $b)
{
return $a + $b;
}
echo sum1(2.6, 3.8); // 输出结果:5

除此之外,还可以将其设置为强类型的参数,即当用户传递的参数类型不符合函数的定义,程序会报错提醒。

例如:

php 复制代码
declare(strict_types = 1);//是php7引入的严格类型检查模式的指定语法
function sum2(int $a, int $b)
{
return $a + $b;
}
echo sum2(2.6, 3.8); // 输出结果:Fatal error: ......

1.3 变量的作用域

1.3.1 变量分类

变量只有在其作用范围内才可以被使用,这个作用范围称为变量的作用域。

1.在函数中定义的变量称为局部变量

2.在函数外定义的变量称为全局变量

示例

php 复制代码
function test()
{
$sum = 36; // 局部变量
return $sum;
}
$sum = 0; // 全局变量
echo test(); // 输出结果:36
echo $sum; // 输出结果:0

1.3.2 全局变量的使用

在函数中可以通过参数传递,global关键字和超全局变量$GLOBALS['x']使用全局变量。

1.通过global关键字使用全局变量:

php 复制代码
$x=100;
function test(){
global $x;$y=10;
return $x+$y;
}
echo test();//110

2.通过超全局变量$GLOBALS['x']使用全局变量:

php 复制代码
$x=100;
function test(){
$y=10;
return $GLOBALS['x']+$y;
}
echo test();//110

1.3.3 global关键字

我们经常会遇到一种情况,在函数外部声明了一个全局变量后,我们想在函数内部访问或者修改这一全局变量,这里我们就需要使用一个叫global的关键字来实现。

global作用:在函数内创建一个局部变量,使用global关键字使其成为全局变量的同名引用。我们需要借助global关键字来实现。

例如:

php 复制代码
<?php
$var = '1';//全局变量
function foo(){
global $var;//在函数内创建一个局部变量,使用global关键字使其成为全局变量的同名引用
$var = '2';
}
foo();
echo $var;//2
?>

二、函数的嵌套调用

2.1 嵌套调用

嵌套调用:指的是在调用一个函数的过程中,调用另外一个函数,这种在函数内调用其他函数的方式称为嵌套调用。

1、所谓嵌套函数,就是在函数中定义并调用其他函数。

2、嵌套函数可以将一个复杂的功能分解成多个子函数,再通过调用的方式结合起来,有利于提高函数的可读性。

举例: 班主任老师要计算每个学生语文和数学平均分,其实现思路是首先编写一个函数用于计算学生的语文和数学的总分,然后再编写一个函数用于实现学生的平均分。

php 复制代码
<?php
function sum($yuwen,$shuxue){
$sun=$yuwen+$shuxue;
return $sun;
}
function avg($yuwen,$shuxue){
$avg=sum($yuwen,$shuxue)/2;
return $avg;
}
echo avg(50,20);
?>

2.2 递归调用

递归调用:是函数嵌套调用中一种特殊的调用。它指的是一个函数在其函数体内调用自身的过程,这种函数成为递归函数。

递归调用是一种解决方案,一种逻辑思想,将一个大工作分为逐渐减小的小工作,只不过在程序中,就是依靠函数嵌套这个特性来实现了。

举例:求n的阶乘,计算公式为1×2×3×...×n。如4的阶乘等于1×2×3×4=24。

用for循环的方法思路:因为求n的阶乘,就是求1乘以2乘以3...一直乘到n的乘积。所以for循环的初始条件可设置为 i = 1,限制条件可以是 i <= n 或者 i < n+1。 然后循环体中的就是乘法运算了,将每次循环的 i 值相乘,得到一个乘积。最后输出乘积即可。

用递归的方法:

php 复制代码
<?php
function Fact($n) {
$sum=1;
if($n <= 1){
return 1;
}else{
$sum = $n * fact($n-1);
return $sum;
}
}
echo "2 的阶乘为: " .Fact(2)."<br><br>";
echo "3 的阶乘为: " .Fact(3)."<br><br>";
echo "4 的阶乘为: " .Fact(4)."<br><br>";
echo "10 的阶乘为: " .Fact(10);
?>

三、函数的高级应用

3.1 静态变量

所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。

通过在函数中使用静态变量可以轻松得到一个函数被访问的次数。

举例

1.局部变量的例子:

php 复制代码
<?php
function num()
{
$i = 1;
echo $i;
++$i;
}
echo num();
echo "<br />";
echo num();
?>

说明:第1次调用函数num()输出1,第2次调用函数num()会输出1,不论调用多少次num()函数,输出都会为1。

2.静态变量的例子:

php 复制代码
<?php
function num()
{
static $i = 1;
echo $i;
++$i;
}
echo num();
echo "<br />";
echo num();
?>

说明:第1次调用函数num()输出1,第2次调用函数num()会输出2,依次类推...

3.2 可变函数

可变函数:可变变量,它的实现是在一个变量前添加一个"$"符号,就变成了另外一个变量。 可变函数的实现就是在一个变量名后添加一对圆括号"()",让其变成一个函数的形式,然后PHP就寻找与变量值同名的函数,并且尝试执行它。(可变函数就是将定义好的函数名赋值给一个变量,然后通过这个变量来调用。)

例如:

php 复制代码
//变量函数的用法:
function demo(){
echo "天王盖地虎! ";
}
function demo1(){
echo "宝塔镇河妖! ";
}
$de='demo'; //将demo函数名赋给变量$de;
echo $de();//调用该变量名加();
$ee='demo1';//将demo1函数名赋给变量$ee;
echo $ee();

可变函数的实现就是在一个变量名后添加一对圆括号"()",让其变成一个函数的形式,然后

PHP就寻找与变量值同名的函数,并且尝试执行它。

3.3 回调函数

回调函数(callback) :指的就是具有callable类型的函数,一般用作参数的传递。如PHP内置函数call_user_func()可以接受用户自定义的回调函数作为参数。就是把函数作为参数传入进另一个函数中使用。

例如:

php 复制代码
<?php
function qwe($name,$age){
echo "我叫$name 我$age 岁了 <br>";
}
call_user_func('qwe', "张三",'18');
call_user_func('qwe', "李四",'24');
?>

3.4 匿名函数

匿名函数:就是没有函数名称的函数,也称作闭包函数,经常用作回调函数参数的值。对于临时定义的函数,使用匿名函数无需考虑函数命名冲突的问题。

例如:

php 复制代码
<?php
$sum = function($a, $b) { // 定义匿名函数
return $a + $b;
};
echo $sum(100, 200); // 输出结果:300
?>

匿名函数仍然是函数,可以传入参数,直接把赋数赋值给变量,调用变量即为调用函数。

匿名函数中使用外部的变量,需要通过use关键字实现。use关键字后圆括号"()" 中的内容即为要使用的外部变量列表,多个变量之间使用英文逗号","分隔即可。

例如:

php 复制代码
<?php
$c = 100;
$sum = function($a, $b) use($c) {
return $a + $b + $c;
};
echo $sum(100, 200); // 输出结果:400
?>

除此之外,匿名函数还可以作为函数的参数传递,实现回调函数。

例如:

php 复制代码
<?php
function calculate($a, $b, $func)//回调函数
{
return $func($a, $b);
}
echo calculate(100, 200, function($a, $b) { // 输出结果:300
return $a + $b;
});
echo calculate(100, 200, function($a, $b) { // 输出结果:20000
return $a * $b;
});
?>

四、PHP的内置函数

4.1 字符串函数

字符串函数是PHP用来操作字符串的内置函数,在实际开发中有着非常重要的作用。下面是一些常用的字符串函数及其功能说明:

1. strlen($string): 返回字符串的长度(字符数)。

例如:strlen("Hello") 返回 5,因为 "Hello" 包含 5 个字符。
2. strpos( <math xmlns="http://www.w3.org/1998/Math/MathML"> h a y s t a c k , haystack, </math>haystack,needle): 在字符串中查找指定子字符串的位置,并返回第一次出现的索引位置。

例如:strpos("Hello, world!", "world") 返回 7,因为 "world" 第一次出现在第 7 个位置。
3. strrpos( <math xmlns="http://www.w3.org/1998/Math/MathML"> h a y s t a c k , haystack, </math>haystack,needle): 与 strpos() 类似,但是从字符串的末尾开始查找指定子字符串的位置,并返回最后一次出现的索引位置。

例如:strrpos("Hello, world!", "o") 返回 8,因为 "o" 最后一次出现在第 8 个位置。
4. str_replace( <math xmlns="http://www.w3.org/1998/Math/MathML"> s e a r c h , search, </math>search,replace, $string): 在字符串中查找指定的子字符串,并将其替换为另一个字符串。

例如:str_replace("World", "Universe", "Hello, World!") 返回 "Hello, Universe!"。
5. substr( <math xmlns="http://www.w3.org/1998/Math/MathML"> s t r i n g , string, </math>string,start, $length): 返回字符串的子串,从指定的起始位置开始,并可选择指定长度。

例如:substr("Hello, world!", 7, 5) 返回 "world",因为从第 7 个位置开始的 5 个字符是 "world"。
6. explode( <math xmlns="http://www.w3.org/1998/Math/MathML"> d e l i m i t e r , delimiter, </math>delimiter,string): 将字符串根据指定的分隔符拆分为数组。

例如:explode(",", "apple,banana,orange") 返回 ["apple", "banana", "orange"]。
7. implode( <math xmlns="http://www.w3.org/1998/Math/MathML"> g l u e , glue, </math>glue,array): 将数组中的元素连接成一个字符串,使用指定的粘合剂(分隔符)。

例如:implode(", ", ["apple", "banana", "orange"]) 返回 "apple, banana, orange"。
8. trim($string): 去除字符串两边的空格和其他特定字符。

例如:trim(" Hello ") 返回 "Hello",因为两边的空格被去除了。
9. str_repeat( <math xmlns="http://www.w3.org/1998/Math/MathML"> s t r i n g , string, </math>string,times): 将字符串重复指定次数。

例如:str_repeat("Hello", 3) 返回 "HelloHelloHello"。
10. strcmp( <math xmlns="http://www.w3.org/1998/Math/MathML"> s t r 1 , str1, </math>str1,str2): 比较两个字符串的大小。返回一个整数值,如果两个字符串相等则返回 0,如果第一个字符串小于第二个字符串则返回负数,如果第一个字符串大于第二个字符串则返回正数。

例如:strcmp("apple", "banana") 返回一个负数。

4.2 数学函数

为了方便开发人员处理程序中的数学运算,PHP内置了一系列的数学函数,用于获取最大值、最小值、生成随机数等常见的数学运算。下面是一些常用的PHP数学函数及其功能说明:

1. abs($number): 返回给定数的绝对值。

例如,abs(-5)返回5。
2. ceil($number): 向上取整,返回大于或等于给定数的最小整数。

例如,ceil(4.2)返回5。
3. floor($number): 向下取整,返回小于或等于给定数的最大整数。

例如,floor(4.8)返回4。
4. fmod( <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m b e r , number, </math>number,divisor): 返回给定数除以除数的余数。

例如,fmod(7, 3) 返回1,因为7除以3的余数是1。
5. is_nan($number): 判断给定值是否为NaN(Not a Number)。如果给定的值不是数字,则返回true,否则返回false。

例如,is_nan(sqrt(-1)) 返回true,因为对负数的开方结果是NaN。
6. max( <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m b e r 1 , number1, </math>number1,number2, ...): 返回给定数中的最大值。

例如,max(5, 8, 3)返回8。
7. min( <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m b e r 1 , number1, </math>number1,number2, ...): 返回给定数中的最小值。

例如,min(5, 8, 3)返回3。
8. pi(): 返回圆周率 π 的近似值。

例如,pi()返回3.1415926535898。
9. pow( <math xmlns="http://www.w3.org/1998/Math/MathML"> b a s e , base, </math>base,exponent): 返回给定基数的指定次幂。

例如,pow(2, 3) 返回8,因为2的3次幂是8。
10. sqrt($number): 返回给定数的平方根。

例如,sqrt(16) 返回4,因为4的平方是16。
11. round( <math xmlns="http://www.w3.org/1998/Math/MathML"> n u m b e r , number, </math>number,precision): 对给定数进行四舍五入取整。可选择指定小数点精度。

例如,round(3.14159, 2) 返回3.14,保留两位小数。
12. rand( <math xmlns="http://www.w3.org/1998/Math/MathML"> m i n , min, </math>min,max): 返回指定范围内的一个随机整数。

例如,rand(1, 10) 返回1到10之间的一个随机整数。

4.3 时间日期函数

在使用PHP开发Web应用程序时,经常会涉及日期和时间管理。 例如倒计时、用户登录时间、新闻发布时间、购买商品时下订单的时间等。 为此,PHP提供了内置的日期和时间处理函数,满足开发中的各种需求。下面是一些常用的PHP时间日期函数及其功能说明:

1. time() 函数返回当前的Unix时间戳,即从1970年1月1日起经过的秒数。它通常被用来获取程序的执行时间或生成时间戳。
2. date($format, $timestamp) 函数将给定的时间戳格式化为指定的日期字符串。format是日期格式化字符串,format是日期格式化字符串,timestamp是可选的时间戳,默认为当前时间。

例如,date('Y-m-d H:i:s') 将返回当前时间的年份、月份、日期、小时、分钟和秒数。
3. mktime($hour, $minute, $second, $month, $day, $year) 函数根据给定的小时、分钟、秒、月、日和年返回一个日期的Unix时间戳。它常用于构建特定的日期和时间。

例如,mktime(0, 0, 0, 1, 1, 2022) 返回2022年1月1日的时间戳。
4.strtotime($time, $now) 函数将日期时间字符串转换为Unix时间戳。time是要转换的字符串,time是要转换的字符串,now是可选的基准时间,默认为当前时间。它能够处理各种格式的日期时间字符串,例如"2022-01-01"、"next Monday"、"tomorrow"等。
5. microtime($get_as_float) 函数返回当前的Unix时间戳和微秒数。$get_as_float参数是可选的,如果设置为true,则返回浮点数形式的时间戳。这个函数通常用于测量代码的执行时间。


总结

在本篇博客中,我们深入探索了PHP函数的世界,体验了一段渐进式的编程之旅。我们从基础开始,了解了什么是PHP函数以及如何定义和调用它们。我们探讨了不同类型的函数,包括内置函数、自定义函数以及匿名函数。通过实际示例,我们学习了如何使用这些函数来处理数据、实现特定功能和构建可扩展的应用程序。

感谢您跟随我的渐进式编程之旅,希望这篇博客为您带来了有益的知识和启发。祝您在PHP函数的世界中探索出属于自己的奇妙旅程!

相关推荐
码农派大星。2 分钟前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man42 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*43 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu1 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s1 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王1 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
customer082 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589362 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端
一只爱打拳的程序猿2 小时前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring