error & exception & filter
>error错误处理
>>基本错误处理die(“错误反馈字符串”),能终止当前脚本的执行
[php] view plain
copy
<span style=”font-size:14px;”><?php
if(!file_exists(“welcome.txt”))
{
die(“File not found”);
}
else
{
$file=fopen(“welcome.txt”,”r”);
}
?></span>
>>自定义函数处理错误
>>错误记录
>exception异常处理
>>可能的处理方式:
保存代码退出脚本执行
切换到预先定义好的异常处理函
重新执行代码或者从代码另外的位置继续执行脚本
>>异常的基本使用
步骤:抛出异常 - 捕获异常(对异常进行匹配) - 处理异常
[php] view plain
copy
<span style=”font-size:14px;”><?php
//create function with an exception
function checkNum($number)
{
if($number>1)
{
throw new Exception(“Value must be 1 or below”);
}
return true;
}
//trigger exception
checkNum(2);
?></span>
//其中使用throw new Exception(“Value must be 1 or
below”)抛出了异常,但没有查找到匹配模块,出现致命错误。
>>异常抛出的完整过程及其解释
try 异常函数位于try代码块内进行检测
throw 每一个throw对应一个catch
catch 捕获异常,创建一个包含异常信息的对象
[php] view plain
copy
<span style=”font-size:14px;”><?php
//创建可抛出一个异常的函数
function checkNum($number)
{
if($number>1)
{
<span style=”color:#ff0000;”>throw new Exception(“Value must be 1
or below”);//想当于创建了一个新的对象,其中“”是构造函数的参数。</span>}
return true;
}
//在 “try” 代码块中触发异常
try
{
checkNum(2);
//If the exception is thrown, this text will not be shown
echo ‘If you see this, the number is 1 or below’;
}
//捕获异常
<span style=”color:#ff0000;”>catch(Exception $e)</span>
{
echo ‘Message: ‘ .$e->getMessage();
}
?></span>
创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。
在 “try” 代码块中调用 checkNum() 函数。
checkNum() 函数中的异常被抛出
“catch” 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。
通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息
//这里exception就是一个类的定义,可以定义相应的对象,然后内部有函数如gerMessage()可以返回异常信息。
>>自定义的exception类(同样存在继承关系)
[php] view plain
copy
<span style=”font-size:14px;”><span style=”color:#ff0000;”>class
customException extends Exception//注意继承类的定义</span>{
public function errorMessage()
{
//error message
$errorMsg = ‘Error on line ‘.$this->getLine().’ in ‘.$this->getFile()
.’: <b>‘.$this->getMessage().’</b> is not a valid E-Mail address’;
return $errorMsg;
}
}
$email = “someone@example…com”;
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}</span>
系统中exception类的内部函数有getLine() 、 getFile()、 getMessage()
>>多个异常的处理
用不同的异常处理类来捕获不同的异常。
>>重新抛出异常
用不同的异常处理类,一个类执行时,向另一个类抛出异常。
>>设置顶层异常处理器
set_exception_handler()设置处理所有未捕获异常的用户定义函数
//当没有异常抛出时硬要抛出一个异常,来显示我定义了某个函数。
>>异常处理规则
需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
使用多个 catch
代码块可以捕获不同种类的异常。不同的异常,就是属于不同的异常类,有多少种异常,就应该定义多少种类。可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
>filter过滤器(错误处理部分的过滤器没看懂)
用于过滤非安全来源的数据
验证和过滤用户输入或自定义数据是任何web应用程序的重要组成部分
设计PHP的过滤器扩展的目的是是数据过滤更轻松快捷
目的:数据类型匹配(来自外部数据和内部要求)
>>过滤函数
filter_var() - 通过一个指定的过滤器来过滤单一的变量
filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
filter_input - 获取一个输入变量,并对它进行过滤
filter_input_array -
获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤filter_has_var() - 判断变量是否存在
filter_id()
filter_list()
>>过滤器
FILTER_CALLBACK //调用用户自定义的函数过滤数据
sanitize:净化,表示对检测的数据进行处理
FILTER_SANITIZE_ENCODED //去除编码的特殊符号
FILTER_SANITIZE_SPECIAL_CHARS //html转义字符,ascII小于32的字符
FILTER_SANITIZE_STRING //去除标签和编码的特殊字符
FILTER_SANITIZE_EMAIL //去除非email字符
FILTER_SANITIZE_URL //去除非URL字符
FILTER_SANITIZE_NUMBER_INT //保留数字和加减号
FILTER_SANITIZE_NUMBER_FLOAT //保留浮点字符
FILTER_SANITIZE_MAGIC_QUOTERS //应用addslash()不是很明白
balidate:确定,验证用户输入,严格的格式规则
FILTER_VALIDATE_INT //确定整型
FILTER_VALIDATE_VOOLEAN//确定布尔型
FILTER_VALIDATE_FLOAT//确定浮点型
FILTER_VALIDATE_URL//确定合法URL
FILTER_VALIDATE_EMAIL//确定邮件
FILTER_VALIDATE_IP//确定ip地址
>>不同的过滤器有不同的选项和标志
//所以说每次在使用前,去找本参考手册好好看看。网站上的并不全面。
//FILTER_VALIDATE_INT的参数就是一个嵌套数组
[php] view plain
copy
<span style=”font-size:14px;”><?php
$var=300;
$int_options = array(
“options”=>array
(
“min_range”=>0,
“max_range”=>256
)
);
if(!filter_var($var, FILTER_VALIDATE_INT, $int_options))
{
echo(“Integer is not valid”);
}
else
{
echo(“Integer is valid”);
}
?></span>
>>验证输入filter_input(INPUT_GET, “email”,FILTER_VALIDATE_EMAIL)
[php] view plain
copy
<span style=”font-size:14px;”><?php
if(!filter_has_var(INPUT_GET, “email”))
{
echo(“Input type does not exist”);
}
else
{
<span style=”color:#ff0000;”> if (!filter_input(INPUT_GET, “email”,
FILTER_VALIDATE_EMAIL))//不是很明白INPUT_GET的意思,难道是超全局变量?</span>{
echo “E-Mail is not valid”;
}
else
{
echo “E-Mail is valid”;
}
}
?></span>
>>净化输入filter_input(INPUT_POST, “URL”, FILTER_SANITIZE_URL)
[php] view plain
copy
<span style=”font-size:14px;”><?php
if(!filter_has_var(INPUT_POST, “url”))
{
echo(“Input type does not exist”);
}
else
{
$url = filter_input(INPUT_POST, “url”, FILTER_SANITIZE_URL);
}
?></span>
>>过滤多个输入
[php] view plain
copy
<span style=”font-size:14px;”><?php
$filters = array
(
“name” => array
(
“filter”=>FILTER_SANITIZE_STRING
),
“age” => array
(
“filter”=>FILTER_VALIDATE_INT,
“options”=>array
(
“min_range”=>1,
“max_range”=>120
)
),
“email”=> FILTER_VALIDATE_EMAIL,
);
$result = filter_input_array(INPUT_GET, $filters);
if (!$result[“age”])
{
echo(“Age must be a number between 1 and 120.<br />“);
}
elseif(!$result[“email”])
{
echo(“E-Mail is not valid.<br />“);
}
else
{
echo(“User input is valid”);
}
?></span>
设置一个数组,其中包含了输入变量的名称,以及用于指定的输入变量的过滤器
调用 filter_input_array 函数,参数包括 GET 输入变量及刚才设置的数组
检测 $result 变量中的 “age” 和 “email”
变量是否有非法的输入。(如果存在非法输入,)
>>使用filter callback,自定义函数过滤器
将下划线装换为空格
[php] view plain
copy
<span style=”font-size:14px;”><?php
function convertSpace($string)
{
return str_replace(“_”, “ “, $string);
}
$string = “Peter_is_a_great_guy!”;
echo filter_var($string, FILTER_CALLBACK,
array(“options”=>“convertSpace”));?></span>




