2012-07-30 85 views
2

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

为了扩大我的问题,我有下面的代码在我的包含文件:

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'); 

很抱歉没能长篇大论的问题。这看起来微不足道,但如果有一个快速定义的常量而不需要通知,那将是很好的选择!任何帮助解释或更好的解决这种琐碎的任务将不胜感激,谢谢!

+0

我忘了提及自定义函数附加了一个&以确保该变量通过引用传递。像这样: 函数isempty(&$ var){...} – chaser 2012-07-30 11:53:45

+0

为什么不创建一个IF条件来定义某些东西?我认为当它不是这样的时候,它会使事情变得复杂。 – Gntem 2012-07-30 12:10:50

回答

1

PHP抱怨,因为索引'状态'没有在数组中定义。你需要写

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

当您的“绝招”的代码所描述的,PHP将永远不会尝试访问不存在的数组索引,这就是为什么你没有得到任何通知。

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

+0

实际上,即使变量不存在,empty()语言构造也不应该发出警告,按照http://www.php.net/manual上的文档/en/function.empty.php,因此不需要使用isset()和empty()的双重检查。 – 2012-07-30 12:29:41

+0

@Andreas,感谢您的意见。你说关于欺骗PHP不要在不存在的数组索引中查找一下DUH!所以我去用我的代码做更多的测试。因为我想知道为什么第一行代码(当被欺骗时)停止了第二行代码的通知。我很困惑。 所以当我欺骗PHP时,它继续前进,并将此变量定义为null,所以在我第一次欺骗它之后,通知从来没有回过来困扰我。 使用isset和空函数,它应该从来没有以这种方式开始工作!感谢让我意识到这一点。 – chaser 2012-07-30 12:45:38

1

a)如果你想用$ _SESSION [“状态”],你必须先检查该变量不为空(见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

+0

感谢您的意见。我非常困惑,因为我认为第一行代码和第二行代码之间存在关系(请参阅我的其他评论)。当我欺骗第一行代码时,它停止了第二行代码的通知。因此,我的困惑。我现在知道这与常量无关,而是PHP如何以自上而下的方式解释我的代码。看,我认为常量是在被引用时评估的。但是这不是真的,只要PHP到达代码就会被评估。日Thnx! – chaser 2012-07-30 12:57:38

+0

如果你想在写一个常量时被评估,那么我认为一个函数是一个交易。 – 2012-07-30 14:55:25

+0

感谢堆,功能似乎是一个更好的主意:) – chaser 2012-07-31 01:17:51