Skip to content

基础知识

php

向军大叔每晚八点在 抖音bilibli 直播

xj-small

PHP 是什么?

PHP(PHP: Hypertext Preprocessor,超文本预处理器的缩写),是一种被广泛应用的开放源代码的、基于服务器端的用于产生动态网页的、可嵌入 HTML 中的脚本程序语言,尤其适合 WEB 开发。

当客户端向服务器的程序提出请求时,web 服务器根据请求响应对应的页面,当页面中含有 php 脚本时,服务器会交给 PHP 解释器进行解释执行,将生成的 html 代码再回传给客户端,客户端的浏览器解释 html 代码,最终形成网页格式的页面。

执行方式

PHP 代码被包含在特殊的起始符和结束符中,使得网页的脚本可以进出“PHP 模式”。其它用 C 或 Perl 语言写的脚本,需要用大量的命令来编写程序以输出 HTML ,而用 PHP 编写一个 HTML 脚本,只需嵌入了一些代码来完成操作(例如,在本例中输出了一些文本)。和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端的。如果在服务器上建立了如上例类似的代码,则在运行该脚本后,客户端就能接收到其结果,但他们无法得知其背后的代码是如何运作的。甚至可以将 web 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法得知服务端到底做了什么。

PHP 运行环境安装

大家在初始学习 PHP 时使用集成化开发环境是最好的选择,下面是常用的集成开发环境

集成开发软件可使用的操作系统说明
WAMPWin推荐
XAMPPWin/Mac
MampMac推荐
LampLinux(CentOS/Fedora/Debian/Ubuntu)

PHP 的特点

  • 是开放源代码的,服务器端的脚本语言。
  • 独立于操作系统,可以运行在几乎所有系统中。
  • 支持大部分的服务器,如 Apache,IIS。
  • 支持大量的数据库,主要是 Access\MySQL\SQL Server 这三种。
  • 可以创建图象。
  • … …
  • 还有一些其他特色功能在后面的高级技术详细介绍。
  • 我们知道的网站如迅雷、新浪微博等大型网站都在使用 PHP 程序。

C/S 与 B/S 结构

C/S 结构

C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到 Client 端和 Server 端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是 Client/Server 形式的两层结构

**B/S****结构**

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着 Internet 技术的兴起,对 C/S 结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过 WWW 浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。

集成开发环境

WAMP

Windows 下的 Apache+Mysql/MariaDB+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的 Web 应用程序平台。

MAMP

苹果系统下 MAMP PRO 是专业级版本的经典本地服务器环境的 os x 软件。MAMP 这几个首字母代表苹果的 OSX 系统上的 Macintosh、Apache、MySQL 和 PHP,顾名思义,你应该知道 MAMP 的强大功能 啦!MAMP 内含 Apache 伺服器、PHP 安装套件以及 MySQL 安装套件。

PHP 的标记风格

<?php … … ?>

这是 PHP 推荐使用的标记风格。服务器管理员不能禁用这种风格的标记。

分号

PHP 用分号来分隔简单的语句。复合语句用大括号来标记代码块,如条件测试或循环,在大括号后面不要用分号。和其他语言不一样的是,在 PHP 中右括号(?>)前的分号不是必选的。

空白和换行符

一般来说,空白符在 PHP 中无关紧要。可以将一个语句展开成任意行,或者将语句紧缩在一行。可以利用这个灵活的格式来使代码更具有可读性(通过排列分配、缩进等)。一些懒惰的程序员利用这种自由的格式创建根本无法阅读的代码,这是不提倡的。

程序的注释

PHP 支持 C、C ++和 Shell 脚本风格的注释,如下:

// 单行注释
/* ...*/  多行注释 		(注意:不能嵌套)
# 脚本注释

查看数据

echo

输出一个或多个变量,他不是函数,不需要使用括号,如果输出多个请用逗号分隔

echo 1,2,3,4;

var_dump

打印变量的相关信息

var_dump(1234);

区别:echo 是直接输出,var_dump 输出和带有变量类型

变量知识

定义变量

PHP 是弱类型语言,不像其他语言需要对变量进行类型声明。PHP 中以 $ 作为前缀来定义变量,以 a~z(大小写)或 _ 下划线定义变量名。

