基础知识

PHP是什么?

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

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

执行方式

PHP代码被包含在特殊的起始符和结束符中,使得网页的脚本可以进入“PHP模式”。其它用 C 或 Perl 语言写的脚本,需要用大量的命令来编写程序以输出 HTML,而用 PHP 编写一个 HTML 脚本,只需嵌入一些代码来完成操作。

  1. <?php
  2. echo "Hello world!";
  3. ?>

和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端的。如果在服务器上建立了如上例类似的代码,则在运行该脚本后,客户端就能接收到其结果,但他们无法得知其背后的代码是如何运作的。甚至可以将 web 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法得知服务端到底做了什么。

PHP运行环境安装

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

集成开发软件 可使用的操作系统 说明
WAMP Win 推荐
XAMPP WIN/Mac 推荐
Mamp Mac 推荐
Lamp Linux(CentOS/Fedora/Debian/Ubuntu)
phpstudy Win/Linux/Mac

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)实现。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。

PHP的标记风格

  1. <?php ... ... ?>

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

分号

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

空白和换行符

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

程序的注释

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

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

查看数据

echo

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

  1. echo 1,2,3,4;

var_dump

打印变量的相关信息。

  1. var_dump(1234);

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

变量知识

定义变量

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

下面是合法的变量名:

  1. $laot = '0x208.cc';
  2. $_name = 'laot';

下面是非法的变量名

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

弱类型

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

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

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

传值与引用

传值赋值

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

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

引用赋值

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

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

可变变量

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

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

变量作用域

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

超全局变量

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

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

全局变量

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

  1. $laot='0x208.cc';
  2. function p() {
  3. //利⽤ global 引入全局变量
  4. global $laot;
  5. echo $laot;
  6. }
  7. p();

也可以使用全局数组$GLOBALS调用全局变量。如:$GLOBALS[‘laot’];

检测变量

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

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

变量销毁

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

  1. $name = 'laot';
  2. unset($name);

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

  1. $name = 'laot';
  2. function run()
  3. {
  4. global $name;
  5. unset($name);
  6. }
  7. run();
  8. echo $name;
  9. # 依然可以输出 laot

静态变量

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

  1. function calculate()
  2. {
  3. static $a=1;
  4. return ++$a;
  5. }
  6. calculate();
  7. echo calculate();

数据类型

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

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

整型

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

  1. 01988 #十进制
  2. 0xfff #十六进制

下面是 777 八进制数转成 十进制数,即逢8进1原则,PHP 中使用 octdec() 函数可以将8进制转为10进制。 7*8^2+7*8^1+7*8^0 = 511

下面是十六进制 FAF 转为十进制数,PHP 中使用 hexde() 函数将 16进制转为 10进制。 15*16^2+10*16^1+15*16^0

浮点数

浮点数标识实数,可理解为有限小数或无限小数。

  1. 0.12
  2. -10.98

布尔型

当转换为 boolean 时,以下值被认为是 FALSE,这个地方不用记,读完一遍根据自己的感觉来就可以判定了。

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

其他所有值都被认为是 TRUE。

字符串

定义引号

字符串可以用双引号 “” 或 ‘’ 单引号包含,区别是双引号中可以解析变量。

  1. $url = '0x208.cc';
  2. $string = "网址是 {$url}";

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

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

定界符

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

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

  1. $string =<<<str
  2. 这是使用定界符输入的内容
  3. str;
  4. echo $string;

连接符

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

  1. $name = "laot";
  2. $url = "0x208.cc";
  3. echo $name.$url;

转义

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

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

常用函数

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

  1. echo strlen('0x208.cc');

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

  1. echo mb_strlen('老t','utf8');//输出2

trim——去除字符串首尾的空格

  1. $string = ' 0x208.cc ';
  2. echo strlen(trim($string,' x0c'));
  3. # 从前后删除 x0c和空格字符

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

  1. $string = ' 0x208.cc ';
  2. echo strlen(rtrim($string,' x0c'));

