使用 return 跳过 php 文件的其余部分是否安全


Is it safe to use return to skip rest of php file?

我的PHP应用程序看起来像这样:

<?php
// File: index.php
// some code...
include( 'template/header.php' );
// More code, for example:
echo "Subscribe to our newsletter here: ...";

和模板文件:

<?php
// File: template/header.php
$user = get_loggedin_user()
if ( ! $user ) {
  echo 'Please log in';
  return;  // Question is about this statement!
}
// Long PHP code follows, for simplicity reduce it to:
echo "You are logged in as $user";

您可以在模板/标题中的条件中看到.php如果用户未登录,我使用 return 跳过标题。我不想使用else因为下面的代码很长而且嵌套,所以我想避免在这里添加另一个嵌套级别......

return的这种用法似乎在 php 5.6 上正常工作

问题:

  • 这是正确的,还是有更合适的方法来跳过头文件的其余部分?
  • 你知道PHP可以在这里抛出的任何通知/警告/错误吗?

简短回答:

可能,安全,官方支持。

成功的包含,除非被包含的文件覆盖,否则返回 1。可以在包含的文件内执行 return 语句,以便终止该文件中的处理并返回到调用它的脚本。此外,还可以从包含的文件中返回值。

例:

<?php
// return.php
$var = 'PHP';
return $var;
?>
<?php
// noreturn.php
$var = 'PHP';
?>
<?php
// Test script
$foo = include 'return.php';
echo $foo; // prints 'PHP'
$bar = include 'noreturn.php';
echo $bar; // prints 1
?>

我喜欢做的是自定义异常,因为即使您调用带有登录验证的函数,您也可以捕获异常。

如果 PHP 代码在当前范围内,则返回应该足够,但在验证用户是否在函数中登录时,返回是不够的。

为了证明这一点,我在下面附加了 2 个 PHP 文件,索引.php我假设的文件是您正在执行的文件和一个名为 func.php 的函数文件。

索引.php

<?php
require('func.php');
try {
  $user = get_loggedin_user();
} catch(NotLoggedInException $e) {
  echo 'do your redirect here';
  die();
}
var_dump($user); // shows user value

功能.php

<?php
class NotLoggedInException extends Exception {
}

function get_loggedin_user() {
    throw new NotLoggedInException("User is not logged in");
}