下面是合法的变量名

$hd =  'houdurnen.com';
$_name = '向军大叔';

下面是非法的变量声明

$999 = 'yahoo.com'
$&* = 'sina.com.cn'

弱类型

PHP 是一种非常弱的类型语言。在大多数编程语言中,变量只能保持一种类型的数据,而且这个类型必须在使用变量前声明,例如 C 语言中。

而在 PHP 中,变量的类型通常不是由程序员设定的,确切地说,是根据该变量使用的上下文在运行时(即变量的值)决定的。

简单来说,var = 1;就是数字,var2 = '1'就是字符串,变量类型是由值决定的。

传值与引用

传值赋值

直接使用 = 将变量的值赋值给另一个变量。

$a = 1;
$b = $a;
$b = 2;
echo $a;//结果是1

引用赋值

将一个变量的内存地址赋值给另一个变量的行为即传址赋值。需要在 = 等号前加上 & 引用符号,这样两个变量指向内存中的一个地址,任何一个变量的改变都影响到另一个变量,有点类似于快捷方式的概念。

$a = 1;
$b = &$a;
$b = 2;
echo $a;//结果是2

可变变量

可以变量即使用一个变量的值,作为另一个变量名。

$a = 'hello';	//普通变量
$$a = 'world';	//可变变量 相当于:$hello = ‘world’;
echo "$a ${$a}";//输出:hello world
echo "$a $hello";//输出:hello world

变量作用域

变量作用域指变量在代码中可以访问的位置。

超全局变量

可以代码的任何位置都可以访问的变量

变量说明
$_GET地址栏 GET 提交
$_POST表单 POST 提交
$_FILES文件上传变量
$_SESSION会话变量
$_COOKIEcookie 值变量
$_GLOBALS全局变量
$_REQUEST包含$_GET、$_POST、$_COOKIE
$_SERVER服务器环境变量

全局变量

全局声明(函数外声明)的变量会保存在 $_GLOBALS 中,函数内默认不能访问到全局变量,在函数中访问需要使用 global 关键字。

$hd='后盾人';
function p() {
	//利⽤ global 引入全局变量
	global $hd;
	echo $hd;
}
p();

也可以使用全局数组$GLOBALS 调⽤用全局变量量。 如: $GLOBALS['hd'];

检测变量

通过 isset 函数可以检测变量是否定义。

var_dump(isset($name));
# 结果是false

变量销毁

php 在全部代码执行结束后会删除所有变量,也使用 unset 函数可以在程序运行中删除变量。

$name='houdunren.com';
unset($name);

全局变量不能在函数中删除

$name = 'houdunren.com';
function run()
{
    global $name;
    unset($name);
}
run();
echo $name;
# 依然可以输出 houdurnen.com

静态变量

PHP 支持声明函数变量为静态的(static)。一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调⽤时被初始化。要声明函数变量为静态的⽤关键字 static。通常静态变量的第一次使⽤用时赋予⼀个初始值。

function calculate()
{
    static $a=1;
    return ++$a;
}
calculate();
echo calculate();

数据类型

使用不同数据类型储存不同数据,就像我们家里面放衣服和放洗手液会使用用不同的容器一样。下面是常用 PHP 数据类型表:

类型说明
integer整型
float浮点型
string字符串
boolean布尔型
array数组
object对象

整型

整型可以是十进制、八进制、十六进制。

01988 #十进制
0xfff #十六进制

下面是 777 八进制数转成 10 进制数,即逢 8 进 1 原则,PHP 中使用 octdec() 函数可以将 8 进制转为 10 进制。

$$ 78^2+78^1+7*8^0 = 511 $$

下面是十六进帛 FAF 转为 10 进制数,PHP 中使用 hexde()函数将 16 进制转为 10 进制

$$ 1516^2+1016^1+15*16^0 $$

浮点数

浮点数表示实数,可理解为有限或无限小数。

0.12
-10.98

布尔型

