百无聊赖的周五夜间

  hi

后天是周日,的夜间,因为回寝室也就像没什么事情做,不如在教研室水一水。

1、PHP

—Cookie—

–设置Cookie:

PHP设置Cookie最常用的点子就是选用setcookie函数,setcookie具有7个可选参数,大家常用到的为前5个:

name( 库克ie名)可以通过$_COOKIE[‘name’] 进行访问
value(Cookie的值)
expire(过期日子)Unix时间戳格式,默许为0,表示浏览器关闭即失效
path(有效路径)若是路径设置为’/’,则全部网站都使得
domain(有效域)默许整个域名都使得,若是设置了’www.imooc.com’,则只在www子域中有效

PHP中还有一个设置Cookie的函数setrawcookie,setrawcookie跟setcookie基本一致,唯一的不比就是value值不会活动的展开urlencode,因而在要求的时候要手动的拓展urlencode。

因为库克(Cook)ie是透过HTTP标头举办安装的,所以也能够平昔运用header方法进行安装。

<?php
$value = time();
//在那边安装一个名为test的Cookie
setcookie(“test”,$value);
if (isset($_COOKIE[‘test’])) {
echo ‘success’;
}

–删除cookie

经过前边的章节,大家询问了安装cookie的函数,可是我们却发现php中绝非删除Cookie的函数,在PHP中去除cookie也是应用setcookie函数来落到实处。

setcookie(‘test’, ”, time()-1);

可以寓目将cookie的过期时间设置到目明日子从前,则该cookie会自动失效,也就落成了去除cookie的目标。之所以这么设计是因为cookie是由此HTTP的标头来传递的,客户端依据服务端再次来到的Set-库克(Cook)ie段来拓展cookie的安装,借使去除cookie须要利用新的Del-Cookie来兑现,则HTTP头就会变得复杂,实际上仅通过Set-Cookie就足以简单明了的完成Cookie的装置、更新与删除。

刺探原理未来,大家也足以向来通过header来删除cookie。

测试删除成功后,输出为

array(0) {
}

–cookie的管用路径

cookie中的路径用来控制装置的cookie在哪个路径下有效,默许为’/’,在装有路线下都有,当设定了其余路线之后,则只在设定的途径以及子路径下有效,例如:

setcookie(‘test’, time(), 0, ‘/path’);

上边的安装会使test在/path以及子路径/path/abc下都使得,可是在根目录下就读取不到test的cookie值。

相似景色下,大多是选拔具有路线的,唯有在极少数有万分要求的时候,会设置路径,这种状态下只在指定的门道中才会传递cookie值,可以省去多少的传导,增强安全性以及加强性能

当大家设置了卓有功效路径的时候,不在当前路线的时候则看不到当前cookie。

<?php
//补充路径参数,落成有效路径的设置
setcookie(‘test’, ‘1’, 0,’/path’);
var_dump($_COOKIE[‘test’]);

输出为NULL

–session(会话)和cookie

cookie将数据存储在客户端,建立起用户与服务器之间的关系,平常可以解决许多题材,但是cookie照旧拥有局地受制:

cookie相对不是太安全,不难被盗用导致cookie欺骗
单个cookie的值最大不得不存储4k
老是请求都要拓展网络传输,占用带宽

session是将用户的对话数据存储在服务端,没有轻重限制,通过一个session_id举办用户识别,PHP默许情状下session
id是经过cookie来保存的,因而从某种程度上的话,seesion依赖于cookie。但那不是相对的,session
id也得以因而参数来兑现,只要能将session
id传递到服务端举行识其余体制都足以应用session。

–使用session

在PHP中接纳session相当不难,先举办session_start方法开启session,然后经过全局变量$_SESSION进行session的读写。

session_start(); $_SESSION[‘test’] = time(); var_dump($_SESSION);

session会自动的对要设置的值举办encode与decode,由此session可以协理任意数据类型,包括数据与目的等。

