PHP学习笔记---高级知识
一、多维数组
一个数组中的值可以是另一个数组,另一个数组的值也可以是一个数组。依照这种方式,我们可以创建二维或者三维数组。
<?php $arr = array( "first"=>array("1","2","3","<br>"), "sencond"=>array("4","5","6","<br>"), "third"=>array("7","8","9","<br>") ); print_r($arr);//能够格式化的输出数组内容 ?>
二、data();日期函数
PHP date() 函数可把时间戳格式化为可读性更好的日期和时间。
string date ( string $format [, int $timestamp ] )
format | 必需。规定时间戳的格式。 |
timestamp | 可选。规定时间戳。默认是当前的日期和时间。 |
date() 函数的第一个必需参数 format 规定了如何格式化日期/时间。
这里列出了一些可用的字符:
- d - 代表月中的天 (01 - 31)
- m - 代表月 (01 - 12)
- Y - 代表年 (四位数)
<?php echo date("Y-M-d--N---H-i--s--A"),"<br>";//format格式字 echo date("L");//是否为闰年 如果是闰年为 1,否则为 0 ?>
format 字符 | 说明 | 返回值例子 |
---|---|---|
日 | --- | --- |
d | 月份中的第几天,有前导零的 2 位数字 | 01 到 31 |
D | 星期中的第几天,文本表示,3 个字母 | Mon 到 Sun |
j | 月份中的第几天,没有前导零 | 1 到 31 |
l("L"的小写字母) | 星期几,完整的文本格式 | Sunday 到 Saturday |
N | ISO-8601 格式数字表示的星期中的第几天(PHP 5.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 或者 March | January 到 December |
m | 数字表示的月份,有前导零 | 01 到 12 |
M | 三个字母缩写表示的月份 | Jan 到 Dec |
n | 数字表示的月份,没有前导零 | 1 到 12 |
t | 给定月份所应有的天数 | 28 到 31 |
年 | --- | --- |
L | 是否为闰年 | 如果是闰年为 1,否则为 0 |
o | ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) | Examples: 1999 or 2003 |
Y | 4 位数字完整表示的年份 | 例如:1999 或 2003 |
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 | 时区标识(PHP 5.1.0 新加) | 例如:UTC,GMT,Atlantic/Azores |
I | 是否为夏令时 | 如果是夏令时为 1,否则为 0 |
O | 与格林威治时间相差的小时数 | 例如:+0200 |
P | 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) | 例如:+02:00 |
T | 本机所在的时区 | 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如"Eastern Standard Time",中文版会显示"中国标准时间")。 |
Z | 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 | -43200 到 43200 |
完整的日期/时间 | --- | --- |
c | ISO 8601 格式的日期(PHP 5 新加) | 2004-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)开始至今的秒数 | 参见 time() |
三、外部文件引入
在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。
include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
- require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
- include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
示例:
<?php include 'header.php'; //一般放在 PHP 文件的最前面,程序在执行前就会先导入要引用的文件 if (1 < 2) { require 'require.php';//一般放在程序的流程控制中,当程序执行时碰到才会引用,简化程序的执行流程。 } ?>
四、文件处理
fopen(name,type) 函数用于在 PHP 中打开文件。
此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件(类似于Python中的文件处理方式)
文件打开模式:
模式 | 描述 |
---|---|
r | 只读。在文件的开头开始。 |
r+ | 读/写。在文件的开头开始。 |
w | 只写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
w+ | 读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。 |
a | 追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。 |
a+ | 读/追加。通过向文件末尾写内容,来保持文件内容。 |
x | 只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
x+ | 读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。 |
fclose() 函数用于关闭打开的文件
feof() 函数检测是否已到达文件末尾(EOF)。
<?php $file = fopen("demo.txt", "a+") or exit("无法打开文件!");//文件打开,以读写的模式,在文件的开头开始。 while (!feof($file)) { echo fgets($file)."<br>"; } $write = "end"; file_put_contents("demo.txt", $write, FILE_APPEND | LOCK_EX); fclose($file);//文件关闭 ?>
五、PHP Cookie
什么是Cookie?
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
setcookie(name, value, expire, path, domain);
setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 <html> 标签之前。
<?php setcookie("user","PHP",time()+3600);//设置cookie名为:user,过期时间为1小时 //cookie的设置必须在<html>标签的前面?> <html> <head> <title>PHP高级教程</title> </head> <dody> <?php if (isset($_COOKIE["user"])) { echo "用户:".$_COOKIE["user"]; } setcookie("user","",time()-3600);//cookie的删除 if (isset($_COOKIE["user"])) { echo "用户:".$_COOKIE["user"]; }else{ echo "cookie已删除"; } ?> </dody> </html>
六、PHP Session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的。
您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。
PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
示例(PHP Session 实现一个页面的访问量记录):
<?php session_start();//开始存储session数据?> <html> <head> <title>PHP高级教程</title> </head> <body> <?php if(isset($_SESSION['views'])) { $_SESSION['views']=$_SESSION['views']+1; } else { $_SESSION['views']=1; } echo "浏览量:".$_SESSION['views']; //session的销毁 if(isset($_SESSION['views'])) { unset($_SESSION['views']);//unset() 函数用于释放指定的 session 变量 } //session_destroy();//也可以通过调用 session_destroy() 函数彻底销毁 session //session_destroy() 将重置 session,您将失去所有已存储的 session 数据。 ?> </body> </html>
七、PHP 错误处理
在创建脚本和 Web 应用程序时,错误处理是一个重要的部分。如果您的代码缺少错误检测编码,那么程序看上去很不专业,也为安全风险敞开了大门。
3种不同的错误处理方法:
- 简单的 "die()" 语句
- 自定义错误和错误触发器
- 错误报告
1、die()语句处理
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>
2、自定义错误处理
创建一个自定义的错误处理器非常简单。我们很简单地创建了一个专用函数,可以在 PHP 中发生错误时调用该函数。该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context)。
error_function(error_level,error_message, error_file,error_line,error_context)
参数 | 描述 |
---|---|
error_level | 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。 |
error_message | 必需。为用户定义的错误规定错误消息。 |
error_file | 可选。规定错误发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
3、错误记录
在默认的情况下,根据在 php.ini 中的 error_log 配置,PHP 向服务器的记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。
八、PHP 异常处理
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
- 当前代码状态被保存
- 代码执行被切换到预定义(自定义)的异常处理器函数
- 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
我们将展示不同的错误处理方法:
- 异常的基本使用
- 创建自定义的异常处理器
- 多个异常
- 重新抛出异常
- 设置顶层异常处理器
注释:异常应该仅仅在错误情况下使用,而不应该用于在一个指定的点跳转到代码的另一个位置。
要避免出现的错误,我们需要创建适当的代码来处理异常。
适当的处理异常代码应该包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。
异常的规则:
- 需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
- 每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
- 使用多个 catch 代码块可以捕获不同种类的异常。
- 可以在 try 代码块内的 catch 代码块中抛出(再次抛出)异常。
简而言之:如果抛出了异常,就必须捕获它。