無聊的週五晚上

  hiphp

如今是週五,的晚上,由於回寢室也彷佛沒什麼事情作,不如在教研室水一水。html

一、PHPweb

---Cookie---數據庫

--設置Cookie:ubuntu

PHP設置Cookie最經常使用的方法就是使用setcookie函數,setcookie具備7個可選參數,咱們經常使用到的爲前5個:數組

name( Cookie名)能夠經過$_COOKIE['name'] 進行訪問
value(Cookie的值)
expire(過時時間)Unix時間戳格式,默認爲0,表示瀏覽器關閉即失效
path(有效路徑)若是路徑設置爲'/',則整個網站都有效
domain(有效域)默認整個域名都有效,若是設置了'www.imooc.com',則只在www子域中有效瀏覽器

PHP中還有一個設置Cookie的函數setrawcookie,setrawcookie跟setcookie基本同樣,惟一的不一樣就是value值不會自動的進行urlencode,所以在須要的時候要手動的進行urlencode。緩存

由於Cookie是經過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-Cookie段來進行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'] = 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月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月1日 00:00:00 到當前時間的秒數之和。

PHP提供了內置函數strtotime實現功能:獲取某個日期的時間戳,或獲取某個時間的時間戳。例如:

echo strtotime('2014-04-29');//1398700800,這個數字表示從1970年1月1日 00:00:00 到2014年4月29號經歷了1398700800秒 echo strtotime('2014-04-29 00:00:01');//1398700801,這個數字表示從1970年1月1日 00:00:00 到2014-04-29 00:00:01時經歷了1398700801秒 你們發現上面的規律了嗎,其實strtotime('2014-04-29')至關於strtotime('2014-04-29 00:00:00')
--

將格式化的日期字符串轉換爲Unix時間戳

strtotime函數預期接受一個包含美國英語日期格式的字符串並嘗試將其解析爲 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 由於格林威治時間是如今中國時區的時間減去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/images/3/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中捕獲,不然會直接中斷。

 

一、基本語法
        try{
            //可能出現錯誤或異常的代碼
            //catch表示捕獲,Exception是php已定義好的異常類
        } catch(Exception $e){
            //對異常處理,方法:
                //一、本身處理
                //二、不處理,將其再次拋出
        }
二、處理處理程序應當包括:
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 '異常處理後,繼續執行其餘代碼';

--

獲取錯誤發生的所在行

在異常被捕獲以後,咱們能夠經過異常處理對象獲取其中的異常信息,前面咱們已經瞭解捕獲方式,以及獲取基本的錯誤信息。

在實際應用中,咱們一般會獲取足夠多的異常信息,而後寫入到錯誤日誌中。

經過咱們須要將報錯的文件名、行號、錯誤信息、異常追蹤信息等記錄到日誌中,以便調試與修復問題。

<?phptry { 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);}

相關文章
相關標籤/搜索