session_start(); $_SESSION[‘ary’]C语言, = array(‘name’ => ‘jobs’);
$_SESSION[‘obj’] = new stdClass(); var_dump($_SESSION);

默许景况下,session是以文件情势储存在服务器上的,因而当一个页面打开了session之后,会独占那么些session文件,那样会造成当前用户的别样并发访问不能推行而等待。可以运用缓存或者数据库的款式储存来缓解那一个问题,那些大家会在部分高档的课程中讲到。

注意:session_start是个函数

–删除与销毁session

剔除某个session值可以动用PHP的unset函数,删除后就会从全局变量$_SESSION中去除,不能访问。

session_start(); $_SESSION[‘name’] = ‘jobs’;
unset($_SESSION[‘name’]); echo $_SESSION[‘name’]; //提示name不存在

若是要去除所有的session,可以拔取session_destroy函数销毁当前session,session_destroy会删除所有数据,不过session_id依旧存在。

session_start(); $_SESSION[‘name’] = ‘jobs’; $_SESSION[‘time’] =
time(); session_destroy();

值得注意的是,session_destroy并不会立时的灭绝全局变量$_SESSION中的值,唯有当下次再拜访的时候,$_SESSION才为空,由此只要急需立刻销毁$_SESSION,可以选拔unset函数。

session_start(); $_SESSION[‘name’] = ‘jobs’; $_SESSION[‘time’] =
time(); unset($_SESSION); session_destroy(); var_dump($_SESSION);
//此时已为空

万一必要同时灭绝cookie中的session_id,平时在用户退出的时候恐怕会用到,则还须要显式的调用setcookie方法删除session_id的cookie值。

–使用session来存储用户的登录音信

session可以用来储存多系列型的多少,因而所有许多的用途,常用来存储用户的记名新闻,购物车数据,或者局地临时使用的暂存数据等。

用户在签到成功之后,平时可以将用户的音讯存储在session中,一般的会独自的将部分至关首要的字段单独存储,然后所有的用户音讯独立存储。

$_SESSION['uid'] = $userinfo['uid'];
$_SESSION['userinfo'] = $userinfo;

诚如的话,登录音信既可以储存在sessioin中,也得以储存在cookie中,他们中间的出入在于session可以一本万利的存取多种数据类型,而cookie只协理字符串类型,同时对于有些安全性相比较高的数码,cookie须求展开格式化与加密存储,而session存储在服务端则安全性较高。

 

<?php
session_start();
//假如用户登录成功博得了以下用户数量
$userinfo = array(
‘uid’ => 10000,
‘name’ => ‘spark’,
’email’ => ‘spark@imooc.com’,
‘sex’ => ‘man’,
‘age’ => ’18’
);
header(“content-type:text/html; charset=utf-8”);

/* 将用户新闻保存到session中 */
$_SESSION[‘uid’] = $userinfo[‘uid’];
$_SESSION[‘name’] = $userinfo[‘name’];
$_SESSION[‘userinfo’] = $userinfo;
echo “welcome “.$_SESSION[‘name’] . ‘<br>’;

//* 将用户数据保存到cookie中的一个大致方法 */
$secureKey = ‘imooc’; //加密密钥
$str = serialize($userinfo); //将用户消息种类化
echo “用户音讯加密前:”.$str;
$str = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secureKey,
$str, MCRYPT_MODE_ECB));
echo “用户新闻加密后:”.$str;
//将加密后的用户数据存储到cookie中
setcookie(‘userinfo’, $str);

//当要求运用时进行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secureKey,
base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo “解密后的用户音信:<br>”;
var_dump($uinfo);

–总结

setcookie(),setsession(),unset()

 

—-文件系统—-

–读取文件内容

PHP具有丰硕的文书操作函数,最简便的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中。

$content = file_get_contents(‘./test.txt’);

file_get_contents也足以由此参数控制读取内容的上马点以及长度。

$content = file_get_contents(‘./test.txt’, null, null, 100, 500);

