整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

重新学习php基础之超级全局变量(五)

重新学习php基础之超级全局变量(五)


hp超级全局变量




PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。

PHP 超级全局变量列表:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION


  • $GLOBALS

    $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问

    $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键

    
    <?php 
    $x=75; 
    $y=25;
     
    function addition() 
    { 
        $GLOBALS['z']=$GLOBALS['x'] + $GLOBALS['y']; 
    }
     
    addition(); 
    echo $z; 
    ?>
    

    $_SERVER

    $_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'];
    ?>
    

    $_REQUEST

    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

    $_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>
    

    $_GET

    PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。

    $_GET 也可以收集URL中发送的数据。




    PHP中get和post区别?

    第一种:

    • GET在浏览器回退时是无害的,而POST会再次提交请求。
    • GET产生的URL地址可以被Bookmark(标记),而POST不可以。
    • GET请求会被浏览器主动cache(存储),而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST么有。
    • 对参数的数据类型,GET只接受ASCII(美国信息交换标准码)字符,而POST没有限制。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。

    第二种、

    • get是从服务器上获取数据,post是向服务器传送数据。
    • get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
    • post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    • get传送的数据量较小,不能大于2KB。
    • post传送的数据量较大,一般被默认为不受限制。
    • get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    注意:post只是相比较get安全性更高一点,并不是说是万无一失的,在编程语言中,安全是最重要的(在输出语句中echo,print,var_dump等输出语句一定要使用过滤函数如htmlentiti()或正则过滤);




    Cookie

    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 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的

    您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(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%的广告主在内容生态搜索广告上增加预算,广告主认可内容生态搜索广告是新流量/新形式。

    对于以广告为主要卖点的搜索引擎,这种趋势可谓十分不乐观。

    三、Web3.0或成为新变量

    以上种种,都映衬着搜索引擎的发展重点将会从通用搜索为主转向以生态内搜索为主。

    乐观的是,对于通用搜索引擎来说,难点是已知的。但如今,不可控的是,在这一进程中,出现了新的变量。

    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所颠覆的命运呢?

    答案暂不可知。但可以肯定的是,互联网的未来总是充满惊险的冒险之旅,一切不可知的未来终将到来。

    参考资料

    • 钛媒体《跟搜索说byebye,未来属于智能信息》
    • 连线《Web已死 Internet永生》
    • 国盛证券《Web3.0行业报告:开放、隐私、共建》

    本文由 @科技新知 原创发布于人人都是产品经理。未经许可,禁止转载。

    题图来自Unsplash,基于 CC0 协议