strtolower——字母转为小写

  1. $str = "Hello World";
  2. $str = strtolower($str);
  3. echo $str;//hello world

strtoupper——字母转大写

  1. $str = "Hello World";
  2. $str = strtoupper($str);
  3. echo $str;//HELLO WORLD

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

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

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

  1. $foo = 'hello world!';
  2. $foo = ucwords($foo); // Hello World!
  3. $foo = 'hello|world!';
  4. $baz = ucwords($foo, "|"); // Hello|World!

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

  1. echo md5('laot');//accdb9390f212f0d6337fba3767b3a42

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

  1. $pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
  2. $pieces = explode(" ", $pizza);//空格分割
  3. echo $pieces[0]; // piece1
  4. echo $pieces[1]; // piece2

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

  1. $array = array('lastname', 'email', 'phone');
  2. $comma_separated = implode(",", $array);//以逗号连接
  3. echo $comma_separated; // lastname,email,phone

substr——返回字符串的子串

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

mb_substr——获取部分字符串

  1. echo mb_substr('喜剧之王', 1, 1, 'utf-8'); //剧

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

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

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

  1. echo strrchr('laot.jpg', '.'); // .jpg

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

  1. echo strpos('0x208.cc', '0'); // 返回0

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

  1. echo strrpos('0x208.cc', '0'); // 返回3

str_replace——子字符串替换

  1. echo str_replace('0x208', 'doc.0x208', '0x208.cc'); //返回 doc.0x208
  2. echo str_replace(['小猫','小狗'], '*', '我家有一只可爱的小猫和小狗');//我家有一只可爱的*和*
  3. 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

  1. <a name="BgPrG"></a>
  2. ### 相关函数
  3. getType() 获取变量类型

$num = 123; $type = gettype($num); var_dump($type);//输出integer

  1. is_bool() 检测是否为布尔值

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

  1. is_int() 检测是否为整型

$num = 123; $bool = is_int($num); var_dump($bool);

  1. is_float() 检测是否为浮点数

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

  1. is_string() 检测是否为字符串

$string = ‘0x208.cc’; $bool = is_string($string); var_dump($bool);

  1. is_null() 检测是否为 NULL

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

  1. <a name="xzVfp"></a>
  2. ### 类型转换
  3. 自动转换<br />PHP类型根据值自动转换。

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

  1. 强制转换

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

$var = ‘123’;

settype($var,’integer’); var_dump($var);

$var = ‘123’; var_dump(intval($var));

$var = ‘1.23’; var_dump(floatval($var));

$var = 123;

  1. <a name="s1reI"></a>
  2. ## 常量使用
  3. 常量是一个简单值的标识符(名字)。常量默认大小写敏感。按照惯例常量标识符总是大写的。
  4. <a name="r3U4P"></a>
  5. ### 常量特性
  6. - 常量前面没有美元符号($)
  7. - 常量只能用 define() 函数定义,而不能通过赋值语句
  8. - 常量一旦定义就不能被重新定义或者取消定义
  9. - 常量的值用来定义整型、浮点、字符串、布尔值、数组(PHP7新增)
  10. - 常量可以不用理会变量范围,可以在任何位置访问
  11. <a name="qL8UR"></a>
  12. #### 声明常量
  13. 常量可以使用 `const` 和 `define` 定义
  14. - const 是语言结构,在编译时要比 define 快。
  15. - define 可以设置第三个参数为 true,来定义不区分大小写的常量。
  16. - 类文件中定义常量也使用 const,所以 const 统一易读。

define(‘常量名’,值); define(‘URL’,’0x208.cc’); echo URL;

  1. <a name="lmNA8"></a>
  2. #### 常量检测

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

  1. <a name="A9fv8"></a>
  2. #### 系统常量