PHP也提供类似于C语言操作文件的法门,使用fopen,fgets,fread等办法,fgets可以从文件指针中读取一行,freads可以读取指定长度的字符串。

$fp = fopen(‘./text.txt’, ‘rb’); while(!feof($fp)) { echo fgets($fp);
//读取一行 } fclose($fp);

 

$fp = fopen(‘./text.txt’, ‘rb’); $contents = ”; while(!feof($fp)) {
$contents .= fread($fp, 4096); //三回读取4096个字符 } fclose($fp);

行使fopen打开的文书,最好使用fclose关闭文件指针,以防止文件句柄被占用。

–判断文件是不是留存、可读、可写

相似情形下在对文本进行操作的时候供给先判断文件是还是不是存在,PHP中常用来判断文件存在的函数有四个is_file与file_exists.

$filename = ‘./test.txt’; if (file_exists($filename)) { echo
file_get_contents($filename); }

假诺只是一口咬定文件存在,使用file_exists就行,file_exists不仅可以判明文件是或不是留存,同时也可以看清目录是还是不是存在,从函数名可以观看,is_file是合适的判定给定的路径是或不是是一个文本。

$filename = ‘./test.txt’; if (is_file($filename)) { echo
file_get_contents($filename); }

越来越准确的可以运用is_readable与is_writeable在文件是或不是存在的根基上,判断文件是不是可读与可写。

$filename = ‘./test.txt’; if (is_writeable($filename)) {
file_put_contents($filename, ‘test’); } if (is_readable($filename)) {
echo file_get_contents($filename); }
–写入内容

与读取文件对应,PHP写文件也有着二种方法,最简易的法门是使用file_put_contents。

$filename = ‘./test.txt’; $data = ‘test’; file_put_contents($filename,
$data);

上例中,$data参数可以是一个一维数组,当$data是数组的时候,会活动的将数组连接起来,相当于$data=implode('', $data);

同样的,PHP也匡助类似C语言风格的操作形式,接纳fwrite举行文件写入。

$fp = fopen(‘./test.txt’, ‘w’);

fwrite($fp, ‘hello’);

fwrite($fp, ‘world’); fclose($fp);

–得到文件的改动时间

文件有广大元属性,包蕴:文件的主人、创制时间、修改时间、最终的访问时间等。

fileowner:获得文件的所有者
filectime:获取文件的创建时间
filemtime:获取文件的修改时间
fileatime:获取文件的访问时间

个中最常用的是文件的修改时间,通过文件的改动时间,可以断定文件的时效性,平日用在静态文件或者缓存数据的换代。

$mtime = filemtime($filename);
echo '修改时间:'.date('Y-m-d H:i:s', filemtime($filename));

<?php
$filename = ‘/data/webroot/usercode/code/resource/test.txt’;
echo ‘所有者:’.fileowner($filename).'<br>’;
echo ‘创造时间:’.filectime($filename).'<br>’;
echo ‘修改时间:’.filemtime($filename).'<br>’;
echo ‘最终访问时间:’.fileatime($filename).'<br>’;

//给$mtime赋值为文件的修改时间
$mtime = filemtime($filename);
//通过测算时间差 来判定文件内容是不是可行
if (time() – $mtime > 3600) {
echo ‘<br>缓存已过期’;
} else {
echo file_get_contents($filename);
}

–获得文件的轻重缓急

通过filesize函数可以得到文件的尺寸,文件大小是以字节数表示的。

$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);

即使要更换文件大小的单位,可以协调定义函数来落到实处。

function getsize($size, $format = 'kb') {
    $p = 0;
    if ($format == 'kb') {
        $p = 1;
    } elseif ($format == 'mb') {
        $p = 2;
    } elseif ($format == 'gb') {
        $p = 3;
    }
    $size /= pow(1024, $p);
    return number_format($size, 3);
}

$filename = '/data/webroot/usercode/code/resource/test.txt';
$size = filesize($filename);

$size = getsize($size, 'kb'); //进行单位转换
echo $size.'kb';

值得注意的是,没办法通过简单的函数来获取目录的尺寸,目录的深浅是该目录下所有子目录以及文件大小的总额,因而须要经过递归的法门来循环统计目录的高低。

–删除文件

跟Unix系统命令类似,PHP使用unlink函数进行文件删除。

unlink($filename);

去除文件夹使用rmdir函数,文件夹必须为空,假诺不为空或者没有权限则会唤起失利。

rmdir($dir);

比方文件夹中设有文件,可以先循环删除目录中的所有文件,然后再删除该目录,循环删除可以采纳glob函数遍历所有文件。

foreach (glob("*") as $filename) {
   unlink($filename);
}

–总结

file_get_contents(),file_exists(),is_file(),is_writeable(),is_readable()

file_put_contents(),filemtime(),filesize(),unlink()

—日期和时间—

–得到当前的Unix时间戳

UNIX 时间戳(英文名叫:timestamp)是 PHP
中关于时间与日期的一个很主要的概念,它象征从 1970年七月1日 00:00:00
到当前时光的秒数之和。

PHP提供了内置函数 time()
来取得服务器当前光阴的光阴戳。那么获取当前的UNIX时间戳就很简短了。

$time = time();

echo $time;//1396193923,这个数字表示从1970年1月1日 00:00:00 到我输出这个脚本时经历了1396193923秒

时间戳,表示时间点

获得当前的日期

php内置了date()函数,来获取当前的日子。

函数表明:date(时间戳的格式, 规定时间戳【默许是当前的日期和时间,可选】)

再次来到值:函数日期和岁月

例子://date函数,第三个参数取默许值的意况

*echo date(“Y-m-d”);//2014-03-30 //date函数,第三个参数有值的气象 echo
date(“Y-m-d”,’1396193923′);//2014-03-30,1396193923意味2014-03-30的unix时间戳–


收获日期的Unix时间戳

UNIX 时间戳(英文名叫:timestamp)是 PHP
中关于时间与日期的一个很重点的概念,它意味着从 1970年十二月1日 00:00:00
到近来时间的秒数之和。

PHP提供了放置函数strtotime已毕效益:获取某个日期的岁月戳,或取得某个时间的时辰戳。例如:

echo strtotime(‘2014-04-29’);//1398700800,那个数字代表从1970年八月1日
00:00:00 到二零一四年七月29号经历了1398700800秒 echo strtotime(‘2014-04-29
00:00:01’);//1398700801,那些数字代表从1970年6月1日 00:00:00
到2014-04-29 00:00:01时经历了1398700801秒
大家发现下边的法则了啊,其实strtotime(‘2014-04-29’)相当于strtotime(‘2014-04-29

00:00:00′)

将格式化的日子字符串转换为Unix时间戳

strtotime函数预期接受一个分包美利坚合众国立陶宛(Lithuania)语日期格式的字符串并尝试将其分析为
Unix 时间戳。

函数表明:strtotime(要分析的时日字符串,
总结重临值的时日戳【默许是时下的日子,可选】)
重回值:成功则赶回时间戳,否则重回 FALSE

比如

echo
strtotime(“now”);//相当于将英文单词now直接等于现在的日期和时间,并把那些日丑时间转载为unix时间戳。那么些效应跟echo
time();一样。 echo strtotime(“+1
seconds”);//相当于将现行的日子和时间增加了1秒,并把这一个日卯时间转载为unix时间戳。那一个职能跟echo
time()+1;一样。 echo strtotime(“+1
day”);//相当于将现在的日子和时间增进了1天。 echo strtotime(“+1
week”);//相当于将现行的日子和时间增进了1周。 echo strtotime(“+1 week 3
days 7 hours 5

