hp超級全局變量
PHP中預定義了幾個超級全局變量(superglobals) ,這意味著它們在一個腳本的全部作用域中都可用。 你不需要特別說明,就可以在函數及類中使用。
PHP 超級全局變量列表:
$GLOBALS 是PHP的一個超級全局變量組,在一個PHP腳本的全部作用域中都可以訪問
$GLOBALS 是一個包含了全部變量的全局組合數組。變量的名字就是數組的鍵
<?php
$x=75;
$y=25;
function addition()
{
$GLOBALS['z']=$GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器創建
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
PHP $_REQUEST 用于收集HTML表單提交的數據。
以下實例顯示了一個輸入字段(input)及提交按鈕(submit)的表單(form)。 當用戶通過點擊 "Submit" 按鈕提交表單數據時, 表單數據將發送至<form>標簽中 action 屬性中指定的腳本文件。 在這個實例中,我們指定文件來處理表單數據。如果你希望其他的PHP文件來處理該數據,你可以修改該指定的腳本文件名。 然后,我們可以使用超級全局變量 $_REQUEST 來收集表單中的 input 字段數據:
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name=$_REQUEST['fname'];
echo $name;
?>
</body>
</html>
$_POST 被廣泛應用于收集表單數據,在HTML form標簽的指定該屬性:"method="post"。
以下實例顯示了一個輸入字段(input)及提交按鈕(submit)的表單(form)。 當用戶通過點擊 "Submit" 按鈕提交表單數據時, 表單數據將發送至<form>標簽中 action 屬性中指定的腳本文件。 在這個實例中,我們指定文件來處理表單數據。如果你希望其他的PHP文件來處理該數據,你可以修改該指定的腳本文件名。 然后,我們可以使用超級全局變量 $_POST 來收集表單中的 input 字段數據
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name=$_POST['fname'];
echo $name;
?>
</body>
</html>
PHP $_GET 同樣被廣泛應用于收集表單數據,在HTML form標簽的指定該屬性:"method="get"。
$_GET 也可以收集URL中發送的數據。
第一種:
第二種、
注意:post只是相比較get安全性更高一點,并不是說是萬無一失的,在編程語言中,安全是最重要的(在輸出語句中echo,print,var_dump等輸出語句一定要使用過濾函數如htmlentiti()或正則過濾);
cookie 常用于識別用戶。cookie 是一種服務器留在用戶計算機上的小文件。每當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送 cookie。通過 PHP,您能夠創建并取回 cookie 的值。
如何創建cookie?
setcookie()函數用于設置 cookie
注釋:setcookie() 函數必須位于 <html> 標簽之前
語法:
<?php
setcookie(name , value, expire ,path , domain);
?>
<?php
setcookie("user" , "hulitong", time()+3600);
?>
<html>
...
取回cookie的值
<?php
我們使用 isset() 函數來確認是否已設置了 cookieecho $_COOKIE["user"]; //輸出user的cookie
print_r($_COOKIE); //獲取打印所有cookie
?>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "歡迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通訪客!<br>";
?>
</body>
</html>
如上:我們使用 isset() 函數來確認是否已設置了 cookie
如何刪除Cookie?
當刪除 cookie 時,您應當使過期日期變更為過去的時間點。
<?php
// 設置 cookie 過期時間為過去 1 小時
setcookie("user", "", time()-3600);
?>
session 變量用于存儲關于用戶會話(session)的信息,或者更改用戶會話(session)的設置。Session 變量存儲單一用戶的信息,并且對于應用程序中的所有頁面都是可用的
您在計算機上操作某個應用程序時,您打開它,做些更改,然后關閉它。這很像一次對話(Session)。計算機知道您是誰。它清楚您在何時打開和關閉應用程序。然而,在因特網上問題出現了:由于 HTTP 地址無法保持狀態,Web 服務器并不知道您是誰以及您做了什么。
PHP session 解決了這個問題,它通過在服務器上存儲用戶信息以便隨后使用(比如用戶名稱、購買商品等)。然而,會話信息是臨時的,在用戶離開網站后將被刪除。如果您需要永久存儲信息,可以把數據存儲在數據庫中。
Session 的工作機制是:為每個訪客創建一個唯一的 id (UID),并基于這個 UID 來存儲變量。UID 存儲在 cookie 中,或者通過 URL 進行傳導
在您把用戶信息存儲到 PHP session 中之前,首先必須啟動會話。
注釋:session_start() 函數必須位于 <html> 標簽之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
存儲和取回 session 變量的正確方法是使用 PHP $_SESSION 變量
<?php
session_start();
// 存儲 session 數據
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<?php
// 檢索 session 數據
echo "瀏覽量:". $_SESSION['views'];
?>
</body>
</html>
銷毀session
如果您希望刪除某些 session 數據,可以使用 unset() 或 session_destroy() 函數。
unset() 函數用于釋放指定的 session 變量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
您也可以通過調用 session_destroy() 函數徹底銷毀 session:
HP Cookies
cookie 常用于識別用戶。
什么是 Cookie?
cookie 常用于識別用戶。cookie 是服務器留在用戶計算機中的小文件。每當相同的計算機通
過瀏覽器請求頁面時,它同時會發送 cookie。通過 PHP,您能夠創建并取回 cookie 的值。
如何創建 cookie?
setcookie() 函數用于設置 cookie。
注釋:setcookie() 函數必須位于 <html> 標簽之前。
語法
setcookie(name, value, expire, path, domain);
例子
在下面的例子中,我們將創建名為 "user" 的 cookie,把為它賦值 "Alex Porter"。我們也規
定了此 cookie 在一小時后過期:
<?php
setcookie("user", "Alex Porter", time()+3600);
?>
<html>
<body>
</body>
</html>
注釋:在發送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼(為防
止 URL 編碼,請使用 setrawcookie() 取而代之)。
如何取回 Cookie 的值?
PHP 的 $_COOKIE 變量用于取回 cookie 的值。
在下面的例子中,我們取回了名為 "user" 的 cookie 的值,并把它顯示在了頁面上:
<?php
// Print a cookie
echo $_COOKIE["user"];
// A way to view all cookies
print_r($_COOKIE);
?>
在下面的例子中,我們使用 isset() 函數來確認是否已設置了 cookie:
<html>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
echo "Welcome guest!<br />";
?>
</body>
</html>
如何刪除 cookie?
當刪除 cookie 時,您應當使過期日期變更為過去的時間點。
刪除的例子:
<?php
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>
如果瀏覽器不支持 cookie 該怎么辦?
如果您的應用程序涉及不支持 cookie 的瀏覽器,您就不得不采取其他方法在應用程序中從
一張頁面向另一張頁面傳遞信息。一種方式是從表單傳遞數據(有關表單和用戶輸入的內容,
稍早前我們已經在本教程中介紹過了)。
下面的表單在用戶單擊提交按鈕時向 "welcome.php" 提交了用戶輸入:
<html>
<body>
<form action="welcome.php" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
取回 "welcome.php" 中的值,就像這樣:
<html>
<body>
Welcome <?php echo $_POST["name"]; ?>.<br />
You are <?php echo $_POST["age"]; ?> years old.
</body>
</html>
PHP Sessions
PHP session 變量用于存儲有關用戶會話的信息,或更改用戶會話的設置。Session 變量保存
的信息是單一用戶的,并且可供應用程序中的所有頁面使用。
PHP Session 變量
當您運行一個應用程序時,您會打開它,做些更改,然后關閉它。這很像一次會話。計算機
清楚你是誰。它知道你何時啟動應用程序,并在何時終止。但是在因特網上,存在一個問題:
服務器不知道你是誰以及你做什么,這是由于 HTTP 地址不能維持狀態。
通過在服務器上存儲用戶信息以便隨后使用,PHP session 解決了這個問題(比如用戶名稱、
購買商品等)。不過,會話信息是臨時的,在用戶離開網站后將被刪除。如果您需要永久儲
存信息,可以把數據存儲在數據庫中。
Session 的工作機制是:為每個訪問者創建一個唯一的 id (UID),并基于這個 UID 來存儲變
量。UID 存儲在 cookie 中,亦或通過 URL 進行傳導。
開始 PHP Session
在您把用戶信息存儲到 PHP session 中之前,首先必須啟動會話。
注釋:session_start() 函數必須位于 <html> 標簽之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
上面的代碼會向服務器注冊用戶的會話,以便您可以開始保存用戶信息,同時會為用戶會話
分配一個 UID。
存儲 Session 變量
存儲和取回 session 變量的正確方法是使用 PHP $_SESSION 變量:
<?php
session_start();
// store session data
$_SESSION['views']=1;
?>
<html>
<body>
<?php
//retrieve session data
echo "Pageviews=". $_SESSION['views'];
?>
</body>
</html>
輸出:
Pageviews=1
在下面的例子中,我們創建了一個簡單的 page-view 計數器。isset() 函數檢測是否已設置
"views" 變量。如果已設置 "views" 變量,我們累加計數器。如果 "views" 不存在,則我們
創建 "views" 變量,并把它設置為 1:
<?php
session_start();
if(isset($_SESSION['views']))
$_SESSION['views']=$_SESSION['views']+1;
else
$_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>
終結 Session
如果您希望刪除某些 session 數據,可以使用 unset() 或 session_destroy() 函數。
unset() 函數用于釋放指定的 session 變量:
<?php
unset($_SESSION['views']);
?>
您也可以通過 session_destroy() 函數徹底終結 session:
<?php
session_destroy();
?>
注釋:session_destroy() 將重置 session,您將失去所有已存儲的 session 數據。
PHP 發送電子郵件
PHP 允許您從腳本直接發送電子郵件。
PHP mail() 函數
PHP mail() 函數用于從腳本中發送電子郵件。
語法
mail(to,subject,message,headers,parameters)
參數描述
to 必需。規定 email 接收者。
subject 必需。規定 email 的主題。注釋:該參數不能包含任何新行字符。
message 必需。定義要發送的消息。應使用 LF (\n) 來分隔各行。
headers
可選。規定附加的標題,比如 From、Cc 以及 Bcc。
應當使用 CRLF (\r\n) 分隔附加的標題。
parameters 可選。對郵件發送程序規定額外的參數。
注釋:PHP 需要一個已安裝且正在運行的郵件系統,以便使郵件函數可用。所用的程序通過
在 php.ini 文件中的配置設置進行定義。請在我們的 PHP Mail 參考手冊 閱讀更多內容。
PHP 簡易 E-Mail
通過 PHP 發送電子郵件的最簡單的方式是發送一封文本 email。
在下面的例子中,我們首先聲明變量($to, $subject, $message, $from, $headers),然后我們在
mail() 函數中使用這些變量來發送了一封 e-mail:
<?php
$to="someone@example.com";
$subject="Test mail";
$message="Hello! This is a simple email message.";
$from="someonelse@example.com";
$headers="From: $from";
mail($to,$subject,$message,$headers);
echo "Mail Sent.";
?>
PHP Mail Form
通過 PHP,您能夠在自己的站點制作一個反饋表單。下面的例子向指定的 e-mail 地址發送
了一條文本消息:
<html>
<body>
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
{
//send email
$email=$_REQUEST['email'] ;
$subject=$_REQUEST['subject'] ;
$message=$_REQUEST['message'] ;
mail( "someone@example.com", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
else
//if "email" is not filled out, display the form
{
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text' /><br />
Subject: <input name='subject' type='text' /><br />
Message:<br />
<textarea name='message' rows='15' cols='40'>
</textarea><br />
<input type='submit' />
</form>";
}
?>
</body>
</html>
例子解釋:
1. 首先,檢查是否填寫了郵件輸入框
2. 如果未填寫(比如在頁面被首次訪問時),輸出 HTML 表單
3. 如果已填寫(在表單被填寫后),從表單發送郵件
4. 當點擊提交按鈕后,重新載入頁面,顯示郵件發送成功的消息
PHP 錯誤處理
在 PHP 中,默認的錯誤處理很簡單。一條消息會被發送到瀏覽器,這條消息帶有文件名、
行號以及一條描述錯誤的消息。
PHP 錯誤處理
在創建腳本和 web 應用程序時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤檢測
編碼,那么程序看上去很不專業,也為安全風險敞開了大門。
本教程介紹了 PHP 中一些最為重要的錯誤檢測方法。
我們將為您講解不同的錯誤處理方法:
· 簡單的 "die()" 語句
· 自定義錯誤和錯誤觸發器
· 錯誤報告
基本的錯誤處理:使用 die() 函數
第一個例子展示了一個打開文本文件的簡單腳本:
<?php
$file=fopen("welcome.txt","r");
?>
如果文件不存在,您會獲得類似這樣的錯誤:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
為了避免用戶獲得類似上面的錯誤消息,我們在訪問文件之前檢測該文件是否存在:
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
現在,假如文件不存在,您會得到類似這樣的錯誤消息:
File not found
比起之前的代碼,上面的代碼更有效,這是由于它采用了一個簡單的錯誤處理機制在錯誤之
后終止了腳本。
不過,簡單地終止腳本并不總是恰當的方式。讓我們研究一下用于處理錯誤的備選的 PHP
函數。
創建自定義錯誤處理器
創建一個自定義的錯誤處理器非常簡單。我們很簡單地創建了一個專用函數,可以在 PHP
中發生錯誤時調用該函數。
該函數必須有能力處理至少兩個參數 (error level 和 error message),但是可以接受最多五個
參數(可選的:file, line-number 以及 error context):
語法
error_function(error_level,error_message,
error_file,error_line,error_context)
參數描述
error_level
必需。為用戶定義的錯誤規定錯誤報告級別。必須是一個值數。
參見下面的表格:錯誤報告級別。
error_message 必需。為用戶定義的錯誤規定錯誤消息。
error_file 可選。規定錯誤在其中發生的文件名。
error_line 可選。規定錯誤發生的行號。
error_context 可選。規定一個數組,包含了當錯誤發生時在用的每個變量以及它們的值。
錯誤報告級別
這些錯誤報告級別是錯誤處理程序旨在處理的錯誤的不同的類型:
值常量描述
2 E_WARNING 非致命的 run-time 錯誤。不暫停腳本執行。
8 E_NOTICE
Run-time 通知。
腳本發現可能有錯誤發生,但也可能在腳本正常運行時發生。
256 E_USER_ERROR 致命的用戶生成的錯誤。這類似于程序員使用 PHP 函數
trigger_error() 設置的 E_ERROR。
512 E_USER_WARNING 非致命的用戶生成的警告。這類似于程序員使用 PHP 函數
trigger_error() 設置的 E_WARNING。
1024 E_USER_NOTICE 用戶生成的通知。這類似于程序員使用 PHP 函數
trigger_error() 設置的 E_NOTICE。
4096 E_RECOVERABLE_ER
ROR
可捕獲的致命錯誤。類似 E_ERROR,但可被用戶定義的處
理程序捕獲。(參見 set_error_handler())
8191 E_ALL
所有錯誤和警告,除級別 E_STRICT 以外。
(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
現在,讓我們創建一個處理錯誤的函數:
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
上面的代碼是一個簡單的錯誤處理函數。當它被觸發時,它會取得錯誤級別和錯誤消息。然
后它會輸出錯誤級別和消息,并終止腳本。
現在,我們已經創建了一個錯誤處理函數,我們需要確定在何時觸發該函數。
Set Error Handler
PHP 的默認錯誤處理程序是內建的錯誤處理程序。我們打算把上面的函數改造為腳本運行期
間的默認錯誤處理程序。
可以修改錯誤處理程序,使其僅應用到某些錯誤,這樣腳本就可以不同的方式來處理不同的
錯誤。不過,在本例中,我們打算針對所有錯誤來使用我們的自定義錯誤處理程序:
set_error_handler("customError");
由于我們希望我們的自定義函數來處理所有錯誤,set_error_handler() 僅需要一個參數,可以
添加第二個參數來規定錯誤級別。
實例
通過嘗試輸出不存在的變量,來測試這個錯誤處理程序:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
以上代碼的輸出應該類似這樣:
Custom error: [8] Undefined variable: test
觸發錯誤
在腳本中用戶輸入數據的位置,當用戶的輸入無效時觸發錯誤的很有用的。在 PHP 中,這
個任務由 trigger_error() 完成。
例子
在本例中,如果 "test" 變量大于 "1",就會發生錯誤:
<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>
以上代碼的輸出應該類似這樣:
Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6
您可以在腳本中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤級別。
可能的錯誤類型:
· E_USER_ERROR - 致命的用戶生成的 run-time 錯誤。錯誤無法恢復。腳本執行被中
斷。
· E_USER_WARNING - 非致命的用戶生成的 run-time 警告。腳本執行不被中斷。
· E_USER_NOTICE - 默認。用戶生成的 run-time 通知。腳本發現了可能的錯誤,也有
可能在腳本運行正常時發生。
例子
在本例中,如果 "test" 變量大于 "1",則發生 E_USER_WARNING 錯誤。如果發生了
E_USER_WARNING,我們將使用我們的自定義錯誤處理程序并結束腳本:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
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);
}
?>
以上代碼的輸出應該類似這樣:
Error: [512] Value must be 1 or below
Ending Script
現在,我們已經學習了如何創建自己的 error,以及如何處罰它們,現在我們研究一下錯誤
記錄。
錯誤記錄
默認地,根據在 php.ini 中的 error_log 配置,PHP 向服務器的錯誤記錄系統或文件發送錯誤
記錄。通過使用 error_log() 函數,您可以向指定的文件或遠程目的地發送錯誤記錄。
通過電子郵件向您自己發送錯誤消息,是一種獲得指定錯誤的通知的好辦法。
通過 E-Mail 發送錯誤消息
在下面的例子中,如果特定的錯誤發生,我們將發送帶有錯誤消息的電子郵件,并結束腳本:
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
//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);
}
?>
以上代碼的輸出應該類似這樣:
Error: [512] Value must be 1 or below
Webmaster has been notified
接收自以上代碼的郵件類似這樣:
Error: [512] Value must be 1 or below
這個方法不適合所有的錯誤。常規錯誤應當通過使用默認的 PHP 記錄系統在服務器上進行
記錄。
PHP 異常處理
異常(Exception)用于在指定的錯誤發生時改變腳本的正常流程。
什么是異常?
PHP 5 提供了一種新的面向對象的錯誤處理方法。
異常處理用于在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。
當異常被觸發時,通常會發生:
· 當前代碼狀態被保存
· 代碼執行被切換到預定義的異常處理器函數
· 根據情況,處理器也許會從保存的代碼狀態重新開始執行代碼,終止腳本執行,或從
代碼中另外的位置繼續執行腳本
我們將展示不同的錯誤處理方法:
· 異常的基本使用
· 創建自定義的異常處理器
· 多個異常
· 重新拋出異常
· 設置頂層異常處理器
異常的基本使用
當異常被拋出時,其后的代碼不會繼續執行,PHP 會嘗試查找匹配的 "catch" 代碼塊。
如果異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那么將
發生一個嚴重的錯誤(致命錯誤),并且輸出 "Uncaught Exception" (未捕獲異常)的錯誤
消息。
讓我們嘗試拋出一個異常,同時不去捕獲它:
<?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);
?>
上面的代碼會獲得類似這樣的一個錯誤:
Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
Try, throw 和 catch
要避免上面例子出現的錯誤,我們需要創建適當的代碼來處理異常。
處理處理程序應當包括:
1. Try - 使用異常的函數應該位于 "try" 代碼塊內。如果沒有觸發異常,則代碼將照常繼
續執行。但是如果異常被觸發,會拋出一個異常。
2. Throw - 這里規定如何觸發異常。每一個 "throw" 必須對應至少一個 "catch"
3. Catch - "catch" 代碼塊會捕獲異常,并創建一個包含異常信息的對象
讓我們觸發一個異常:
<?php
//創建可拋出一個異常的函數
function checkNum($number)
{
if($number>1)
{
throw new Exception("Value must be 1 or below");
}
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';
}
//捕獲異常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
上面代碼將獲得類似這樣一個錯誤:
Message: Value must be 1 or below
例子解釋:
上面的代碼拋出了一個異常,并捕獲了它:
1. 創建 checkNum() 函數。它檢測數字是否大于 1。如果是,則拋出一個異常。
2. 在 "try" 代碼塊中調用 checkNum() 函數。
3. checkNum() 函數中的異常被拋出
4. "catch" 代碼塊接收到該異常,并創建一個包含異常信息的對象 ($e)。
5. 通過從這個 exception 對象調用 $e->getMessage(),輸出來自該異常的錯誤消息
不過,為了遵循“每個 throw 必須對應一個 catch”的原則,可以設置一個頂層的異常處理器
來處理漏掉的錯誤。
創建一個自定義的 Exception 類
創建自定義的異常處理程序非常簡單。我們簡單地創建了一個專門的類,當 PHP 中發生異
常時,可調用其函數。該類必須是 exception 類的一個擴展。
這個自定義的 exception 類繼承了 PHP 的 exception 類的所有屬性,您可向其添加自定義的
函數。
我們開始創建 exception 類:
<?php
class customException extends Exception
{
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();
}
?>
這個新的類是舊的 exception 類的副本,外加 errorMessage() 函數。正因為它是舊類的副本,
因此它從舊類繼承了屬性和方法,我們可以使用 exception 類的方法,比如 getLine() 、
getFile() 以及 getMessage()。
例子解釋:
上面的代碼拋出了一個異常,并通過一個自定義的 exception 類來捕獲它:
1. customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了
舊類的所有屬性和方法。
2. 創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一條錯誤消息
3. 把 $email 變量設置為不合法的 e-mail 地址字符串
4. 執行 "try" 代碼塊,由于 e-mail 地址不合法,因此拋出一個異常
5. "catch" 代碼塊捕獲異常,并顯示錯誤消息
多個異常
可以為一段腳本使用多個異常,來檢測多種情況。
可以使用多個 if..else 代碼塊,或一個 switch 代碼塊,或者嵌套多個異常。這些異常能夠使
用不同的 exception 類,并返回不同的錯誤消息:
<?php
class customException extends Exception
{
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);
}
//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();
}
?>
例子解釋:
上面的代碼測試了兩種條件,如何任何條件不成立,則拋出一個異常:
1. customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了
舊類的所有屬性和方法。
2. 創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一個錯誤消息。
3. 執行 "try" 代碼塊,在第一個條件下,不會拋出異常。
4. 由于 e-mail 含有字符串 "example",第二個條件會觸發異常。
5. "catch" 代碼塊會捕獲異常,并顯示恰當的錯誤消息
如果沒有捕獲 customException,緊緊捕獲了 base exception,則在那里處理異常。
重新拋出異常
有時,當異常被拋出時,您也許希望以不同于標準的方式對它進行處理。可以在一個
"catch" 代碼塊中再次拋出異常。
腳本應該對用戶隱藏系統錯誤。對程序員來說,系統錯誤也許很重要,但是用戶對它們并不
感興趣。為了讓用戶更容易使用,您可以再次拋出帶有對用戶比較友好的消息的異常:
<?php
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);
}
}
catch(Exception $e)
{
//re-throw exception
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
例子解釋:
上面的代碼檢測在郵件地址中是否含有字符串 "example"。如果有,則再次拋出異常:
1. customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了
舊類的所有屬性和方法。
2. 創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一個錯誤消息。
3. 把 $email 變量設置為一個有效的郵件地址,但含有字符串 "example"。
4. "try" 代碼塊包含另一個 "try" 代碼塊,這樣就可以再次拋出異常。
5. 由于 e-mail 包含字符串 "example",因此觸發異常。
6. "catch" 捕獲到該異常,并重新拋出 "customException"。
7. 捕獲到 "customException",并顯示一條錯誤消息。
如果在其目前的 "try" 代碼塊中異常沒有被捕獲,則它將在更高層級上查找 catch 代碼塊。
設置頂層異常處理器 (Top Level Exception Handler)
set_exception_handler() 函數可設置處理所有未捕獲異常的用戶定義函數。
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
以上代碼的輸出應該類似這樣:
Exception: Uncaught Exception occurred
在上面的代碼中,不存在 "catch" 代碼塊,而是觸發頂層的異常處理程序。應該使用此函數
來捕獲所有未被捕獲的異常。
異常的規則
· 需要進行異常處理的代碼應該放入 try 代碼塊內,以便捕獲潛在的異常。
· 每個 try 或 throw 代碼塊必須至少擁有一個對應的 catch 代碼塊。
· 使用多個 catch 代碼塊可以捕獲不同種類的異常。
· 可以在 try 代碼塊內的 catch 代碼塊中再次拋出(re-thrown)異常。
簡而言之:如果拋出了異常,就必須捕獲它。
輯導語:在未來,搜索引擎市場會走向什么樣的演變趨勢?目前來看,內容生態搜索也許會成為大勢所趨。那么伴隨著Web3.0的提出,搜索引擎市場是否會迎來新的變數?本篇文章里,作者就搜索引擎的發展做了一番解讀,一起來看。
搜索市場很久沒有新鮮事了。
2022年2月8日,市場消息稱,抖音搜索與蘋果Siri達成合作,iPhone用戶可以通過Siri語音指令直接搜索抖音里的視頻內容。據悉,這是Siri在全球范圍內首次與短視頻品類App合作此功能。
兩方合作,無須深究誰借了誰的光,可以肯定的是,借助蘋果Siri在用戶中養成的心智,抖音視頻搜索再落一子。
如果這最多算是視頻搜索領域內的小動作,但聯系另一件事,事情就變得有趣起來。
此前在2020年6月,臨近高考期間,蘋果聯合百度App推出新功能,蘋果用戶只需喚醒Siri,語音輸入“高考真題”“高考作文”等相關指令,即可通過百度App了解到高考相關訊息和服務。
兩次合作中,蘋果一方穩坐釣魚臺,上演了“厚此薄彼”的戲碼。
往小了說,在抖音視頻搜索和百度搜索中,前者得到更多資源傾斜。但放大來看,在內容生態搜索和通用搜索的競爭中,勝利的天平正在向前者傾斜。
單憑蘋果一方的選擇來推導出上述結論,論證鏈條似乎有些單薄,但更多的線索節點,早已指向這一趨勢。
很長一段時間內,市場中存在兩種搜索引擎,分別是通用搜索和垂直搜索。第一類的代表主要為百度、谷歌等,這里不過多贅述。
垂直搜索則相對小眾,其主要是針對某一個行業的專業搜索引擎,是通用搜索引擎的細分和延伸。
一般來說,和通用搜索不同,垂直搜索引擎的數據多來源于自身平臺,當某一平臺上的信息達到足夠量大的時候自然形成,例如淘寶。
兩種搜索引擎也常有摩擦。舉一個簡單的例子,2008年,淘寶屏蔽了百度搜索引擎爬蟲,本質上,百度與淘寶都是搜索模式下的競價排名巨頭,雙方交戰是為了保證廣告業務的“官鹽”壟斷性質。
彼時,已有不少分析人士認為,高度專業化的垂直搜索廠商對通用搜索平臺將構成重大的潛在威脅,但由于國內的垂直搜索引擎良莠不齊的現狀,以及百度在流量上的優勢,一段時間內通用搜索仍是市場主流。
變化悄悄發生在2012年。
“一方面是搜索流量的變現率和轉換率太低,另一方面是移動互聯網時代,當大部分流量來自App,百度未來最多只是one of the apps。搜索的價值正在以你想不到的速度坍塌。”
2012年12月20日,第一財經日報北京產經主任馬曉芳發微博稱,時任Google中國全球副總裁的JohnLiu認為傳統Search已死。
搜索作為用戶獲取信息的主流方式,喊出“搜索已死”的口號,未免有些聳人聽聞,但谷歌高層卻認為傳統搜索已死,事情就變得嚴肅起來。
顯然,該思潮的誕生與移動App的崛起分不開關系。
原因在于,移動互聯網時代,一個個突然崛起的超級App,搶走了原本搜索引擎的工作,逐漸占領了用戶的心智——用戶已經知道在什么樣的App上干什么事,繼而不會使用搜索引擎。
《連線》雜志早在2010年就提出了相似的觀點,在那篇傳播甚廣的《Web已死,Internet永生》一文中提到:
過去的幾年中,數字領域一個最大的變化就是從開放的互聯網向半封閉的網絡平臺過渡。這些平臺使用互聯網進行數據傳輸,但不通過瀏覽器顯示。它們的興起主要是受到了iPhone等移動計算模式的推動。它們不受HTML語言規則的束縛,Google也沒辦法抓取它們的數據。
意識到這種現象后,通用搜索引擎想要挽回局面,以百度為例,其希望通過自建數據來對抗這種趨勢——“輕應用”“直達號”“中間頁”“百家號”都是該思潮下的產物。
從結果來看,百度的策略并不怎么成功,2019年1月22日晚,一篇名為《搜索引擎百度已死》的文章突然刷屏,引起不少用戶共鳴。
文章中稱,“作為搜索引擎的百度已死。Baidu.com已經不是你尋找中文互聯網內容的地方,而是百度自家的站內搜索;它將你引向的不是中文互聯網中的優質精神食糧,而是囤積在自家的腐臭變質內容。”
原因在于,百度自建數據的行為,在用戶心中,反而成為平臺的自我優待,成為不正當競爭行為的一種體現。
對于日漸失意的“百度”們而言,機會可能誕生在互聯互通之下。
2021年10月18日,據彭博報道,為了打破互聯網巨頭之間的“高墻花園”,中國監管層考慮要求騰訊、字節跳動等網絡媒體公司向百度等搜索引擎開放內容。
互聯互通能否成為百度們的神藥,暫時不得而知,但現今,內容生態搜索的步伐,幾乎難以阻擋了。
沒有一個概念是憑空誕生的,內容生態搜索亦然。和垂直搜索引擎類似,內容生態搜索的數據多來源于平臺和自有生態。
參照極光發布的《內容生態搜索趨勢研究報告》,短視頻平臺、社交平臺、電商平臺、新聞資訊平臺、長視頻平臺均為內容型平臺。
它們按照各自的規則制作內容,形成特有的內容生態體系,基于此的搜索,則為內容生態搜索。
按此,、抖音、快手、小紅書等均為內容型平臺,乃至微信、淘寶、支付寶等,內容是平臺賴以生存的基礎,平臺上發生的搜索亦都為內容生態搜索。
由于與垂直搜索之間的淵源,布局生態內搜索先驅者難以確定,但仍能從幾個關鍵性節點中,找到上述玩家的蛛絲馬跡。
以上文提到的視頻搜索為例,現今,已成為不少互聯網企業的標配。
先是2021年2月17日,抖音首支搜索年度短片發布,字節跳動CEO張楠透露道,抖音視頻搜索月活用戶超5.5億,日均視頻搜索量已達4億,抖音將加大對視頻搜索的投入。
幾個月后,快手也加入了戰場。2021年9月27日,快手發布了首支快手搜索品牌TVC,并宣布截至8月,快手搜索日均搜索次數超過3億。
本質上,視頻搜索仍是內容生態搜索的范疇,只是內容生產的視頻化帶來搜索結果的視頻化。
更難忽略的玩家是支付寶和微信,此前在2019年12月11日,微信宣布,微信搜索正式升級為“微信搜一搜”。
微信搜一搜的搜索結果包括公眾號、小程序、游戲等內容,內容來自微信內部以及知乎、豆瓣等平臺。微信方面介紹,用戶使用升級后的微信搜一搜,可搜索到更多的信息和服務。
兩年后,在2022微信公開課上,微信公開課講師周顥介紹,目前搜一搜MAU已經達到7億。
橫向對比來說,這個數值已經高于了百度App公布的2021年9月份6.07億月活,以及抖音2021年初公布的視頻搜索月活用戶超5.5億的規模。
此外,在2020年5月,支付寶也宣布,搜索業務重新整合后首次成為獨立事業部,原淘寶搜索產品總監袁懷賓調任支付寶,擔任支付寶搜索業務“一號位”。
盡管相對于微信搜一搜,支付寶搜索很少“拋頭露面”,但坐擁巨大的公域流量池,其實力亦不容小覷。
需要承認的是,大多數改變的發生都是“溫水煮青蛙”,當青蛙真正感到威脅之際,已經沒有跳出鐵鍋的能力了。
根據極光調研數據,獨立搜索平臺的優勢仍然存在,以71.5%的使用率位居榜首;但搜索行為明顯向其它平臺遷徙,以短視頻平臺為例,68.7%的用戶會通過其進行搜索,成為使用率第二位的搜索平臺。
此外,用戶的所有搜索行為中,有77.4%的搜索會發生在內容型平臺;90.5%的用戶在社交、短視頻、長視頻、電商購物、新聞資訊等平臺。
與廣發證券發布的《互聯網搜索產業專題研究:全維搜索流量格局與商業化空間》兩相驗證,現階段,盡管通用搜索有一定的先發優勢,但如今搜索行為明顯向內容生態平臺遷徙。
數據顯示,即時通信、視頻(含短視頻)、網絡購物的用戶滲透率分別為97.3%、93.4%、80.3%,對應的搜索使用率分別為62.0%、46.7%、59.0%。
更甚者,這種用戶心智的轉變已經傳導到廣告營銷層面。
根據CTR央視市場研究發布的《2022年搜索營銷預算趨勢報告》,調研數據顯示,預計2022年36.3%的廣告主在內容生態搜索廣告上增加預算,廣告主認可內容生態搜索廣告是新流量/新形式。
對于以廣告為主要賣點的搜索引擎,這種趨勢可謂十分不樂觀。
以上種種,都映襯著搜索引擎的發展重點將會從通用搜索為主轉向以生態內搜索為主。
樂觀的是,對于通用搜索引擎來說,難點是已知的。但如今,不可控的是,在這一進程中,出現了新的變量。
2021年3月,被稱為“元宇宙第一股”的Roblox在紐交所上市,“元宇宙”概念自此成為科技公司的風向標,一眾互聯網科技巨頭紛紛宣布入局元宇宙,2021年一躍成為元宇宙元年。
元宇宙作為新興概念,一萬個人有一萬個哈姆雷特,某種程度上,可以把它定位為“更沉浸的數字化體驗”。
與此同時,比起元宇宙這種不可觸摸的新概念,作為元宇宙的第一層階梯,Web3.0這個可以被逐級追溯的概念,越來越多受到業內人士重視。
什么是Web3.0,這一概念需要追溯到Web1.0、Web2.0。
Web1.0就是簡單的內容獲取與查詢,彼時,用戶主要以接收信息為主,這一時期,搜索引擎和門戶網站通過將廣告貨幣化,成為現象級產品。
相比Web1.0,在Web2.0時代,用戶參與互聯網程度大大提升,普遍表現在用戶參與互聯網并進行相關的內容制造,例如各種短視頻平臺、社區。
而關于Web3.0,其概念實際上經歷過數次修正,如今的Web3.0是區塊鏈技術問世后的Web3.0。
也就是說,基于區塊鏈技術,在Web3.0世界,用戶數據隱私將通過加密算法和分布式存儲等手段得到充分保護,內容和應用將由用戶創造和主導(理想狀態下)。
事情一下子就變得有趣起來,如果說,以百度為代表的通用搜索引擎算是Web1.0模式下的典型產品,以微信搜一搜、抖音視頻搜索等內容搜索算是Web2.0模式下的典型產品。
那么,在Web3.0模式下,這種迭代是否會加劇呢?
此前在Web2.0模式下,以互聯網巨頭為核心,形成多個生態圈,核心互聯網公司對數據、價值和網絡效應具有壟斷性,生態之間存在著強大的隔閡界限。
由于數據處于孤島狀態,大量市場紅利被平臺分走,而非內容生產者或服務提供商。以搜索引擎為例,在中心化模式下,在用戶、平臺方和廣告商中,三者處于極不公平的地位,資源偏向搜索引擎的平臺方。
但如果在Web3.0模式下,利用區塊鏈的協議,用戶的數據將擁有高度確權。
在此前提下,已有的搜索引擎巨頭將不再擁有我們的數據。是否會面臨被Web3.0所顛覆的命運呢?
答案暫不可知。但可以肯定的是,互聯網的未來總是充滿驚險的冒險之旅,一切不可知的未來終將到來。
參考資料
本文由 @科技新知 原創發布于人人都是產品經理。未經許可,禁止轉載。
題圖來自Unsplash,基于 CC0 協議
*請認真填寫需求信息,我們會在24小時內與您取得聯系。