当转换为 boolean 时,以下值被认为是 FALSE:这个地方提示学生不用记,按照自己的感觉来就可以判定了,读完一遍之后把 ppt 关掉,提问 true 还是 false,学生都会知道的

  1. 布尔值 FALSE
  2. 整型值 0(零)
  3. 浮点型值 0.0(零)
  4. 空白字符串
  5. 字符串 "0"
  6. 没有成员变量的数组
  7. 没有单元的对象(仅适用于 PHP 4)
  8. 特殊类型 NULL(包括尚未设定的变量)

所有其它值都被认为是 TRUE

字符串

定义

引号

字符串可以用双引号"" 或 '' 号包含,区别是双引号中可以解析变量。

$url = 'houdunren.com';
$string = "后盾人网址是 {$url}";

在所有输出前使用下面的代码可以正确显示中文:

header('Content-type:text/html;charset=utf-8');

定义符

定界符文本表现的就和双引号字符串一样,在定界符文本中不需要转义引号,适合输入大量文本。

结束符必须从第一列开始,并且后面除了分号以外不能包含任何其他字符,空格也不可以。

$string =<<<str
这是使用定界符输入的内容
str;
echo $string;

连接符

多个字符串使用 . 符号连接

$name = '后盾人';
$url  = 'houdunren.com'
echo $name.$url;

转义

转义是将有多种含义的字符进行转换,比如 $即是变量前缀也是美元符号,就需要转义在不同场景进行改变。

echo  "变量定义 \$name = 'houdunren.com',学会了吗?";

常用函数

strlen — 取得字符串长度传度的函数

echo strlen('houdunren.com');

mb_strlen — 根据字符编码获取长度

echo mb_strlen('后盾人','utf8');

trim — 截去字符串首尾的内容

$string = ' houdunren.com  ';
echo strlen(trim($string,' moc'));
# 从前后删除 moc和空格字符

rtrim 从右侧删除、ltrim 从左侧删除

$string = ' houdunren.com  ';
echo strlen(rtrim($string,' moc'));

strtolower — 字母转为小写

$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtolower($str);
echo $str; // Prints mary had a little lamb and she loved it so

strtoupper — 字母转大写

$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtoupper($str);
echo $str; // Prints MARY HAD A LITTLE LAMB AND SHE LOVED IT SO

ucfirst — 将字符串的首字母转换为大写

$foo = 'hello world!';
$foo = ucfirst($foo); // Hello world!

ucwords — 将字符串中每个单词的首字母转换为大写

$foo = 'hello world!';
$foo = ucwords($foo);             // Hello World!

$foo = 'hello|world!';
$baz = ucwords($foo, "|");        // Hello|World!

md5 — 计算字符串的 MD5 散列值,以 32 字符十六进制数字形式返回散列值

md5('houdunren.com') //962ff8546a001f8f6d0adecf08905d14

explode — 使用一个字符串分割另一个字符串

$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

implode — 将一个一维数组的值转化为字符串

$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);

echo $comma_separated; // lastname,email,phone

substr — 返回字符串的子串

$rest = substr('abcdef', 1);     // bcdef
$rest = substr('abcdef', 1, 3);  // bcd
$rest = substr("abcdef", 0, -1);  // 返回 "abcde"
$rest = substr("abcdef", 2, -1);  // 返回 "cde"
$rest = substr("abcdef", 4, -4);  // 返回 ""
$rest = substr("abcdef", -3, -1); // 返回 "de"

mb_substr — 获取部分字符串

echo mb_substr('后盾人', 1, 1, 'utf-8'); //盾

strstr — 查找字符串的首次出现

$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com

strrchr — 查找指定字符在字符串中的最后一次出现

echo strrchr('hdcms.jpg', '.'); // .jpg

strpos — 查找字符串首次出现的位置,如果没找到,将返回 FALSE

echo strpos('houdurnen.com', 'o'); // 返回1

strrpos — 计算指定字符串在目标字符串中最后一次出现的位置

echo strrpos('houdurnen.com', 'o'); // 返回11

str_replace — 子字符串替换

echo str_replace('houdunren', 'hdcms', 'houdunren.com'); //返回 hdcms.com

echo str_replace(['小猫','小狗'], '*', '我家有一只可爱的小猫和小狗');//我家有一只可爱的*和*

echo str_replace(['小猫','小狗'], ['猫猫','旺旺'], '我家有一只可爱的小猫和小狗'); //我家有一只可爱的猫猫和旺旺