seconds”);//相当于将现在的日期和岁月累加了1周3天7钟头5秒。

格式化格林(格林)威治(GMT)标准时间

gmdate 函数能格式化一个GMT的日子和岁月,重临的是格林(格林)威治标准时(GMT)。

举个例子,我们现在各处的中国时区是东八区,超过格林威治时间8个时辰,有时候也叫GMT+8,那么服务器运行以下脚本重临的年华应当是那般的:
当后天子一旦是2014-05-01 15:15:22 echo date(‘Y-m-d H:i:s’, time());
//输出为:2014-05-01 15:15:22 echo gmdate(‘Y-m-d H:i:s’, time());
//输出为:2014-05-01 07:15:22
因为格林(Green)威治时间是现行中华时区的时刻减去8个时辰,所以相对于明天日子要少8个钟头

—-图形图像操作—-
–GD库
Graphic
Device,PHP的GD库是用来拍卖图片的拓展库;常用来处理加水印和生成验证码的操作

PHP默许安装了GD库,安装的时候需要打开

绘制线条

要对图纸举办操作,首先要新建一个画布,通过imagecreatetruecolor函数可以创设一个真彩色的空域图片:

$img = imagecreatetruecolor(100, 100);

GD库中对于画笔所用的水彩,必要经过imagecolorallocate函数举办分配,通过参数设定RGB的颜色值来规定画笔的颜色:

