第一章:函数
1.1 定义函数
PHP 函数参数传递的四种方式
在调用函数时,需要向函数传递参数,被传入函数的参数称为实参,而函数定义的参数称为形参。而向函数传递参数的方式有四种,分别是值传递、引用传递、默认参数和可变长度参数。
1. 值传递 与 引用传递
<?php
2 function swap($a, $b){
3 echo '函数内,交换前 $a = '.$a.', $b = '.$b."\n";
4 $temp = $a;
5 $a = $b;
6 $b = $temp;
7 echo '函数内,交换后 $a = '.$a.', $b = '.$b."\n";
8 }
9 $x = 5;
10 $y = 7;
11 echo '函数外,交换前 $x = '.$x.', $y = '.$y."\n";
12 swap($x, $y);
13 echo '函数外,交换后 $x = '.$x.', $y = '.$y;
14?>
运行结果如下:
1函数外,交换前 $x = 5, $y = 7
2函数内,交换前 $a = 5, $b = 7
3函数内,交换后 $a = 7, $b = 5
4函数外,交换后 $x = 5, $y = 7
通过运行结果可以看到,在函数内,数值确实是交换了,而在函数外部,数值却没有变化。因此可以说,函数的值传递只是传递变量的副本。那么要是想让函数能够操作函数外实参的话,就需要使用引用传递的方式了。
参数的引用传递就是把实参的内存地址复制一份,然后传递给函数的形参,实参和形参都指向同一个内存地址,因此函数对形参的操作,会影响到函数外的实参。
按引用传递就是将实参的内存地址传递到函数的形参中。因此实参和形参指向的是同一个内存地址。这时在函数内部的所有操作都会影响到函数外实参的值。
2. 默认参数 与 可变长度参数
默认参数就是给函数的某个或多个形式参数指定一个默认的值,如果调用函数时不传入对应的值,那么函数就会使用这个默认值,这样可以避免调用时出现没有参数的错误,也可以使一些程序显得更加合理。如果传入对应的参数,就会替换这个默认值。
【示例】下面来定义一个具有多个默认参数的函数,如下所示:
1<?php
2 function add($a, $b=33, $c=57){
3 echo $a.' + '.$b.' + '.$c.' = '.($a+$b+$c)."\n";
4 }
5 add(11);
6 add(31, 22);
7 add(64, 9, 7);
8?>
运行结果如下:
111 + 33 + 57 = 101
231 + 22 + 57 = 110
364 + 9 + 7 = 80
函数的形式参数可使用 …
来表示函数可接受一个可变数量的参数,可变参数将会被当作一个数组传递给函数。示例如下:
<?php
2 function test(...$arr){
3 print_r($arr);
4 }
5 test(1, 2, 3, 4);
6 test(5, 6, 7, 8, 9, 10);
7?>
Array
2(
3 [0] => 1
4 [1] => 2
5 [2] => 3
6 [3] => 4
7)
8Array
9(
10 [0] => 5
11 [1] => 6
12 [2] => 7
13 [3] => 8
14 [4] => 9
15 [5] => 10
16)
1.2 PHP 声明参数类型
在 PHP 5 中已引入函数的参数类型声明,如果给定的值不是一个合法的参数类型,那么在 PHP 5 中会出现一个 Fatal error
,在 PHP 7 中则会抛出一个 TypeError exception
。
在 PHP 7 中增加了参数可声明的类型种类,如表所示。
类型 | 说明 | PHP 版本 |
---|---|---|
class/interface name(类,接口) | 参数必须是指定类或接口的实例 | PHP 5.0.0 |
Array | 参数为数组类型 | PHP 5.1.0 |
Callable | 参数为有效的回调类型 | PHP 5.4.0 |
Bool | 参数为布尔型 | PHP 7.0.0 |
Float | 参数为浮点型 | PHP 7.0.0 |
Int | 参数为整型 | PHP 7.0.0 |
String | 参数为字符串 | PHP 7.0.0 |
class/interface name(类,接口) | 参数必须是指定类或接口的实例 | PHP 5.0.0 |
Array | 参数为数组类型 | PHP 5.1.0 |
第二章:PHP 时间和日期
1.1 PHP中的时区设置
[Date]
2; Defines the default timezone used by the date functions
3; http://php.net/date.timezone
4date.timezone = Asia/Shangha
- Asia/Shanghai —— 上海
- Asia/Chongqing —— 重庆
- Asia/Urumqi —— 乌鲁木齐
- Asia/Hong_Kong —— 香港
- Asia/Macao —— 澳门
- Asia/Taipei —— 台北
- Asia/Singapore —— 新加坡
- PRC —— 中国时区
1.2 使用 ini_set() 函数设置时区
<?php
2 ini_set('date.timezone', 'GMT');
3 echo '当前的格林尼治时间为:'.date('Y-m-d H:i:s',time())."\n";
4 ini_set('date.timezone', 'Asia/Urumqi');
5 echo '乌鲁木齐的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
6 ini_set('date.timezone', 'Asia/Shanghai');
7 echo '上海的当前时间为:'.date('Y-m-d H:i:s',time());
8?>
1.3 使用 date_default_timezone_set() 函数设置时区
date_default_timezone_set($timezone_identifier)
<?php
2 date_default_timezone_set('Asia/Urumqi');
3 echo '乌鲁木齐的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
4 date_default_timezone_set('Europe/Lisbon');
5 echo '葡萄牙的当前时间为:'.date('Y-m-d H:i:s',time())."\n";
6 date_default_timezone_set('Asia/Shanghai');
7 echo '上海的当前时间为:'.date('Y-m-d H:i:s',time());
8?>
2.1 PHP 获取当前时间
1.gmmktime()
函数可取得 GMT 日期的 UNIX 时间戳。
使用示例如下:
1<?php
2echo gmmktime(); //没有设置参数, 则默认取得当前GMT时间
3echo gmmktime(0,45,3,7,7,2016); //设置参数表示GMT时间2016年7月7日0点45分3秒
4?>
执行以上程序的打印结果为:
11467909956 1467852303
2.mktime()
mktime()
也可取得一个日期的 UNIX 时间戳。
该函数根据给出的参数返回 UNIX 时间戳。时间戳是一个长整数,包含了从 UNIX 纪元到给定时间的秒数。和 gmmktime()
函数一样,该函数的参数也可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。
使用示例如下:
1<?php
2echo mktime(); // 没有设置参数则默认取得当前GMT时间
3echo mktime(0,45,3,7,7,2016); //设置参数表示GMT时间2016年7月7日0点45分3秒
4?>
执行以上程序的打印结果为:
11467910465 1467852303
3.microtime()
microtime()
可获得当前 UNIX 时间戳和微秒数。语法如下:
mixed microtime ([ bool $get_as_float ] )
如果设置 get_as_float
参数值为 true
,microtime()
将返回一个浮点数;若不带参数,则返回一个 “msec sec”
格式的字符串,其中 sec
是自 UNIX 纪元起到现在的秒数,msec
是微秒部分。字符串的两部分都是以秒为单位返回的。
使用示例如下:
1<?php
2echo microtime(); //返回 msec sec 格式字符串表示时间
3echo "\n";
4echo microtime(true); //返回一个浮点型字符串表示时间
5?>
执行以上程序的打印结果如下:
10.40474900 1467910862
21467910862.4048
4.time()
time()
函数可返回当前的 UNIX 时间戳。语法如下:
1int time ( void )
time()
函数的语法比较简单,使用示例如下:
1<?php
2echo time();
3?>
执行以上程序的打印结果为:
11467911104
5.get date()
getdate()
可取得日期时间信息。语法如下:
1array getdate ([ int $timestamp = time() ] )
2.2 PHP strtotime()与mktime():日期转时间戳
1、strtotime() 函数
使用 strtotime()
函数可以将任何字符串类型的日期/时间转换为 UNIX 时间戳,其语法格式如下:
strtotime($time [,$now = time()])
其中 $time
为表示时间/日期的字符串,例如“2020-01-01”;$now
为可选参数,用来计算返回值的时间戳。函数执行成功会返回指定的字符串,执行失败返回 FALSE
。
另外需要注意的是,如果使用两位数字表示年份的话,其中 0 ~ 69 表示 2000 ~ 2069,70 ~ 100 则表示 1970 ~ 2000。
2、mktime() 函数
除了 strtotime()
函数外,我们还可以使用 PHP 中的 mktime()
函数来获取指定日期的 UNIX 时间戳,该函数的语法格式如下:
mktime ([$hour = date("H") [, $minute = date("i") [, $second = date("s") [, $month = date("n") [, $day = date("j") [, $year = date("Y") [, $is_dst = -1 ]]]]]]])
参数说明如下:
$hour
:表示一天中经过的小时数。如果$hour
为负值,则表示前一天的适当时间;如果$hour
大于 23,则表示第二天的适当时间。$minute
:表示一个小时内经过的分钟数。如果$minute
为负值,则表示前一小时适当的分钟数;如果$minute
大于 59,则表示下一小时中的适当分钟数。$second
:表示一分钟内经过的秒数。如果$second
为负值,则表示前一分钟内的适当秒数;如果$second
大于59,则表示下一分钟内的适当秒数。$month
:表示一年中经过的月份数,取值范围在 1 到 12 之间。如果$month
小于 1(包括负值),则表示上一年的适当月份;如果$month
大于 12,则表示下一年的适当月份。$day
:表示一个月中经过的天数,取值范围在 1 到 31 之间(取决于具体月份的天数)。如果$day
小于 1(包括负值),则表示上个月的适当天数,比如 0 表示上个月的最后一天,-1 表示上个月的倒数第二天等等;如果$day
大于本月的最大天数,则表示下个月的适当日期。$year
:表示具体的年份,可以是两位或四位数字,0 ~ 69 对应 2000 ~ 2069 年,70 ~ 100 对应 1970 ~ 2000年。在如今系统中普遍把time_t
作为一个 32 位有符号整数的情况下,$year
的合法范围是 1901 到 2038 之间,不过此限制自 PHP5.1.0 起已被克服了。$is_dst
:本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制。不过本参数在 PHP5.1.0 中已被废弃,并在 PHP7.0.0 中移除。
2.3 PHP date():时间日期格式化
当时间和日期保存在计算机中的时候,可以使用 UNIX 时间戳作为标准格式。但是 UNIX 时间戳的可读性很差,所以有时我们需要把 UNIX 时间戳格式化为可读性更好的时间和日期,或者格式化为其它软件需要的格式。
在 PHP 中可以使用 date()
函数来格式化一个本地的时间或日期,该函数的语法格式如下:
date($format [,$timestamp])
参数说明如下:
$format
:表示格式化后的时间格式,可以包含一些具有特殊含义的字符。$timestamp
:表示待格式化的时间戳,是一个可选参数,默认为当前时间。也可以理解为$timestamp
的默认值为time()
。
参数 $format
格式化字符串中可以识别的特殊字符如下表所示:
format 字符 | 说明 | 返回值例子 |
---|---|---|
d | 月份中的第几天,使用两位的数字表示,不足两位时在前面补 0 | 01 到 31 |
D | 星期几的英文缩写(使用 3 个字母表示) | Mon 到 Sun |
l(“L”的小写字母) | 星期几的英文单词 | Sunday 到 Saturday |
N | 根据 ISO-8601 标准格式,使用数字表示星期中的第几天(PHP5.1.0 新加) | 1(表示星期一)到 7(表示星期天) |
S | 每月天数后面的英文后缀(使用 2 个字符表示) | st、nd、rd 或者 th。可以和 j 一起使用 |
w | 使用数字表示星期中的第几天 | 0(表示星期天)到 6(表示星期六) |
z | 使用数字表示一年中的第几天 | 0 到 365 |
W | 根据 ISO-8601 标准格式,使用数字表示年份中的第几周,每周从星期一开始,(PHP 4.1.0 新增) | 例如:42(当年的第 42 周) |
F | 月份的英文单词,例如 January 或者 June | January 到 December |
m | 使用两位的数字表示当前月份 | 01 到 12 |
M | 月份的英文缩写 | Jan 到 Dec |
n | 使用数字表示当前月份 | 1 到 12 |
t | 指定月份的天数 | 28 到 31 |
L | 指定的年份是否为闰年 | 如果是闰年值为 1,否则为 0 |
o | 根据 ISO-8601 标准格式使用数字表示年份,这和 Y 的作用相同(PHP 5.1.0 新增) | 1999 or 2019 |
Y | 使用 4 位数字表示完整的年份 | 例如:1999 或 2019 |
y | 使用 2 位数字表示年份 | 例如:99 或 03 |
a | 小写的上午和下午值 | am 或 pm |
A | 大写的上午和下午值 | AM 或 PM |
B | Swatch Internet 标准时 | 000 到 999 |
g | 使用 12 小时格式表示小时数 | 1 到 12 |
G | 使用 24 小时格式表示小时数 | 0 到 23 |
h | 使用 12 小时格式表示小时数,有前导零 | 01 到 12 |
H | 使用 24 小时格式表示小时数,有前导零 | 00 到 23 |
i | 使用两位数字表示分钟数,有前导零 | 00 到 59> |
s | 使用两位数字表示秒数,有前导零 | 00 到 59> |
u | 毫秒(PHP 5.2.2 新增)。需要注意的是 date() 函数总是返回 000000,因为它只接受 integer 参数,而 DateTime::format() 才支持毫秒 | 例如:654321 |
e | 时区标识 | 例如:UTC、GMT、Atlantic/Azores |
I(大写的“i”) | 是否为夏令时 | 夏令时为 1,否则为 0 |
O | 与格林尼治时间相差的小时数 | 例如:+0200 |
P | 与格林尼治时间(GMT)的差别,小时和分钟之间由冒号分隔 | 例如:+02:00 |
T | 本机所在的时区 | 例如:EST、MDT(在 windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”) |
Z | 时差偏移量的秒数,UTC 西边的时区偏移量总是负的,UTC 东边的的时区偏移量总是正的 | -43200 到 43200 |
c | ISO-8601 格式的日期 | 2014-02-12T15:19:21+00:00 |
r | RFC 822 格式的日期 | 例如:Thu,21 Dec 2000 16:01:07 +0200 |
U | 从 UNIX 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 |
2.4 PHP time():获取当前时间戳
在 UNIX 系统中,日期与时间表示为自 1970 年 01 月 01 日 00 时 00 分 00 秒(北京时间 1970 年 01 月 01 日 08 时 00 分 00 秒)起到当前时刻的总秒数,这种时间称为 UNIX 时间戳
UNIX 时间截提供了一种统一、简洁的时间表示方式,在不同的操作系统中均支持这种时间表示方式,同一时间在 UNIX 和 Windows 系统中均以相同的 UNIX 时间戳表示,所以不需要在不同的系统中进行转换。同时,UNIX 时间戳是一个时间差,与时区没有关系,无论当前 PHP 中使用的是何种时区,其 UNIX 时间戳是唯一的。
【示例】使用 time()
函数获取当前时间戳 与 PHP实现倒计时功能
1<?php
2 $time = time();
3 echo '当前的时间戳为:'.<!DOCTYPE html>
4<html>
5<head>
6 <title>PHP实现倒计时功能</title>
7</head>
8<body>
9<?php
10 // 设置时区
11 date_default_timezone_set('PRC');
12 //配置考试的开始结束时间
13 $starttimestr = date('Y-m-d H:i:s', strtotime('now'));
14 $endtimestr = date('Y-m-d H:i:s', strtotime('+2 hours 30 minutes'));
15 $starttime = strtotime($starttimestr);
16 $endtime = strtotime($endtimestr);
17 $nowtime = time();
18 if ($nowtime < $starttime) {
19 exit("考试已经结束了,考试时间是:{$starttimestr}至{$endtimestr}");
20 }
21 if ($endtime >= $nowtime) {
22 $lefttime = $endtime - $nowtime; //实际剩下的时间(秒)
23 } else {
24 $lefttime = 0;
25 exit("考试已经结束!");
26 }
27?>
28<p>考试开始时间:<?php echo $starttimestr; ?></p>
29<p>考试结束时间:<?php echo $endtimestr; ?></p>
30<p>
31 距离考试结束还有:
32 <span id="RemainD"></span> 天
33 <span id="RemainH"></span> 小时
34 <span id="RemainM"></span> 分钟
35 <span id="RemainS"></span> 秒
36</p>
37<script type="text/javascript">
38 var runtimes = 0;
39 function GetRTime() {
40 var lefttime = <?php echo $lefttime; ?> * 1000 - runtimes * 1000;
41 if (lefttime >= 0) {
42 var nD = Math.floor(lefttime / (1000 * 60 * 60 * 24)) % 24;
43 var nH = Math.floor(lefttime / (1000 * 60 * 60)) % 24;
44 var nM = Math.floor(lefttime / (1000 * 60)) % 60;
45 var nS = Math.floor(lefttime / 1000) % 60;
46 document.getElementById("RemainD").innerHTML = nD;
47 document.getElementById("RemainH").innerHTML = nH;
48 document.getElementById("RemainM").innerHTML = nM;
49 document.getElementById("RemainS").innerHTML = nS;
50 runtimes++;
51 setTimeout("GetRTime()", 1000);
52 } else {
53 alert('考试结束了!');
54 location.reload();
55 }
56 }
57 onload = function() {
58 GetRTime();
59 }
60</script>
61</body>
62</html>$time."\n";
63 date_default_timezone_set('GMT');
64 $time = time();
65 echo '将时区设置为零时区,获取的时间戳为:'.$time;
66?>
运行结果如下:
1当前的时间戳为:1585203148
2将时区设置为零时区,获取的时间戳为:1585203148