NULL

NULL 数据类型只有一个值 NULL。

  1. 变量未被赋予任何值
  2. 变量被赋值为 NULL
  3. 被 unset()函数处理后的变量
\$a;		//变量 \$a未被赋予任何变量,值为NULL
\$b = NULL;	//变量 \$b被赋值为NULL
\$c = 10;

unset($c);
//使用unset()函数处理后,\$c为NULL

相关函数

getType()

php
\$num = 1234;
\$type = gettype(\$num);
var_dump(\$type);

检测是否为布尔型

\$var = true;
\$bool = is_bool(\$var);
var_dump(\$bool);

检测是否为整型

$int = 1234;
$bool = is_int($int);
var_dump($bool);

检测是否为浮点数

$num = 1.1234;
$bool = is_float($num);
var_dump($bool);

检测是否为字符串

$string = 'houdunwang';
$bool = is_string($string);
var_dump($bool);

检测是否为 NULL

$var = null;
$bool = is_null($var);
var_dump($bool);

类型转换

自动转换

PHP 类型根据值,自动转换

$num1 = '1';
$num2 = '2';
echo $num1 + $num2; # 字符串转为数字相加

强制转换

settype($var,'type'); # type类型为integer、double、string、array 与 object

$var = '123';

settype($var,’integer’);
var_dump($var); 就会变成int类型

intval() $var = '123';
var_dump(intval($var));

floatval() $var = '1.23';
var_dump(floatval($var));

strval() $var = 123;
var_dump(strval($var));

常量使用

常量是一个简单值的标识符(名字)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。

常量特性

  • 常量前面没有美元符号($)
  • 常量只能用 define() 函数定义,而不能通过赋值语句
  • 常量一旦定义就不能被重新定义或者取消定义
  • 常量的值用来定义 整型,浮点,字符串,布尔值,数组(PHP7 新增)
  • 常量可以不用理会变量范围的可以在任何位置访问

声明常量

常量可以使用 constdefine 定义。

  • const 是语言结构,在编译时要比 define 快
  • define 可以设置第三个参数为 true,来定义不区分大小写的常量
  • 类文件中定义常量也使用 const,所以 const 统一易读
define('常量名',值);
define('WEBNAME','houdunwang');
echo WEBNAME;

常量检测

$bool = defined('WEBNAME');
var_dump($bool); // 结果是false

系统常量

__DIR__			文件所在目录
__FILE__		文件路径
__LINE__		程序代码行号
PHP_VERSION 	显示PHP版本
PHP_OS   		显示服务器的操作系统版本
TRUE			boolean值真(true)支持小写常量
FALSE 			boolean值假(false)支持小写常量
__FUNCTION__	函数名称
__METHOD__		方法名称
__CLASS__		类名称

使用函数 get_defined_constants(true) 可以获取当前可使用的所有常量。

运算符

算术运算符

运算符说明
$a+$b加法 $a 和$b 的和
$a-$b减法 $a 和$b 的差
$a*$b乘法 $a 和$b 的积
$a/$b除法 $a 除以$b 的商
$a%$b取模 $a 除以$b 后的余
++$a前加 $a 的值先加一,然后进行操作
$a++后加 $a 的值先进行操作,后加一
--$a前减 $a 的值先减一,然后进行操作
$a--后减 $a 的值先进行操作,后减一

赋值运算符

运算符说明
=右边值赋值给左边变量
+=左边值加上右边值赋值给左边变量
-=左边值减掉右边值赋值给左边变量
*=左边值乘以右边值赋值给左边变量
/=左边值除以右边值赋值给左边变量
.=左边字符串连接到右边变量后面
%=左边值对右边值取余数后赋值给左边变量

字符串运算符

运算符说明
.它返回其左右参数连接后的字符串
.=左边字符串连接到右边变量后面

比较运算符