$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

下一场大家通过调用绘制线段函数imageline进行线条的绘图,通过点名源点跟终点来最终赢得线条。

imageline($img, 0, 0, 100, 100, $red);

线条绘制好将来,通过header与imagepng举办图像的出口。

header("content-type: image/png");
imagepng($img);

最终可以调用imagedestroy释放该图形占用的内存。

imagedestroy($img);

因而地点的步骤,可以发现PHP绘制图形至极的简练,但为数不少时候我们不光是内需输出图片,可能大家还须求取得一个图片文件,可以因而imagepng函数指定文件名将绘制后的图像保存到文件中。

imagepng($img, 'img.png');

<?php
$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);
//在那里运用imageline绘制线条
imageline($img,0,10,90,80,$red);
header(“content-type: image/png”);
imagepng($img);
imagedestroy($img);

在图像中绘制文字

GD库可以拓展多种图形的基本操作,常用的有绘制线条,背景填充,画矩形,绘制文字等。

跟绘制线条类似,首先要求新建一个图纸与伊始化颜色。

$img = imagecreatetruecolor(100, 100);
$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);

下一场使用imagestring函数来拓展文字的绘图,这么些函数的参数很多:imagestring
( resource $image , int $font , int $x , int $y , string $s , int $col
),可以因而$font来设置字体的大大小小,x,y设置文字显示的职位,$s是要绘制的文字,$col是文字的水彩。

imagestring($img, 5, 0, 0, "Hello world", $red);
header("content-type: image/png");
imagepng($img);
imagedestroy($img);
--

输出图像文件

前边大家已经领会到,通过imagepng可以一贯出口图像到浏览器,不过洋洋时候,大家期望将拍卖好的图像保存到文件,以便可以频仍拔取。通过点名路线参数将图像保存到文件中。

$filename = 'img.png';
imagepng($img, $filename);

应用imagepng能够将图像保存成png格式,假若要封存成别的格式必要动用分化的函数,使用imagejpeg将图纸保存成jpeg格式,imagegif将图片保存成gif格式,须求讲明的是,imagejpeg会对图纸展开削减,因而还足以安装一个质料参数。

$filename = 'img.jpg';
​imagejpeg($img, $filename, 80);

--

变化图像验证码

简言之的验证码其实就是在图纸中输出了多少个字符,通过我们面前章节讲到的imagestring函数就能兑现。

而是在处理上,为了使验证码尤其的平安,避免其余程序自动识别,因而日常须求对验证码举办部分干扰处理,平时会动用绘制一些噪点,干扰线段,对输出的字符举行倾斜、扭曲等操作。

可以应用imagesetpixel绘制点来落到实处噪点困扰,可是只绘制一个点的效率不大,由此那里平常会使用循环举办随机绘制。