DIR 文件所在目录 FILE 文件路径 LINE 程序代码行号 PHPVERSION 显示PHP版本 PHPOS 显示服务器的操作系统版本 TRUE boolean值真(true)支持小写常量 FALSE boolean值假(false)支持小写常量 FUNCTION 函数名称 METHOD 方法名称 __CLASS 类名称

  1. 使用函数`get_defined_constants(true)`可以获取当前可使用的所以常量。
  2. <a name="YEuAp"></a>
  3. ## 运算符
  4. <a name="6Lh4Q"></a>
  5. ### 算数运算符
  6. | 运算符 | 说明 |
  7. | --- | --- |
  8. | $a+$b | 加法 $a$b 的和 |
  9. | $a-$b | 减法 $a$b 的差 |
  10. | $a*$b | 乘法 $a$b 的积 |
  11. | $a/$b | 除法 $a$b 的商 |
  12. | $a%$b | 取模 $a除以$b后的余数 |
  13. | ++$a | 前加 $a的值先加一,然后进行操作 |
  14. | $a++ | 后加 $a的值先进行操作,后加一 |
  15. | --$a | 前减 $a的值先减一,然后进行操作 |
  16. | $a-- | 后减 $a的值先进行操作,后减一 |
  17. <a name="srk6j"></a>
  18. ### 赋值运算符
  19. | 运算符 | 说明 |
  20. | --- | --- |
  21. | = | 右边值赋值给左边变量 |
  22. | += | 左边值加上右边值再赋值给左边变量 |
  23. | -= | 左边值减掉右边值再赋值给左边变量 |
  24. | *= | 左边值乘以右边值再赋值给左边变量 |
  25. | /= | 左边值除以右边值再赋值给左边变量 |
  26. | .= | 右边字符串连接到左边变量后面,再赋值给左边变量 |
  27. | %= | 左边值对右边值取余后再赋值给左边变量 |
  28. <a name="35esW"></a>
  29. ### 字符串运算符
  30. | 运算符 | 说明 |
  31. | --- | --- |
  32. | . | 它返回其左右参数连接后的字符串 |
  33. | .= | 右边字符串连接到左边变量后面,再赋值给左边变量 |
  34. <a name="p0qz6"></a>
  35. ### 比较运算符
  36. | 运算符 | 说明 |
  37. | --- | --- |
  38. | $a==$b | 如果$a等于$b,返回TRUE |
  39. | $a===$b | 如果$a全等于$b,类型也相同,返回TRUE |
  40. | $a!=$b | 如果$a不等于$b,返回TRUE |
  41. | $a<>$b | 如果$a不等于$b,返回TRUE |
  42. | $a!==$b | 非全等,返回TRUE |
  43. | $a<$b | 小于返回TRUE |
  44. | $a>$b | 大于返回TRUE |
  45. | $a<=$b | 小于等于返回TRUE |
  46. | $a>=$b | 大于等于返回TRUE |
  47. <a name="PZChK"></a>
  48. ### 逻辑运算符
  49. | 运算符 | 说明 |
  50. | --- | --- |
  51. | $a and $b | 逻辑与,两者都为 TRUE 返回 TRUE |
  52. | $a or $b | 逻辑或,有一个为 TRUE 返回 TRUE |
  53. | !$a | 取反,$aFLASE返回TRUE |
  54. | $a && $b | 逻辑与,两者都为 TRUE 返回 TRUE |
  55. | $a &#124;&#124; $b | 逻辑或,有一个为 TRUE 返回 TRUE |
  56. and &&、or || 是同一逻辑运算符的两种写法,但优先级不同。<br />这四个符号的优先级从高到低是:&&、||、andor
  57. <a name="i7eic"></a>
  58. ### 三元表达式
  59. `变量 = (表达式) ? 值1 : 值2;` 当表达式的返回值为true时,变量被赋予值1,否则被赋予值2

echo true?’laot’:’0x208’; //返回laot

  1. <a name="7zorl"></a>
  2. #### ?? 与 ?:

$var = 0; echo $var?:’laot’; #输出laot

