您的位置 首页 php

PHP 语言的基础语法(四)

PHP cookie s

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)异常。

简而言之:如果抛出了异常,就必须捕获它。

文章来源:智云一二三科技

文章标题:PHP 语言的基础语法(四)

文章地址:https://www.zhihuclub.com/37007.shtml

关于作者: 智云科技

热门文章

网站地图