运算符说明
$a==$b等于 TRUE,如果$a 等于$b
$a===$b全等于 TRUE,如果$a 等于$b,并且类型也相同
$a!=$b不等 TRUE,如果$a 不等于$b
$a<>$b不等 TRUE,如果$a 不等于$b
$a!==$b非全等 TRUE,如果$a 不等于$b,或者类型不同
$a<$b小于 TRUE,如果$a 严格小于$b
$a>$b大于 TRUE,如果$a 严格$b
$a<=$b小于等于 TRUE,如果 $a 小于或者等于$b
$a>=$b大于等于 TRUE,如果 $a 大于或者等于$b

逻辑运算符

| 运算符 | 说明 | | ----------- | ---------------------------------------- | --- | ---------------------------------------- | | $a and $b | 逻辑与 TRUE,如果 $a 与 $b 都为 TRUE | | $a or $b | 逻辑或 TRUE,如果 $a 或 $b 任一为 TRUE | | !$a | 逻辑非 TRUE,如果 $a 不为 TRUE | | $a && $b | 逻辑与 TRUE,如果 $a 与 $b 都为 TRUE | | $a | | $b | 逻辑或 TRUE,如果 $a 或 $b 任一为 TRUE |

and 与&& 、or 与||是同一逻辑运算符的两种写法,但优先级不同。

这四个符号的优先允许从高到低是:&&、||、AND、OR。

三元表达式

变量=(表达式)?值 1:值 2; 当表达式的返回值为 true 时,$变量被赋予值 1,否则被赋予值 2

echo true?'向军':'后盾人'; //返回向军

?? 与 ?:

$var=0;
echo $var?:'大叔'; #输出大叔

$var=0;
echo $var??'大叔';#输出0

PHP 7 新增加的 NULL 合并运算符(??)是用于执行 isset()检测的三元运算的快捷方式。 ?: 只判断 true 或 false ,而 ?? 判断变量存在并且值不为 null

屏蔽错误

@ 运算符用于屏蔽表达式警告错误

@(20/0);

流程控制

if/else/elseif

当条件表达式的值为真(true)时,PHP 将执行语句组,相反条件表达式的值为假(false)时,PHP 将不执行语句组,忽略语句组执行下面的语句。

if (true) {
    echo '向军大叔';
} else {
    echo '不成立';
}

//也可以使用以下写法
if (true) :
    echo '向军大叔';
 else :
    echo '不成立';
 endif;

elseif

$age = 10;
if ($age<=15) {
    echo '儿童';
} elseif ($age<=30) {
    echo '青年';
} elseif ($age<=50) {
    echo '中年';
} else {
    echo '尊敬的老人';
}

//也可以使用以下写法
$age = 10;
if ($age<=15) :
    echo '儿童';
elseif ($age<=30) :
    echo '青年';
elseif ($age<=50) :
	echo '中年';
else :
    echo '尊敬的老人';
endif;

switch

switch 设置多个执行代码块,break 指令终止向下执行,default 为上面条件都不满足时执行的默认代码块。

switch ($status) {
case 'success':
    echo '成功';
    break;
case 'error':
    echo '错误';
    break;
case 'warning':
    echo '警告';
    break;
}

//也可以使用以下写法
switch ($status) :
    case 'success':
        echo '成功';
        break;
    case 'error':
        echo '错误';
        break;
    case 'warning':
        echo '警告';
        break;
endswitch;

while

当 while 循环语句中表达式(循环控制语句)的结果为真时,程序将反复执行同一段程序:循环体( while 中的语句或语句序列),直到满足一定的条件(表达式的结果为假时)后才停止执行该段程序。

$num = 10;
while ($num>0) {
    echo($num--).'<br/>';
}

//也可以使用以下写法
$num = 10;
while ($num>0):
    echo($num--).'<br/>';
endwhile;

do...while

与 while 的差别是条件后判断。

$num = 10;
do {
    echo($num--).'<hr/>';
} while ($num>0);

for

for(表达式1;表达式2;表达式3){
	语句或语句序列;
}
// 表达式1为循环初始条件;
// 表达式2为循环控制条件;
// 表达式3为控制变量递增;
for ($num=10;$num>0;$num--) {
    echo $num.'<hr/>';
}
// 也可以使用以下写法
for ($num=10;$num>0;$num--) :
    echo $num.'<hr/>';
endfor;

break 与 continue

**break **

