- 相關(guān)推薦
php高級教程
導(dǎo)語:php是it行業(yè)語言,也是一門較熱的網(wǎng)絡(luò)技術(shù),下面就由小編為大家介紹一下php高級教程,歡迎大家閱讀!
一、PHP- 多維數(shù)組:
$cars = array(
array("huawei","12","11"),
array("meizu","23","12"),
array("iphone","12","4")
);
$title = array("手機總共有:","個,已經(jīng)賣出去了","個!");
for($i=0;$i{ for($j=0;$j { echo $cars[$i][$j]; echo $title[$j]; } echo " ";}?>
輸出:
huawei手機總共有:12個,已經(jīng)賣出去了11個!
meizu手機總共有:23個,已經(jīng)賣出去了12個!
iphone手機總共有:12個,已經(jīng)賣出去了4個!
二、PHP 日期和時間
date() 函數(shù)的格式參數(shù)是必需的,它們規(guī)定如何格式化日期或時間。
下面列出了一些常用于日期的字符:
·d - 表示月里的某天(01-31) D-表示當前這天的英文星期簡寫
·m - 表示月(01-12) M-表示當前月的英文縮寫
·Y - 表示年(四位數(shù)) y-表示年(后兩位數(shù))
·1 - 表示周里的某天 L-返回0
其他字符,比如 "/","." 或 "-" 也可被 插入字符中,以增加其他格式。
echo"今天是 " . date("YYYY/m/d") ." "; //2017201720172017/06/26 由此可見不能用js中yyyy-mm-dd的形式
echo"今天是 " . date("Y.m.d") . " "; //2017.06.26
echo"今天是 " . date("Y-M-D") . " "; //17-Jun-Mon
echo"今天是 " . date("l") . " "; //Monday 星期全稱
echo"今天是 " . date("L") . " "; //0
?>
獲得簡單的時間
下面是常用于時間的字符:
date_default_timezone_set("Asia/Shanghai"); //設(shè)置時區(qū)
echo date_default_timezone_get(oid);//獲取當前時區(qū)
·h - 帶有首位零的 12 小時小時格式 H-24小時格式
·i - 帶有首位零的分鐘 I-0
·s - 帶有首位零的秒(00 -59) S-返回th我也不知道是什么鬼
·a - 小寫的午前和午后(am 或 pm) A-返回大寫格式:AM或PM
echo"現(xiàn)在是 " . date("h:i:sa") . " "; //現(xiàn)在是 02:15:44pm
echo"現(xiàn)在是 " . date("H:I:SA") . " "; //現(xiàn)在是 14:0:thPM
通過 PHP mktime() 創(chuàng)建日期
date() 函數(shù)中可選的時間戳參數(shù)規(guī)定時間戳。如果您未規(guī)定時間戳,將使用當前日期和時間
語法
mktime(hour,minute,second,month,day,year)
$d=mktime(9,12, 31, 6, 10, 215) ;
echo"創(chuàng)建日期是 " . date("Y-m-d h:i:sa", $d) ." "; //在date方法里面?zhèn)鲄t取的是參數(shù)中的時間,如果不傳的話則取的是當前時間
通過 PHP strtotime() 用字符串來創(chuàng)建日期
PHP strtotime() 函數(shù)用于把人類可讀的字符串轉(zhuǎn)換為Unix 時間。
$d=strtotime("10:38pm April 15 2015");
echo "創(chuàng)建日期是 " . date("Y-m-d h:i:sa", $d);
如果輸入了它不能識別的字符串則保存為 1970-01-01 12:00:00am
計算兩個時間段內(nèi)的時間所有的周六
$startdate = strtotime("Saturday");
$enddate = strtotime("+6 weeks",$startdate);
while ($startdate < $enddate) {
echo date("M d", $startdate)," ";
$startdate = strtotime("+1 week", $startdate); //在$startdate基礎(chǔ)上加一個禮拜,你還可以加1天,1個月,1年
}
?>
計算距離某一天還有多長時間
$d1=strtotime("2017-7-30");
$d2=ceil(($d1-time())/60/60/24);
echo "距離十二月三十一日還有:" . $d2 ." 天。";
?>
三、PHP Cookies
cookie 常用于識別用戶。cookie 是服務(wù)器留在用戶計算機中的小文件。每當相同的計算機通過瀏覽器請求頁面時,它同時會發(fā)送 cookie。通過 PHP,您能夠創(chuàng)建并取回 cookie 的值。
創(chuàng)建cookie
setcookie() 函數(shù)用于設(shè)置 cookie。
注釋:setcookie() 函數(shù)必須位于
標簽之前。
語法
setcookie(name, value, expire, path, domain);
在下面的例子中,我們將創(chuàng)建名為 "user" 的 cookie,把為它賦值 "Alex Porter"。我們也規(guī)定了此 cookie 在一小時后過期:
setcookie("user", "Alex Porter", time()+3600);
?>
注釋:在發(fā)送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼(為防止 URL 編碼,請使用setrawcookie() 取而代之)。
取回 Cookie 的值
PHP 的 $_COOKIE 變量用于取回cookie 的值。
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
刪除 cookie當刪除 cookie 時,您應(yīng)當使過期日期變更為過去的時間點。
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>
如果瀏覽器不支持 cookie 該怎么辦?
如果您的應(yīng)用程序涉及不支持cookie 的瀏覽器,就不得不采取其他方法在應(yīng)用程序中從一張頁面向另一張頁面?zhèn)鬟f信息。一種方式是從表單傳遞數(shù)據(jù)(有關(guān)表單和用戶輸入的內(nèi)容,稍早前我們已經(jīng)在本教程中介紹過了)。
下面的表單在用戶單擊提交按鈕時向"welcome.php" 提交了用戶輸入:
Name:
Age:
取回"welcome.php" 中的值,就像這樣:
Welcome .
You are years old.
四、PHP Sessions
PHP Session 變量
當您運行一個應(yīng)用程序時,您會打開它,做些更改,然后關(guān)閉它。這很像一次會話。計算機清楚你是誰。它知道你何時啟動應(yīng)用程序,并在何時終止。但是在因特網(wǎng)上,存在一個問題:服務(wù)器不知道你是誰以及你做什么,這是由于 HTTP 地址不能維持狀態(tài)。
通過在服務(wù)器上存儲用戶信息以便隨后使用,PHP session 解決了這個問題(比如用戶名稱、購買商品等)。不過,會話信息是臨時的,在用戶離開網(wǎng)站后將被刪除。如果您需要永久儲存信息,可以把數(shù)據(jù)存儲在數(shù)據(jù)庫中。
Session 的工作機制是:為每個訪問者創(chuàng)建一個唯一的 id (UID),并基于這個 UID 來存儲變量。UID 存儲在cookie 中,亦或通過 URL 進行傳導(dǎo)。
開始 PHP Session
在您把用戶信息存儲到 PHPsession 中之前,首先必須啟動會話。
注釋:session_start() 函數(shù)必須位于
標簽之前:
上面的代碼會向服務(wù)器注冊用戶的會話,以便您可以開始保存用戶信息,同時會為用戶會話分配一個 UID。
存儲 Session 變量
存儲和取回session 變量的正確方法是使用 PHP$_SESSION 變量:
session_start();
// store session data
$_SESSION['views']=1;
?>
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
輸出:
Pageviews=1
在下面的例子中,我們創(chuàng)建了一個簡單的 page-view 計數(shù)器。isset() 函數(shù)檢測是否已設(shè)置 "views" 變量。如果已設(shè)置 "views" 變量,我們累加計數(shù)器。如果 "views" 不存在,則我們創(chuàng)建 "views" 變量,并把它設(shè)置為 1:
session_start();
if(isset($_SESSION['views']))
$_SESSION['views']=$_SESSION['views']+1;
else
$_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>
終結(jié) Session
如果您希望刪除某些session 數(shù)據(jù),可以使用 unset() 或 session_destroy() 函數(shù)。
unset() 函數(shù)用于釋放指定的 session 變量:
unset($_SESSION['views']);
?>
您也可以通過session_destroy() 函數(shù)徹底終結(jié) session:
session_destroy();
?>
注釋:session_destroy() 將重置 session,您將失去所有已存儲的session 數(shù)據(jù)。
五、PHP 錯誤處理
錯誤處理方法:
·簡單的 "die()" 語句
·自定義錯誤和錯誤觸發(fā)器
·錯誤報告
為了避免用戶獲得類似上面的錯誤消息,我們在訪問文件之前檢測該文件是否存在:
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
假如文件不存在,您會得到類似這樣的錯誤消息:
File not found
比起之前的代碼,上面的代碼更有效,這是由于它采用了一個簡單的錯誤處理機制在錯誤之后終止了腳本。
不過,簡單地終止腳本并不總是恰當?shù)姆绞。讓我們研究一下用于處理錯誤的備選的 PHP 函數(shù)。
創(chuàng)建自定義錯誤處理器
創(chuàng)建一個自定義的錯誤處理器,可以在PHP 中發(fā)生錯誤時調(diào)用該函數(shù)。
該函數(shù)必須有能力處理至少兩個參數(shù)(error level 和 error message),但是可以接受最多五個參數(shù)(可選的:file, line-number 以及error context):
語法
error_function(error_level,error_message,
error_file,error_line,error_context)
參數(shù)描述
error_level:必需。為用戶定義的錯誤規(guī)定錯誤報告級別。必須是一個值數(shù)。參見下面的表格:錯誤報告級別。
error_message:必需。為用戶定義的錯誤規(guī)定錯誤消息。
error_file:可選。規(guī)定錯誤在其中發(fā)生的文件名。
error_line:可選。規(guī)定錯誤發(fā)生的行號。
error_context:可選。規(guī)定一個數(shù)組,包含了當錯誤發(fā)生時在用的每個變量以及它們的值。
創(chuàng)建錯誤處理函數(shù)
function customError($errno, $errstr)
{
echo "Error: [$errno] $errstr
";
echo "Ending Script";
die();
}
現(xiàn)在,我們已經(jīng)創(chuàng)建了一個錯誤處理函數(shù),我們需要確定在何時觸發(fā)該函數(shù)。
Set ErrorHandler
PHP 的默認錯誤處理程序是內(nèi)建的錯誤處理程序。我們打算把上面的函數(shù)改造為腳本運行期間的默認錯誤處理程序。
可以修改錯誤處理程序,使其僅應(yīng)用到某些錯誤,這樣腳本就可以不同的方式來處理不同的錯誤。不過,在本例中,我們打算針對所有錯誤來使用我們的自定義錯誤處理程序:
set_error_handler("customError");
由于我們希望我們的自定義函數(shù)來處理所有錯誤,set_error_handler() 僅需要一個參數(shù),可以添加第二個參數(shù)來規(guī)定錯誤級別。
//定義錯誤處理函數(shù)
function customError($errno, $errstr)
{
echo "rror: [$errno] $errstr";
}
//設(shè)置錯誤處理函數(shù)
set_error_handler("customError");
//觸發(fā)錯誤
echo($test);
?>
可能的錯誤類型:
·E_USER_ERROR - 致命的用戶生成的run-time 錯誤。錯誤無法恢復(fù)。腳本執(zhí)行被中斷。
·E_USER_WARNING - 非致命的用戶生成的run-time 警告。腳本執(zhí)行不被中斷。
·E_USER_NOTICE - 默認。用戶生成的run-time 通知。腳本發(fā)現(xiàn)了可能的錯誤,也有可能在腳本運行正常時發(fā)生。
例子
在本例中,如果"test" 變量大于 "1",則發(fā)生E_USER_WARNING 錯誤。如果發(fā)生了 E_USER_WARNING,我們將使用我們的自定義錯誤處理程序并結(jié)束腳本:
//error handler function
function customError($errno, $errstr)
{
echo "Error: [$errno] $errstr
";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
錯誤記錄
通過 E-Mail 發(fā)送錯誤消息
function customError($errno, $errstr)
{
echo "Error: [$errno] $errstr ";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"526369948@qq.com","From: 526369948@qq.com");
}
六、PHP 異常處理
異常處理用于在指定的錯誤(異常)情況發(fā)生時改變腳本的正常流程。這種情況稱為異常。
當異常被觸發(fā)時,通常會發(fā)生:
·當前代碼狀態(tài)被保存
·代碼執(zhí)行被切換到預(yù)定義的異常處理器函數(shù)
·根據(jù)情況,處理器也許會從保存的代碼狀態(tài)重新開始執(zhí)行代碼,終止腳本執(zhí)行,或從代碼中另外的位置繼續(xù)執(zhí)行腳本
我們將展示不同的錯誤處理方法:
·異常的基本使用
·創(chuàng)建自定義的異常處理器
·多個異常
·重新拋出異常
·設(shè)置頂層異常處理器
Try, throw 和 catch
要避免上面例子出現(xiàn)的錯誤,我們需要創(chuàng)建適當?shù)拇a來處理異常。
正確的處理程序應(yīng)當包括:
1.Try - 使用異常的函數(shù)應(yīng)該位于"try" 代碼塊內(nèi)。如果沒有觸發(fā)異常,則代碼將照常繼續(xù)執(zhí)行。但是如果異常被觸發(fā),會拋出一個異常。
2.Throw - 這里規(guī)定如何觸發(fā)異常。每一個 "throw" 必須對應(yīng)至少一個 "catch"
3.Catch - "catch" 代碼塊會捕獲異常,并創(chuàng)建一個包含異常信息的對象
讓我們觸發(fā)一個異常:
//創(chuàng)建可拋出一個異常的函數(shù)
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//在 "try" 代碼塊中觸發(fā)異常
try
{
checkNum(2);//如果拋出異常則執(zhí)行catch中的語句,這里就不接著往下執(zhí)行了
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//捕獲異常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
上面代碼將獲得類似這樣一個錯誤:
Message: Value must be 1 or below
創(chuàng)建一個自定義的 Exception 類
創(chuàng)建自定義的異常處理程序非常簡單。我們簡單地創(chuàng)建了一個專門的類,當 PHP 中發(fā)生異常時,可調(diào)用其函數(shù)。該類必須是 exception 類的一個擴展。
這個自定義的exception 類繼承了 PHP 的 exception 類的所有屬性,您可向其添加自定義的函數(shù)。
我們開始創(chuàng)建exception 類:
class customException extends Exception //extends 相當于繼承關(guān)鍵字
{
public function errorMessage() //定義了自己的報錯函數(shù)
{
//error message 在繼承的類中,可以訪問基類的方法
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': '.$this->getMessage().' 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();
}
?>
這個新的類是舊的exception 類的副本,外加 errorMessage() 函數(shù)。正因為它是舊類的副本,因此它從舊類繼承了屬性和方法,我們可以使用 exception 類的方法,比如 getLine() 、getFile() 以及 getMessage()。
多個異常
可以為一段腳本使用多個異常,來檢測多種情況。
可以使用多個if..else 代碼塊,或一個 switch 代碼塊,或者嵌套多個異常。這些異常能夠使用不同的 exception 類,并返回不同的錯誤消息:
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': '.$this->getMessage().' 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);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
重新拋出異常
有時,當異常被拋出時,您也許希望以不同于標準的方式對它進行處理?梢栽谝粋 "catch" 代碼塊中再次拋出異常。
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
//throw exception if email is not valid
throw new Exception($email); //拋出Exception異常
}
}
catch(Exception $e) //捕獲Exception異常
{
//re-throw exception
throw new customException($email); //拋出customException異常
}
}
catch (customException $e) //捕獲customException異常
{
//display custom message
echo $e->errorMessage();
}
?>
設(shè)置頂層異常處理器 (Top LevelException Handler)
set_exception_handler() 函數(shù)可設(shè)置處理所有未捕獲異常的用戶定義函數(shù)。
function myException($exception)
{
echo "Exception: " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
在上面的代碼中,不存在 "catch" 代碼塊,而是觸發(fā)頂層的異常處理程序。應(yīng)該使用此函數(shù)來捕獲所有未被捕獲的異常。
異常的規(guī)則
·需要進行異常處理的代碼應(yīng)該放入 try 代碼塊內(nèi),以便捕獲潛在的異常。
·每個 try 或 throw 代碼塊必須至少擁有一個對應(yīng)的 catch 代碼塊。
·使用多個 catch 代碼塊可以捕獲不同種類的異常。
·可以在 try 代碼塊內(nèi)的 catch 代碼塊中再次拋出(re-thrown)異常。
簡而言之:如果拋出了異常,就必須捕獲它。
七、PHP Include 文件
服務(wù)器端包含 (SSI) 用于創(chuàng)建可在多個頁面重復(fù)使用的函數(shù)、頁眉、頁腳或元素。
PHP include 和 require 語句
通過 include 或 require 語句,可以將 PHP 文件的內(nèi)容插入另一個 PHP 文件(在服務(wù)器執(zhí)行它之前)。
include 和 require 語句是相同的,除了錯誤處理方面:
·require 會生成致命錯誤(E_COMPILE_ERROR)并停止腳本
·include 只生成警告(E_WARNING),并且腳本會繼續(xù)
語法
include 'filename';
或
require 'filename';
PHP include 實例
例子 1
假設(shè)我們有一個名為 "footer.php" 的標準的頁腳文件,就像這樣:
echo "
Copyright ? 2006-" . date("Y") . " W3School.com.cn
";
?>
如需在一張頁面中引用這個頁腳文件,請使用 include 語句:
歡迎訪問我們的首頁!
一段文本。
一段文本。
例子 2
假設(shè)我們有一個名為 "menu.php" 的標準菜單文件:
echo '首頁 -
HTML 教程 -
CSS教程 -
JavaScript 教程 -
PHP 教程';
?>
網(wǎng)站中的所有頁面均使用此菜單文件。具體的做法是(我們使用了一個
元素,這樣今后就可以輕松地通過 CSS 設(shè)置樣式):
歡迎訪問我的首頁!
Some text.
Some more text.
例子 3
假設(shè)我們有一個名為 "vars.php" 的文件,其中定義了一些變量:
$color='銀色的';
$car='奔馳轎車';
?>
然后,如果我們引用這個 "vars.php" 文件,就可以在調(diào)用文件中使用這些變量:
歡迎訪問我的首頁!
include 'vars.php';
echo "我有一輛" . $color . $car "。";
?>
PHP include vs. require
require 語句同樣用于向 PHP 代碼中引用文件。
不過,include與 require 有一個巨大的差異:如果用 include 語句引用某個文件并且 PHP無法找到它,腳本會繼續(xù)執(zhí)行:
如果我們使用 require 語句完成相同的案例,echo 語句不會繼續(xù)執(zhí)行,因為在 require 語句返回嚴重錯誤之后腳本就會終止執(zhí)行:
注釋:
請在此時使用 require:當文件被應(yīng)用程序請求時。
請在此時使用 include:當文件不是必需的,且應(yīng)用程序在文件未找到時應(yīng)該繼續(xù)運行時。
【php高級教程】相關(guān)文章:
有關(guān)語法和表單的PHP教程08-24
PHP入門基礎(chǔ)教程大全08-30
高級英語閱讀教程課件05-31
windows8.1下Apache+Php+MySQL配置教程06-21
高級英語口語教程:This egg is for you06-03
PHP高級開發(fā)工程師的具體職責(通用18篇)08-28
PHP可以做什么06-21
PHP路由技術(shù)的原理與實踐08-29