$var=0; echo $var??’laot’;#输出0

  1. PHP7 新增加的 NULL 合并运算符 (??)是用于执行 isset() 检测的三元运算的快捷方式。?: 只判断 true false,而 ?? 判断变量存在并且值不为 null
  2. <a name="vsQSs"></a>
  3. ### 屏蔽错误
  4. `@` 运算符用于屏蔽表达式错误警告。

@(20/0);

  1. <a name="Juhzf"></a>
  2. ## 流程控制
  3. <a name="7jEoR"></a>
  4. ### if / else /elseif
  5. 当条件表达式的值为真(true)时,PHP将执行语句组,相反条件表达式的值为假(false)时,PHP将不执行语句组,忽略语句组执行下面的语句。

if (true) { echo ‘laot’; } else { echo ‘不成立’; }

//也可以使用以下写法 if (true) : echo ‘laot’; else : echo ‘不成立’; endif;

  1. 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;

  1. <a name="v204Y"></a>
  2. ### switch
  3. switch 设置多个执行代码块,break指令终止向下执行,default为上面条件都不满足时执行的默认代码块。

switch ($status) { case ‘success’: echo ‘成功’; break; case ‘error’: echo ‘错误’; break; case ‘warning’: echo ‘警告’; break; default: echo ‘默认’; }

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

  1. <a name="OVFNP"></a>
  2. ### while
  3. 当while循环语句中表达式(循环控制语句)的结果为真时,程序将反复执行同一段代码:循环体(while中的语句或语句序列),直到满足一定的条件(表达式的结果为假时)后才停止执行该段程序。

$num = 10; while ($num>0) { echo($num—).’
‘; }

//也可以使用以下写法 $num = 10; while ($num>0): echo($num—).’
‘; endwhile;

  1. <a name="KIoLK"></a>
  2. ### do...while
  3. 与while的差别是条件后判断。

$num = 10; do { echo($num—).’


‘; } while ($num>0);

  1. <a name="O7vPS"></a>
  2. ### for