我们之前在 switch 条件判断中已经使用过 break 关键字,它会使得程序流程离开 switch 本体中的语句,如果 break 使用在 for、while 或 do-while 循环结构中时,将会使得程序离开该层循环。

do {
    if (!isset($num)) {
        $num=10;
    }
    if ($num==0) {
        break;
    }
    echo($num--).'<hr/>';
} while (true);

break 在多层循环嵌套使用时,可以指定跳转出层数。

$num=0;
while (true):
    $num++;
    switch ($num) {
        case $num%2==0:
            echo $num."<hr/>";
            break;
        case $num%15==0:
            echo $num."<hr/>";
            break 2;
    }
endwhile;

continue

continue 的作用与 break 有点类似,continue 若使用在 for、while 或 do-while 循环结构中,当程序执行至 continue 时,之后的语句将直接被略过,而直接执行下一次的循环动作。

for ($num=10;$num>0;$num--) {
    if(!($num%2))continue;
    echo $num.'<hr/>';
}

文件引入

include & require

使用 include 和 require 将文件导入,就像把该文件粘贴到使用函数的地方。

include( )与 require ( )区别在于错误处理方式,当引入产生错误时 include( )产生一个警告而 require( )则导致一个致命错误。

include './test.php';
echo 'test'; //如果test.php文件不存在会报一个warning错误,但是可以输出test

可以使用 @ 屏蔽 incluce 加载警告错误

if (!@include 'a.php') {
    echo '文件不存在';
}

require 加载失败时将终止程序执行

require './test.php';
echo 'test'; //如果test.php文件不存在会报一个fatal错误,不可以输出test

include_once 和 require_once

与 include( )语句及 require( )区别是如果文件已经加载过,则不会重复加载文件。

// 因为 include 每次都加载所以下面两行代码执行会报错
include './functions.php';
include './functions.php';

//下面使用 include_once 就不会报错
include_once './functions.php';
include_once './functions.php';

日期时间

日期与时间是常用的数据属性,比如二手车平台新车上架时间,社区平台的发贴时间等。

时区

时间根据不同国家以时区划分,下面是中国可用的时区。因为我国不区分时区所以以下用哪个都可以。

时间说明
PRCPeople’s Republic of China,中华人民共和国
Asia/chongqing重庆
Asia/shanghai上海
Asia/urumqi乌鲁木齐

设置时区

  1. PHP.ini 配置(不推荐使用,因为有些服务器是改不了配置项的)date.timezone = PRC

  2. 脚本中修改 (推荐使用)

  • date_default_timezone_get()取得当前使用时区

  • date_default_timezone_set()设定当前使用时区

  • date_default_timezone_set("PRC");
    echo date('y-m-d H:i:s');

UNIX 时间戳

PHP 的时间戳开始于 1970 年 1 月 1 日零点,默认为 10 位整数数值。

time

返回当前 Unix 时间戳秒数,1 毫秒等于一千分之一秒。

echo time();

microtime

返回当前 Unix 时间戳和微秒数。1 微秒等于一百万分之一秒。

list($usec, $sec) = explode(" ", microtime());
echo $sec.':'.$usec;

设置参数为 TRUE 返回浮点数

echo microtime(true);

脚本执行时间

function runtime($start=null, $end=null)
{
    static $cache=[];
    if (is_null($start)) {
        return $cache;
    } elseif (is_null($end)) {
        return $cache[$start] = microtime(true);
    } else {
        $end = $cache[$end]??microtime(true);
        return $end-$cache[$start];
    }
}
//record
runtime('for');
for ($i=0;$i<20000000;$i++):
    $i++;
endfor;

//record
runtime('while');
$n=0;
while ($n<20000000):
    $n++;
endwhile;

echo runtime('for', true);
echo '<hr/>';
echo runtime('while', true);

date

格式化一个本地时间/日期

echo date('Y-m-d h:i:s');

通过第二个参数设置处理的时间

echo date('Y-m-d', time()-3600*24*100);

参数说明

参数说明返回值
Y4 位数字完整表示的年份例如:19992003
y2 位数字表示的年份例如:9903
m数字表示的月份,有前导零0112
n数字表示的月份,没有前导零112
d月份中的第几天,有前导零的 2 位数字0131
j月份中的第几天,没有前导零1 到 31
H小时,24 小时格式,有前导零0023
h小时,12 小时格式,有前导零01 到 12
i有前导零的分钟数00 到 59
s秒数,有前导零00 到 59