<?php
$img = imagecreatetruecolor(100, 40);
$black = imagecolorallocate($img, 0x00, 0x00, 0x00);
$green = imagecolorallocate($img, 0x00, 0xFF, 0x00);
$white = imagecolorallocate($img, 0xFF, 0xFF, 0xFF);
imagefill($img,0,0,$white);
//生成随机的验证码
$code = ”;
for($i = 0; $i < 4; $i++) {
$code .= rand(0, 9);
}
imagestring($img, 5, 10, 10, $code, $black);
//参预噪点困扰
for($i=0;$i<50;$i++) {
imagesetpixel($img, rand(0, 100) , rand(0, 100) , $black);
imagesetpixel($img, rand(0, 100) , rand(0, 100) , $green);
}
//输出验证码
header(“content-type: image/png”);
imagepng($img);
imagedestroy($img);

给图片添加水印

给图片添加水印的措施一般有二种,一种是在图片下边加上一个字符串,另一种是在图纸上添加一个logo或者其他的图形。

因为此各处理的是早就存在的图形,所以可以直接从已存在的图样建立画布,通过imagecreatefromjpeg可以直接从图片文件创制图像。

$im = imagecreatefromjpeg($filename);

制造图像对象将来,大家就足以因此后面的GD函数,绘制字符串到图像上。假若要加的水印是一个logo图片,那么就必要再建立一个图像对象,然后经过GD函数imagecopy将logo的图像复制到源图像中。

$logo = imagecreatefrompng($filename);
imagecopy($im, $logo, 15, 15, 0, 0, $width, $height);

当将logo图片复制到原图片上从此,将加水印后的图片输出保存就完事了加水印处理。

imagejpeg($im, $filename);

<?php
//那里唯有是为着案例须求预备一些材料图片
$url =
http://www.iyi8.com/uploadfile/2014/0521/20140521105216901.jpg‘;
$content = file_get_contents($url);
$filename = ‘tmp.jpg’;
file_put_contents($filename, $content);
$url =
http://wiki.ubuntu.org.cn/3b/Qref\_Edubuntu\_Logo.png‘;
file_put_contents(‘logo.png’, file_get_contents($url));
//伊始添加水印操作
$im = imagecreatefromjpeg($filename);
$logo = imagecreatefrompng(‘logo.png’);
$size = getimagesize(‘logo.png’);
imagecopy($im, $logo, 15, 15, 0, 0, $size[0], $size[1]);

header(“content-type: image/jpeg”);
imagejpeg($im);

—–万分处理—–

抛出一个至极

从PHP5先河,PHP支持更加处理,分外处理是面向对象一个重点特色,PHP代码中的分外通过throw抛出,卓殊抛出之后,后边的代码将不会再被执行。

既然抛出卓殊会暂停程序执行,那么为何还索要利用越发处理?

不行抛出被用来在遇见未知错误,或者不符合预先设定的规则时,文告客户程序,以便进行别的有关处理,不至于使程序直接报错中断。

当代码中应用了try
catch的时候,抛出的要命会在catch中抓获,否则会一向中断。

 

1、基本语法
        try{
            //可能出现错误或特其他代码
            //catch表示捕获,Exception是php已定义好的要命类
        } catch(Exception $e){
            //对万分处理,方法:
                //1、自己处理
                //2、不处理,将其重新抛出
        }
2、处理处理程序应当包含:
Try – 使用特其余函数应该放在 “try”
 代码块内。假诺没有接触格外,则代码将照常继续执行。不过一旦那一个被触发,会抛出一个可怜。
Throw – 那里规定怎样触发相当。注意:每一个 “throw” 必须相应至少一个
“catch”,当然可以对应四个”catch”
Catch – “catch” 代码块会捕获非凡,并创办一个包涵相当音讯的对象。

//创建可抛出一个异常的函数
function checkNum($number){
     if($number>1){
         throw new Exception("异常提示-数字必须小于等于1");
     }
     return true;
 }

