什么是在PHP中向用户显示错误/消息的好方法?

5 php error-handling

我多年来一直在使用自己的方法,但我想也许这不是最好的方法.

基本上当我想向用户抛出错误或显示成功操作的确认时,我会执行以下操作:

if($something == "condition") {

   $_SESSION["message"] = "Your passwords didnt match! Make sure they are the same in both fields!";
   $_SESSION["message_type"] = 1;
   header("Location:register.php");
   exit();

}
Run Code Online (Sandbox Code Playgroud)

然后我有一个像这样的功能

function show_message() {
   global $_SESSION;

   if (isset($_SESSION["message"])) { 
      echo "<div class='site_message type_" . $_SESSION["message_type"] . "'>" . $_SESSION["message"] . "</div>"; 
      unset($_SESSION["message"]); 
      unset($_SESSION["message_type"]); 
   }
}
Run Code Online (Sandbox Code Playgroud)

我把show_message(); 在每个页面的顶部显示可能出现在此页面上的错误.

这可能有什么问题?

Gor*_*don 3

我认为这种方法没有什么问题。您会在很多框架中发现这种技术的不同名称,例如Zend Framework 中的 FlashMessenger。通常,Session 被包装在一个对象中,而不是常规的 Session 数组中,并且使用 ViewHelper 而不是函数。

为了确保分配消息时会话键中没有任何拼写错误,您也可以将分配代码包装到一个函数中,例如

function set_message($text, $type)
{
    $_SESSION['message'] = array(
        'text' => $text,
        'type' => $type
    );
}
Run Code Online (Sandbox Code Playgroud)

您可以通过让函数返回字符串而不是echoing 来改进它,我个人会用它sprintf来格式化输出。使代码更具可读性,恕我直言,例如

return sprintf('<div id="message-box" class="type-%s">%s</div>',
                $_SESSION["message"]["text"], 
                $_SESSION["message"]["type"]);
Run Code Online (Sandbox Code Playgroud)

就像@Gumbo 指出的那样,当会话不起作用时,该函数可能不起作用,但这可能会给整个应用程序带来许多其他问题,所以我不会完全担心这段特定的代码。

小事: $_SESSION 是一个超全局变量,因此您不必使用该global关键字。