for(表达式1;表达式2;表达式3){ 语句或语句序列; } // 表达式1为循环初始条件; // 表达式2为循环控制条件; // 表达式3为控制变量递增;

  1. ```
  2. for ($num=10;$num>0;$num--) {
  3. echo $num.'<hr/>';
  4. }
  5. // 也可以使用以下写法
  6. for ($num=10;$num>0;$num--) :
  7. echo $num.'<hr/>';
  8. endfor;

break 与 continue

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

  1. do {
  2. if (!isset($num)) {
  3. $num=10;
  4. }
  5. if ($num==0) {
  6. break;
  7. }
  8. echo($num--).'<hr/>';
  9. } while (true);

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

  1. $num=0;
  2. while (true):
  3. $num++;
  4. switch ($num) {
  5. case $num%2==0:
  6. echo $num."<hr/>";
  7. break;
  8. case $num%15==0:
  9. echo $num."<hr/>";
  10. break 2;
  11. }
  12. endwhile;

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

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

文件引入

include & require

使用include和require 将文件导入,就像把该文件粘贴到使用函数的地方。
include( )与require ( )区别在于错误处理方式,当引入产生错误时include( )产生一个警告而require( )则导致一个致命错误。

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

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

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

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

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

include_once 和 require_once

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

  1. // 因为 include 每次都加载所以下面两行代码执行会报错
  2. include './functions.php';
  3. include './functions.php';
  4. //下面使用 include_once 就不会报错
  5. include_once './functions.php';
  6. include_once './functions.php';

日期时间

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

时区

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

时区 说明
PRC People’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() 设定当前使用时区
    1. date_default_timezone_set("PRC");
    2. echo date('Y-m-d H:i:s');

UNIX 时间戳

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

time

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

  1. echo time();

microtime

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

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

设置参数为true返回浮点数

  1. echo microtime(true);

脚本执行时间

  1. function runtime($start=null, $end=null)
  2. {
  3. static $cache=[];
  4. if (is_null($start)) {
  5. return $cache;
  6. } elseif (is_null($end)) {
  7. return $cache[$start] = microtime(true);
  8. } else {
  9. $end = $cache[$end]??microtime(true);
  10. return $end-$cache[$start];
  11. }
  12. }
  13. //record
  14. runtime('for');
  15. for ($i=0;$i<20000000;$i++):
  16. $i++;
  17. endfor;
  18. //record
  19. runtime('while');
  20. $n=0;
  21. while ($n<20000000):
  22. $n++;
  23. endwhile;
  24. echo runtime('for', true);
  25. echo '<hr/>';
  26. echo runtime('while', true);

date

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

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

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

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

参数说明

参数 说明 返回值
Y 4位数字完整表示的年份 例如:1999或2020
y 2位数字表示的年份 例如:99或20
m 数字表示的月份,有前导零 01到12
n 数字表示的月份,没有前导零 1到12
d 月份中的第几天,有前导零的2位数字 01-31
j 月份中的第几天,没有前导零 1到31
H 小时,24小时格式,有前导零 00到23
h 小时,12小时格式,有前导零 01到12
i 有前导零的分钟数 00到59
s 有前导零的秒数 00到59

getdate

取得日期 / 时间信息

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

strtotime

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

  1. // ISO格式时间转为时间戳
  2. echo strtotime('2022-1-20 03:22:12');
  3. echo '<br/>';
  4. echo date("Y-m-d h:i:s", 1547954532);
  5. //当前时间戳
  6. echo strtotime('NOW');
  7. echo '<br/>';
  8. echo date("Y-m-d H:i:s", strtotime('NOW'));

时间计算

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

  1. //1年加1天后的时间戳
  2. echo strtotime('+1 day +1 year');
  3. echo '<br/>';
  4. echo date("Y-m-d H:i:s", strtotime('+1 day +1 year'));
  5. //下周五
  6. echo date("Y-m-d H:i:s", strtotime('next friday'));

对象操作

PHP提供了面向对象的操作日期时间的方式,Carbon 就是基于PHP内置对象的开源产品,功能丰富使用简单。

简单使用

  1. //定义时区,当然也可以使用date_default_timezone_set函数的
  2. $prc = new DateTimeZone('PRC');
  3. $dateTime = new DateTime();
  4. $dateTime->setTimezone($prc);
  5. echo $dateTime->format('Y-m-d H:i:s');
  6. //直接设置时间
  7. $dateTime = new DateTime('2025-2-12 3:22:12');
  8. echo $dateTime->format('Y-m-d H:i:s');
  9. //输出时间戳
  10. echo $dateTime->format('U');
  11. //重新日期与时间
  12. $dateTime->setDate(2019, 10, 1);
  13. $dateTime->setTime(10, 22, 12);
  14. echo '<br/>';
  15. echo $dateTime->format('Y-m-d H:i:s');

根据时间戳生成时期

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

创建不规则时间

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

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

获取时间差

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

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

添加时间

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

  1. $date = new DateTime();
  2. $interval = new DateInterval('P2DT2H5M');
  3. echo $date->format('Y-m-d H:i')."<br/>";
  4. //增加时间
  5. $date->add($interval);
  6. echo $date->format('Y-m-d H:i');
  7. //减少时间
  8. echo "<br/>";
  9. echo (new DateTime())->sub($interval)->format('Y-m-d H:i');

数学函数

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

ceil

进一法取整

  1. echo ceil(10.2); //输出11

floor

向下取整

  1. echo floor(10.2); //输出10

max

找出最大值

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

min

找出最小值

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

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

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

round

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

  1. echo round(12.567, 2);

mt_rand

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

  1. function code(int $len=5):string
  2. {
  3. $str = 'abcdefghknm12345678';
  4. $code = '';
  5. for ($i=0;$i<$len;$i++) {
  6. $index = mt_rand(0, strlen($str)-1);
  7. $code.=strtoupper($str[$index]);
  8. }
  9. return $code;
  10. }
  11. echo code(5);