■ require 与 include :
require('文件路径');
——用于调用并运行 必须的 文件,若处理失败会导致一个 FatalError 。
include('文件路径');
——用于调用并运行 非必须的 文件,若处理失败会产生一个 warning 。
■ require 与 require_once 的区别:
遇到 require 立即包含文件,而遇到 require_once 会判断是否已经包含过了,如果包含过了就不再包含文件。
使用 require_once 有两个好处:
1. 可以节省资源;
2. 可以避免重复定义的错误。
但 require_once 需要检查已加载的文件,所以效率稍低。
include 与 include_once 的区别同上。
一般情况下,我们最常用的就是 require_once();
■ PHP 的 错误处理 与 异常处理:
一、错误处理:
PHP处理错误的方式:
① 简单的 die() 或 exit() 语句;
② 错误处理器 和 错误触发器;
③ 错误日志;
1. 使用简单的 die() 语句实现,例如:
if(!file_exists("aaa.txt")){
die('文件不存在!');
}else{
}
或:
file_exists("aaa.txt") || die('文件不存在!');
2. 创建错误处理器 和 调用错误触发器:
● 创建错误处理器的一般形式如下:
function 错误处理器名($错误级别,$错误信息){
}
★注意:在使用错误处理器时,系统会自动为其给予指定的参数,其中“错误级别”与“错误信息”这两个参数项为必须项。剩下的可选参数有:
表示发生错误的文件名;
表示发生错误的行号;
一个数组,包含了发生错误的每个变量 和 这些变量的值。
★使用已创建的错误处理器的一般形式如下:
set_error_handler("错误处理器名",错误级别常量);
注意:错误级别常量是系统规定的常量,不要加上引号。
错误级别常量:
值
常量
描述
2
E_WARNING
非致命的 run-time 错误。
8
E_NOTICE
run-time 通知。
256
E_USER_ERROR
致命的,用户生成的错误。
512
E_USER_WARNING
非致命的用户警告。
1024
E_USER_NOTICE
用户通知。
4096
E_RECOVERABLE_ERROR
可捕获的致命错误。
8191
E_ALL
所有错误和警告。
● 使用错误触发器:(用于自定义逻辑上的错误)
例如,输入一个薪水,如果小于3000,我们就认为是个错误,代码如下:
$pay = 2999;
if($pay < 3000){
//调用 错误触发器 :
trigger_error("薪水异常",错误级别常量);
}
3. 错误日志:
默认地,根据在 php.ini 中的 error_log 配置,PHP向服务器的错误记录系统 或 文件发送错误记录。
★通过使用 error_log() 函数,您可以向 指定的文件 或 远程目的地 发送错误记录。
一般使用格式:
error_log($放有错误信息的变量."\r\n",3,"目的地路径");
★输出当前日期和时间:
//默认时区是 UTC ,与我们国家相差8小时。
//设置时区有两种方法:①通过函数设置;②在 php.ini 中设置。
//通过函数设置时区:
date_default_timezone_set("PRC");
//输出日期、时间:
echo date("Y-m-d G:i:s");
在错误日志中增加日期、时间:
date_default_timezone_set("PRC");
error_log("时间是".date("Y-m-d G:i:s")."——".$放有错误信息的变量."\r\n",3,"目的地路径");
二、异常处理:
★这里的‘异常’,指的是开发者自定义的‘异常’,而非语法上的错误。
异常处理用于在开发者规定的‘异常’发生时,改变脚本的正常流程。
基本语法:
try {
// 可能会抛出异常的代码。
}catch(Exception $e){
// 捕获异常,并进行处理。
}
注意:Exception 是所有异常的基类。【?】
$error = new Exception("异常的信息"); //实例化异常类 并 设置“异常信息”。
throw $error; //抛出异常!
例如:
function checkNum($v){
if($v > 100){
throw new Exception("数据过大!"); //实例化异常类 并 抛出异常。
}else{
echo "数据正常";
}
}
try{
checkNum(300);
}catch(Exception $e){
echo $e->getMessage(); //异常类的成员方法之一,作用是返回异常信息。
}
异常类中的成员方法:
getMessage()
作用:返回异常信息。
getCode()
作用:返回异常代码。
getFile()
作用:返回发生异常的文件。
getLine()
作用:返回发生异常的行号。
getTrace()
backtrace()数组。
getTraceAsString()
已格式化的 backtrace()数组信息。
注意:
① 通过使用异常处理,可以更有效的控制错误,所以在开发中大量的使用异常处理;
② 当捕获到一个异常后,try{}块里的后续代码不再继续执行,但会继续执行try{}块外的后续代码;
③ 如果发生了一个异常,但是你没有捕获(catch),则系统会提示一个 Uncatched Exception ;
④ 当捕获(catch)到一个异常,你可以处理,也可以不处理,不处理就可以再把它抛出 throw new Exception("……");
例如:
function checkNum($v){
if($v > 100){
throw new Exception("数据过大!"); //实例化异常类 并 抛出异常。
}else{
echo "数据正常";
}
}
try{
checkNum(300);
}catch(Exception $e){
throw $e; //再抛出。
}
⑤ 可以自定义异常类,例如:
class MyException extends Exception {
}
⑥ 可以使用多个 catch{} 代码块来捕获不同种类的异常,例如:
try{
//代码……
}catch(PDO Exception $e){
//第一类异常
}catch(Exception $e){
//第二类异常
}
⑦ 如果没有抛出异常(throw),就捕获不了异常。
⑧ 在设置“异常信息”时 还可以设置“异常代码”,所以我们可以为自己的网站规定一套专用的异常代码,实现代码如下:
// 在实例化异常类时:
throw new Exception('异常信息',异常代码); //异常代码默认为 0 。
● 设置顶层异常处理器:
例如:
//创建一个顶层异常处理器:
function my_exception($e){
echo "我是新的顶层异常处理器。".$e->getMessage();
}
//设置顶层异常处理器:
set_exception_handler("my_exception");
function checkNum($v){
if($v > 100){
throw new Exception("数据过大!"); //实例化异常类 并 抛出异常。
}else{
echo "数据正常";
}
}
try{
checkNum(300);
}catch(Exception $e){
/* 当捕获到异常后,可以继续抛出,这时将会通过 PHP 默认的顶层异常处理器 来进行处理。*/
throw $e; //再抛出。
}
■ 关闭 PHP 中 Warning 级别的提示(即 例如 Warning:………… ):
方法一:
在 php.ini 文件中找到 error_reporting
追加 & ~E_WARNING 例如:error_reporting = E_ALL & ~E_WARNING
方法二:
在你想禁止 Warning 提示的页面中加入下面的代码:
error_reporting(E_ALL ^ E_WARNING);
方法三:
调用函数时,在函数名前面加上 @ ,例如:
$v = @函数名();
如果想 关闭 Notice 级别的提示 只要将上面代码中的 E_WARNING 改为 E_NOTICE 即可。
■ PHP 的 预定义变量(包括 超级全局数组变量):
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV /* getenv() */
■ PHP 的 魔术方法:
(☆ PHP 的 魔术方法 都是 当某种情况发生时会 自动触发 的方法。)
__construct()
构造方法
__destruct()
析构方法
__call()
__get()
__set()
__clone()
__autoload()
__tostring()
__sleep()
__wakeup()
__isset()
__unset()
■ PHP 的 魔术常量:(可以直接使用)
__FILE__
代表当前文件的绝对路径。
__LINE__
代表当前语句的行数。
__FUNCTION__
代表当前函数。
__CLASS__
代表当前类。
__DIR__
代表文件所在的目录,它等价于 dirname(__FILE__) 。
__METHOD__
__NAMESPACE__
__TRAIT__