imliam/php-catch-exit

优雅地处理不想要的退出语句。

v1.0.0 2018-09-08 16:18 UTC

This package is auto-updated.

Last update: 2024-08-29 04:57:26 UTC


README

Latest Version on Packagist Total Downloads License

优雅地处理不想要的退出语句。

🤔 常见问题解答

为什么你需要这个?

实际上,这根本不需要。在现代化的PHP应用程序中,几乎没有任何实际的理由要在exit语句和异常之间进行选择,因为所有框架都有自己的优秀、可扩展的异常处理器,应该充分利用。

话虽如此,许多初学者PHP教程最终都会展示类似的首次数据库连接代码

<?php
$db = mysql_connect(...) or die('Could not connect.');

幸运的是,这已经成为过去的事情了,但遗憾的是,这种做法似乎仍然有人在用。在过去几年里,我偶尔还是会遇到在发生错误时仍然使用exitdie语句的Composer包。

应该完全避免这些包 - 或者更好的做法是,在它们出现时进行分支或提交拉取请求。

那么为什么要这样做呢?

这个包/函数更像是一个证明概念,展示了如何处理这些情况,而不是一个严肃的建议,说明如何继续使用它们。

💾 安装

您可以使用以下命令使用Composer安装该包

composer require imliam/php-catch-exit:^1.0.0

📝 使用

如果您之前编写过基本的退出语句,您会理解,如果在那个点输出缓冲区为空,您将在浏览器中看到一个空白白色屏幕,上面显示的是传递给该语句的文本。

exit('Something went wrong.');

此包添加了一个辅助函数,它将接受一个闭包作为第一个参数。这个闭包是您可以添加任何预期可能会抛出退出语句的代码的地方 - 就像try-catch语句中的try块一样。

假设没有发生退出,您可以从这个闭包中返回一个值,并像平常一样继续应用程序。

$var = catch_exit(function() {
    return "It's all okay.";
}, ...);

echo $var; // "It's all okay."

打印字符串

该函数的第二个参数可以接受一个字符串,如果闭包中的第一个参数发生早期退出,则将其输出到缓冲区。

这让您可以选择显示什么,而不是可能无法控制的内容。

catch_exit(function() {
    exit('Uh-oh!');
}, 'Something went wrong.');

// 'Something went wrong.' is displayed

您还可以使用此功能渲染一个视图,以便在发生这种情况时向用户显示。

执行闭包

然而,第二个参数也可以是另一个闭包,它仅当第一个闭包中发生早期退出时才会执行。它还将提供对当前输出缓冲区的访问权限

在这里,您可以优雅地处理应用程序的关闭方式。您可能想要执行一些操作,例如

  • 记录发生的错误
  • 向会话中发送消息,通知用户发生了什么
  • 向用户渲染错误页面
  • 将用户重定向回上一页
catch_exit(function() {
    exit('Uh-oh, something went wrong!');
}, function($message) {
    Log::error("The application exited with the following message: '{$message}'");

    return View::make('errors.500')
        ->with('error', 'An unexpected error occurred.');
});

这也可以用来处理致命错误,例如当尝试实例化不存在的类或请求超过PHP的最大执行时间时。

catch_exit(function() {
    new ClassThatDoesNotExist();
}, function($message) {
    // ...
});

🔖 变更日志

请参阅变更日志文件以获取有关最近更改的更多信息。

⬆️ 升级

请参阅升级文件以获取有关从先前版本升级的详细信息。

🎉 贡献

请参阅贡献文件行为准则,了解如何为项目做出贡献的详细信息。

🔒 安全性

如果您发现任何安全相关的问题,请发送电子邮件至liam@liamhammett.com,而不是使用问题跟踪器。

👷 贡献者

♻️ 许可证

MIT许可证(MIT)。请参阅许可文件以获取更多信息。