1.函数:封装一段用于完成特定功能的代码。
2.通俗理解函数:可以完成某个工作的代码块,就像小朋友搭房子用的积木一样,可以反复使用,在使用的时候,拿来即用,而不用考虑它的内部构成。
3.函数分类:①内置函数(字符串操作函数、数组操作函数)②自定义函数
①内置函数
$str = 'ABcd';
$upper = strtoupper($str); // 调用strtoupper()函数将$str转换成大写
$lower = strtolower($str); // 调用strtolower()函数将$str转换成小写
echo $upper; // 输出结果:ABCD
echo $lower; // 输出结果:abcd
②自定义函数
';
for ($i = 1; $i <= $row; ++$i) {
$html .= '';
for ($j = 1; $j <= $col; ++$j) {
$html .= ' ';
}
$html .= ' ';
}
return $html.'';
}
// 生成4行8列的表格,并输出
echo generate_table(4, 8);
// 生成5行10列的表格,并输出
echo generate_table(5, 10);
4.函数的基本语法格式
function 函数名([参数1, 参数2, ……])
{
函数体……
}
函数的定义由以下4部分组成: 关键字function、函数名functionName、参数、函数体。
5.各部分声明
function:在声明函数时必须使用的关键字
函数名:要符合PHP的标识符,且函数名是唯一的,不区分大小写
[参数1, 参数2…]:外界传递给函数的值,它是可选的,多个参数之间使用逗号“,”分隔。
函数体:函数定义的主体,专门用于实现特定功能的代码段。
返回值:需要使用return关键字将需要返回的数据传递给调用者。
6.参数设置
对于函数来说,参数的不同设置,决定了其调用和使用方式。
function shout()
{
return 'come on';
}
echo shout();// 输出结果:come on
适用于不需要提供任何的数据即可以完成指定功能的情况。
PHP默认支持按值传递参数,按此种方式定义的函数,在函数内部可以随意对用户传递的参数进行操作。
/ 方式一
echo add(5, 7);
// 方式二
$x = 5;
$y = 7;
echo add($x, $y);
function add($a, $b)
{
$a = $a + $b;
return $a;
}
在开发中,若需要函数修改它的参数值,则需通过函数参数的引用传递。实现方式只需在参数前添加“&”符号即可。
$var = 'food';
extra($var);
// 输出结果:food and some extra
echo $var;
function extra(&$str)
{
$str .= ' and some extra';
}
函数参数在设置时,还可以为其指定默认值,也就是可选参数。当调用者未传递该参数时,函数将使用默认值进行操作。
function say($p, $con = 'say "Hello"')
{
return "$p $con";
}
// 输出结果:Tom say "Hello"
echo say('Tom');
注意:当使用默认参数时,默认参数必须放在非默认参数的右侧,否则函数可能出错。
在PHP 7.0及以上的版本后,在自定义函数时,可以指定参数具体是哪种数据类型。
当用户调用函数时,如果传递的参数不是int类型,程序会将其强制的转换为int型后,再进行操作,这种方式称为弱类型参数设置。
function sum1(int $a, int $b)
{
return $a + $b;
}
echo sum1(2.6, 3.8); // 输出结果:5
除此之外,还可以将其设置为强类型的参数,即当用户传递的参数类型不符合函数的定义,程序会报错提醒。
declare(strict_types = 1);
function sum2(int $a, int $b)
{
return $a + $b;
}
echo sum2(2.6, 3.8); // 输出结果:Fatal error: ......
7.扩展:从函数中返回值
调用函数时可以向函数发送信息(参数),函数也可以向调用者发回信息(返回值)。从函数返回的值称为结果(result)或返回值(return value)。函数将返回值传递给调用者的方式是使用关键字return.return将函数的值返回给函数的调用者,即将程序控制权返回到调用者的作用域。
8.变量的作用域
思考:变量在定义后就可以在函数中使用嘛?
答案:默认情况下,函数中可以,函数外不可以。
解析:变量只有在其作用范围内才可以被使用,这个作用范围称为变量的作用域。 在函数中定义的变量称为局部变量 在函数外定义的变量称为全局变量
function test()
{
$sum = 36; // 局部变量
return $sum;
}
$sum = 0; // 全局变量
echo test(); // 输出结果:36
echo $sum; // 输出结果:0
思考:那么如何在函数中使用全局变量呢?
答案:参数传递,global关键字和超全局变量$GLOBALS。
1.嵌套调用
函数的嵌套调用:指的是在调用一个函数的过程中,调用另外一个函数,这种在函数内调用其他函数的方式称为嵌套调用。
递归调用:是函数嵌套调用中一种特殊的调用。它指的是一个函数在其函数体内调用自身的过程,这种函数成为递归函数。
举例:求n的阶乘,计算公式为1×2×3×…×n。如4的阶乘等于1×2×3×4=24。
1.静态变量
思考:如何轻松得到一个函数被访问的次数?
答案:一是在函数中使用全局变量记录,缺点是全局变量可随时在函数外被改变,不能准确的记录;二是在函数中使用静态变量。
//局部变量
/*第1次调用函数num()输出1
第2次调用函数num()会输出1
依次类推…*/
function num()
{
$i = 1;
echo $i;
++$i;
}
//静态变量
/*第1次调用函数num()输出1
第2次调用函数num()会输出2
依次类推…*/
function num()
{
static $i = 1;
echo $i;
++$i;
}
2.可变函数
可变函数:可变变量,它的实现是在一个变量前添加一个“$”符号,就变成了另外一个变量。同理,可变函数的实现就是在一个变量名后添加一对圆括号“()”,让其变成一个函数的形式,然后PHP就寻找与变量值同名的函数,并且尝试执行它。
3.回调函数
回调函数(callback):指的就是具有callable类型的函数,一般用作参数的传递。如PHP内置函数call_user_func()可以接受用户自定义的回调函数作为参数。
4.匿名函数
匿名函数:就是没有函数名称的函数,也称作闭包函数,经常用作回调函数参数的值。对于临时定义的函数,使用匿名函数无需考虑函数命名冲突的问题。
$sum = function($a, $b) { // 定义匿名函数
return $a + $b;
};
echo $sum(100, 200); // 输出结果:300
匿名函数中使用外部的变量,需要通过use关键字实现。use关键字后圆括号“()”中的内容即为要使用的外部变量列表,多个变量之间使用英文逗号“,”分隔即可。
$c = 100;
$sum = function($a, $b) use($c) {
return $a + $b + $c;
};
echo $sum(100, 200); // 输出结果:400
除此之外,匿名函数还可以作为函数的参数传递,实现回调函数。
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;
});
1.字符串函数
函数名称 | 功能描述 |
---|---|
strlen() | 获取字符串的长度 |
strpos() | 查找字符串首次出现的位置 |
strrpos() | 获取指定字符串在目标字符串中最后一次出现的位置 |
str_replace() | 用于字符串中的某些字符进行替换操作 |
substr() | 用于获取字符串中的子串 |
explode() | 使用一个字符串分割另一个字符串 |
implode() | 用指定的连接符将数组拼接成一个字符串 |
trim() | 去除字符串首尾处的空白字符(或指定成其他字符) |
str_repeat() | 重复一个字符串 |
strcmp() | 用于判断两个字符串的大小 |
①.字符串函数——截取给定路径中的字符串
$url = 'C:\web\apache2.4\htdocs\cat.jpg';
$pos = strrpos($url, '\\');
// 截取文件名称,输出结果:cat.jpg
echo substr($url, $pos + 1);
// 截取文件所在的路径,输出结果:C:\web\apache2.4\htdocs
echo substr($url, 0, $pos);
strrpos()函数用于在$url中获取“\”最后一次出现的位置$pos。 substr()函数的第1个参数表示待截取的字符串,第2个参数表示开始截取的位置,非负数表示从字符串指定位置处截取,从0开始;负数表示从字符串尾部开始。第3个参数表示截取的长度。
substr()函数的第3个参数表示截取的长度,该长度的设置具体有以下4种情况。 省略第3个参数时,将返回从指定位置到字符串结尾的子字符串。 第3个参数为正数,返回的字符串将从指定位置开始,最多包含指定长度的字符,这取决于待截取字符串的长度。 第3个参数为负数,返回的字符串中在结尾处将有个指定长度的字符被省略。 第3个参数为0、false或null,将返回一个空字符串。
②.字符串函数——替换指定位数的字符
替换指定位数的字符,在开发也是很常见的功能。例如,在各种抽奖环节中,为了保证用户的隐私,出现的手机号一般使用“*”将第4至7位的数字进行覆盖。
$tel = '18810881888'; // 随意输入一串数字作为手机号
$len = 4; // 需要覆盖的手机号长度
$replace = str_repeat('*', $len); // 根据指定长度设置覆盖的字符串
echo substr_replace($tel, $replace, 3, $len); // 输出结果: 188****1888
str_repeat()函数用于对“*”字符重复$len次。 substr_replace()函数用于对字符串$tel中第3个位置开始后的$len长度的字符使用$replace进行替换。
③.字符串函数——过滤字符串中的空白字符
程序开发中,去除字符串中的空白字符有时是必不可少的。例如,去除用户注册邮箱中首尾两端的空白字符。这时可以使用PHP提供的trim()函数,去除字符串中首尾两端的空白字符。
$str = ' These are a few words :) ... ';
echo '原字符串:' . $str . '
';
echo '去空白后的字符串:' . trim($str);
④.字符串函数——字符串的比较
字符串的比较:一种比较运算符“==”和“===”,另一种函数strcmp()
区别:函数与比较运算符在使用时的区别是,字符串相等时前者的比较结果为0,后者的比较结果为true(非0)。因此读者在使用时需要注意不同方式的返回结果。
if (strcmp('ye_PHP', 'yePHP')) {
echo 'not the same string';
} else {
echo 'the same string';
}
strcmp()函数比较两个字符串对应的ASCII码值。 第1个参数的字符串与第2个参数的字符串相等返回0,小于返回小于0的值,大于则返回大于0的值。 因此,可以判断出上述示例的输出结果为“not the same string”。
⑤.字符串函数——获取字符串的长度
strlen()函数在获取中文字符时,一个汉字占了3个字符,一个英文字符占1个字符。但是对于网站开发来说,这样计算的方式比较麻烦,也没办法区分用户输入的内容是否是汉字。
PHP提供了mb_strlen()函数,用于准确的获取字符串的长度。在使用mb_strlen()函数前,首先要确保PHP配置文件中开启了“extension=php_mbstring.dll”扩展。
$str = ‘PHP书籍';
echo strlen($str); //输出结果:9
/* 对比
||
||
\/ */
$str = ‘PHP书籍';
echo mb_strlen($str, 'UTF-8'); // 输出结果:5
2.数学函数
为了方便开发人员处理程序中的数学运算,PHP内置了一系列的数学函数,用于获取最大值、最小值、生成随机数等常见的数学运算。
函数名称 | 功能描述 |
---|---|
abs() | 取绝对值 |
ceil() | 向上取最接近的整数 |
floor() | 向下取最接近的整数 |
fmod() | 取除法的浮点数余数 |
is_nan() | 判断是否为合法数值 |
max() | 取最大值 |
min() | 取最小值 |
pi() | 取圆周率的值 |
pow() | 计算x的y次方 |
sqrt() | 取平方根 |
round() | 对浮点数进行四舍五入 |
rand() | 生成随机整数 |
echo ceil(5.2); // 输出结果:6
echo floor(7.8); // 输出结果:7
echo rand(1, 20); // 随机输出1到20间的整数
ceil()函数是对浮点数5.2进行向上取整, floor()函数是对浮点数进行向下取整, rand()函数的参数表示随机数的范围,第1个参数表示最小值,第2参数表示最大值。
3.时间日期函数
在使用PHP开发Web应用程序时,经常会涉及日期和时间管理。 例如倒计时、用户登录时间、新闻发布时间、购买商品时下订单的时间等。 为此,PHP提供了内置的日期和时间处理函数,满足开发中的各种需求。
函数名称 | 功能描述 |
---|---|
time() | 获取当前的Unix时间戳 |
date() | 格式化一个本地时间/日期 |
mktime() | 获取指定日期的Unix时间戳 |
strtotime() | 将字符串转化成Unix时间戳 |
microtime() | 获取当前Unix时间戳和微秒数 |
Unix时间戳是一种时间的表示方式,它是为了解决编程环境中时间运算的问题。
①时间日期函数——时间戳
概念:Unix时间戳(Unix timestamp)定义了从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数,以32位二进制数表示。
Unix纪元:1970年01月01日零点也叫作Unix纪元。
echo time(); // 输出结果:1487666317
echo mktime(0, 0, 0, 2, 21, 2017); // 输出结果:1487606400
echo strtotime('2017-2-21'); // 输出结果:1487606400
echo microtime(); // 输出结果:0.04142600 1487666098
echo microtime(true); // 输出结果:1487666098.0414
time()函数用于获取当前时间的Unix时间戳, mktime()和strtotime()函数可将给定的日期时间转换成Unix时间戳,前者的参数分别表示“时分秒月日年”,后者可以是任意时间的字符串。 函数microtime()用于获取当前Unix时间戳和微秒数,不设置参数时,返回值的形式前面一段数字表示微妙数,后面一段数字表示秒数;设置参数时,小数点前表示秒数,小数点后表示微秒数。
②时间日期函数——格式化时间戳
为什么要格式化时间戳?
答:对于用户来说,时间戳的直接输出,会让其看到一个毫无意义的整型数值。为了将时间戳表示的时间以友好的形式显示出来,可以对时间戳进行格式化。
echo date('Y-m-d H:i:s'); // 输出结果:2017-02-21 16:48:16
echo date('Y-m-d', 1487666317); // 输出结果:2017-02-21
date()函数第1个参数表示格式化日期时间的样式
date()函数第2个参数表示待格式化的时间戳,省略时表示格式化当前时间戳。
分类 | 参数 | 说明 |
---|---|---|
年 | Y | 4位数字表示的完整年份,如1998、2017 |
年 | y | 2 位数字表示的年份,如99、03 |
年 | L | 是否为闰年,闰年为1,否则为0 |
月 | m | 数字表示的月份,有前导零,返回值01~12 |
月 | n | 数字表示的月份,无前导零,返回值1~12 |
月 | t | 给定月份所应有的天数,返回值范围28~31 |
月 | F | 月份,完整的文本格式,如January、March |
月 | M | 三个字母缩写表示的月份,如Jan、Dec |
日 | d | 月份中的第几天,有前导零,返回值01~31 |
日 | j | 月份中的第几天,无前导零,返回值1~31 |
分类 | 参数 | 说明 |
---|---|---|
时间 | g | 小时,12小时格式,无前导零,返回值1~12 |
时间 | h | 小时,12小时格式,有前导零,返回值01~12 |
时间 | G | 小时,24小时格式,无前导零,返回值0~23 |
时间 | H | 小时,24小时格式,有前导零,返回值00~23 |
时间 | i | 有前导零的分钟数,返回值00~59 |
时间 | s | 有前导零的秒数,返回值00~59 |
星期 | N | 星期几,返回值1(表示星期一)~7(表示星期日) |
星期 | w | 星期几,返回值0(表示星期日)~6(表示星期六) |
星期 | D | 三个字母缩写表示的星期,如Mon、Sun |
星期 | L(“L”的小写字母) | 星期几,完整的文本格式,如Sunday、Saturday |