//在 "try" 代码块中触发异常
 try{
     checkNum(2);
     //如果异常被抛出,那么下面一行代码将不会被输出
     echo '如果能看到这个提示,说明你的数字小于等于1';
 }catch(Exception $e){
     //捕获异常
     echo '捕获异常: ' .$e->getMessage();
 }

地点代码将收获接近那样一个错误:

破获万分:: 卓殊提醒-数字必须低于等于1

事例解释:

上边的代码抛出了一个不胜,并抓获了它:

开创 checkNum() 函数。它检测数字是或不是超越 1。倘使是,则抛出一个那多少个。
在 “try” 代码块中调用 checkNum() 函数。
checkNum() 函数中的非常被抛出
“catch” 代码块接收到该尤其,并创设一个暗含格外音信的靶子 ($e)。
通过从这几个 exception 对象调用
$e->getMessage(),输出来自该特其他不当信息

<?php
$filename = ‘test.txt’;
try {
if (!file_exists($filename)) {
throw new Exception(‘文件不存在’);
}
} catch(Exception $e) {
echo $e->getMessage();
}

–万分处理类

PHP具有众多可怜处理类,其中Exception是富有越发处理的基类。

Exception具有几个基本特性与艺术,其中包涵了:

message 非凡音讯内容
code 至极代码
file 抛出很是的文书名
line 抛出极度在该公文的行数

个中常用的法子有:

getTrace 得到至极追踪音信
getTraceAsString 获取分外追踪音信的字符串
getMessage 得到出错音信

比方要求的话,可以通过继承Exception类来确立自定义的十分处理类。

//自定义的异常类,继承了PHP的异常基类Exception
class MyException extends Exception {
    function getInfo() {
        return '自定义错误信息';
    }
}

try {
    //使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
    throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
} catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
    echo $e->getInfo();//获取自定义的异常信息
    echo $e->getMessage();//获取继承自基类的getMessage信息
}

<?php
class MyException extends Exception {
function getInfo() {
return ‘自定义错误消息’;
}
}

try {
throw new MyException(‘error’);
} catch(Exception $e) {
echo $e->getInfo();
}

破获分外音讯

在明白了要命处理的基本原理之后,我们可以通过try
catch来捕获分外,我们将实施的代码放在try代码块中,一旦中间的代码抛出更加,就能在catch中抓获。

那边大家只是通过案例来打听try
catch的建制以及更加捕获的点子,在实际上利用中,不会随随便便的抛出分外,唯有在最好气象照旧更加首要的状态下,才会抛出非常,抛出非常,可以保证程序的不错与安全,避免造成不可预言的bug。

一般的可怜处理流程代码为:

try {
    throw new Exception('wrong');
} catch(Exception $ex) {
    echo 'Error:'.$ex->getMessage().'<br>';
    echo $ex->getTraceAsString().'<br>';
}
echo '异常处理后,继续执行其他代码';

<?php
try {
throw new Exception(‘wrong’);
} catch(Exception $ex) {
echo ‘Error:’.$ex->getMessage().'<br>’;
echo $ex->getTraceAsString().'<br>’;
}
echo ‘分外处理后,继续执行其他代码’;

得到错误发生的所在行

在老大被擒获之后,大家可以透过丰裕处理目的获得其中的丰盛音讯,前边大家已经精通捕获形式,以及得到基本的错误音讯。

在其实使用中,我们常见会得到丰盛多的不得了音信,然后写入到错误日志中。

透过大家须要将报错的公文名、行号、错误音讯、万分追踪新闻等记录到日志中,以便调试与修复问题。

<?php
try {
throw new Exception(‘wrong’);
} catch(Exception $ex) {
$msg = ‘Error:’.$ex->getMessage().”\n”;
$msg.= $ex->getTraceAsString().”\n”;
$msg.= ‘十分行号:’.$ex->getLine().”\n”;
$msg.= ‘所在文件:’.$ex->getFile().”\n”;
//将越发新闻记录到日志中
file_put_contents(‘error.log’, $msg);
}