getdate

取得日期/时间信息

print_r(getdate(strtotime("+1 day"))); //获取1天后的时间数据

strtotime

将任何字符串的日期时间描述解析为 Unix 时间戳

// ISO格式时间转为时间戳
echo strtotime('2022-1-20 03:22:12');
echo '<br/>';
echo date("Y-m-d h:i:s", 1547954532);

//当前时间戳
echo strtotime('NOW');
echo '<br/>';
echo date("Y-m-d H:i:s", strtotime('NOW'));

时间计算

可以获取计算后的时间格式参数

//1年加1天后的时间戳
echo strtotime('+1 day +1 year');
echo '<br/>';
echo date("Y-m-d H:i:s", strtotime('+1 day +1 year'));

//下周五
echo date("Y-m-d H:i:s", strtotime('next friday'));

对象操作

PHP 提供了面向对象的操作日期时间的方式,Carbon 就是基于 PHP 内置对象的开源产品,功能丰富使用简单,具体 Carbon 课程请登录 后盾人 查看学习。

简单使用

//定义时区,当然也可以使用date_default_timezone_set函数的
$prc = new DateTimeZone('PRC');
$dateTime = new DateTime();
$dateTime->setTimezone($prc);
echo $dateTime->format('Y-m-d H:i:s');

//直接设置时间
$dateTime = new DateTime('2025-2-12 3:22:12');
echo $dateTime->format('Y-m-d H:i:s');
//输出时间戳
echo $dateTime->format('U');

//重新时期与时间
$dateTime->setDate(2019, 10, 1);
$dateTime->setTime(10, 22, 12);
echo '<br/>';
echo $dateTime->format('Y-m-d H:i:s');

根据时间戳生成时期

$dateTime = new DateTime();
$dateTime->setTimestamp(time());
echo $dateTime->format('Y-m-d H:i:s');

创建不规则时间

根据给定的格式解析日期时间字符串,用于对不规则日期时间格式处理。

$dateTime = DateTime::createFromFormat('Y/m-d His', '2020/12-13 081253');
echo $dateTime->format('Y-m-d H:i:s');

获取时间差

$dateTime1 = new DateTime();
$dateTime2 = new DateTime('2019-9-2');
$interval = $dateTime1->diff($dateTime2);
$format = '距离生日还有 <span style="color:red">%m个月%d天%h小时%i分钟%s秒</span> <br/>共%R%a天';
echo $interval->format($format);

说明 %R 显示+或-表示大于或小于,%a 相差天数。

添加时间

格式以字母 P 开始后面跟着一个周期指示器。如果包含时间元素则以字母 T 开始。比如 P2DT3H表示间隔 2 天 3 小时。

$date = new DateTime();
$interval = new DateInterval('P2DT2H5M');
echo $date->format('Y-m-d H:i')."<br/>";

//增加时间
$date->add($interval);
echo $date->format('Y-m-d H:i');

//减少时间
echo "<br/>";
echo (new DateTime())->sub($interval)->format('Y-m-d H:i');

数学函数

PHP 提供了丰富的数学操作函数,下面我们介绍常用的函数使用,其他函数使用请参考手册

ceil

进一法取整

echo ceil(10.2); //输出11

floor

向下取整

echo floor(10.2); //输出10

max

找出最大值

echo max(1, 3); //返回3

min

找出最小值。

echo min(1, 3);//返回1

下面是获取页码的逻辑,并对用户参数进行了验证处理,防止出现负数与超过总页码 100 的数值。

echo  min(100, max(1, $_GET['page']??1));

round

对浮点数进行四舍五入处理。

echo round(12.567, 2);

mt_rand

生成更好的随机数,下面是生成验证码随机数示例。

function code(int $len=5):string
{
    $str = 'abcdefghknm12345678';
    $code = '';
    for ($i=0;$i<$len;$i++) {
        $index = mt_rand(0, strlen($str)-1);
        $code.=strtoupper($str[$index]);
    }
    return $code;
}
echo code(5);