2

有谁知道 isset 和 empty 是如何被翻译器解释的,或者翻译器如何处理未定义的变量?

为了扩展我的问题,我的包含文件中有以下代码:

define('USER_AUTH', !empty($_SESSION['username']) && !empty($_SESSION['status'])); //user is verified
define('ACC_IS_PENDING', $_SESSION['status'] == '0');//checks to see if user status is pending which has a status of 0

USER_AUTH 用于快速检查用户是否已通过身份验证。ACC_IS_PENDING 用作帐户状态未决时的快速手。但是,PHP 通知我第二行代码中的 $_SESSION['status'] 未定义。我知道它是未定义的,但我还没有使用它!你怎么敢把我已经知道的告诉我。哈哈

但是,当我使用以下代码欺骗代码时:

define('USER_AUTH', !isempty($_SESSION['username']) && !isempty($_SESSION['status']));
define('ACC_IS_PENDING', $_SESSION['status'] == '0');

其中 isempty() 是一个自定义函数,它将始终返回 FALSE。然后没通知!或者,如果我使用以下代码:

define('USER_AUTH', notempty($_SESSION['username']) && notempty($_SESSION['status']));
define('ACC_IS_PENDING', $_SESSION['status'] == '0');

notempty() 总是返回 TRUE,然后再没有通知。

我是否说翻译器检查了变量是否已经测试过一次,如果测试结果为真,那么翻译器会认为这是变量已定义?

如果是这样的话,那么isset和empty呢?无论评估是真是假,他们似乎都会给我通知。

define('USER_AUTH', isset($_SESSION['username']) && isset($_SESSION['status']));
define('ACC_IS_PENDING', $_SESSION['status'] == '0');

define('USER_AUTH', empty($_SESSION['username']) && empty($_SESSION['status']));
define('ACC_IS_PENDING', $_SESSION['status'] == '0');

为冗长的问题道歉。这似乎微不足道,但如果不需要通知就可以快速定义常量!对于此类琐碎任务的任何解释或更好的解决方案将不胜感激,谢谢!

4

2 回答 2

1

PHP 抱怨是因为数组中未定义索引“状态”。你需要写

!isset($_SESSION['status']) || empty($_SESSION['status']

当您按照所述“欺骗”代码时,PHP 将永远不会尝试访问不存在的数组索引,这就是您没有得到任何通知的原因。

在第四个代码示例(使用 isset)中,您仍在访问第二行代码中不存在的数组索引,所以我怀疑这就是为什么仍然有通知的原因。

于 2012-07-30T12:14:46.263 回答
1

a) 如果您想使用 $_SESSION['status'],您必须首先检查变量是否为空(有关详细信息,请参阅http://www.php.net/manual/fr/function.isset.php ) :

if (isset($_SESSION['status'])) {
     // here the value exists and can be used
     Do something...
} else {
     // here the value does not exist and cannot be used
}

b) 我相信

empty($_SESSION['username']) && !empty($_SESSION['status'])

不是恒定的:它从一个运行到另一个变化。您可能想使用

$user_is_logged = empty($_SESSION['username']) && !empty($_SESSION['status']);

并使用变量 $user_is_logged 而不是常量。请参阅本节http://www.php.net/manual/fr/language.constants.php了解有关常量的信息。

于 2012-07-30T12:15:13.977 回答