有谁知道翻译器如何解释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,则再次没有通知。
我的意思是,翻译器检查该变量是否已经测试过一次,并且如果测试结果为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');
对于长期存在的问题,我们深表歉意。这看似微不足道,但拥有一个快速定义的常量而无需通知就很好了!谢谢您对这种琐碎任务的解释或更好的解决方案,谢谢!
我忘了提到自定义函数后附有&,以确保变量通过引用传递。 像这样:function isempty(&$ var){...}
为什么不做IF条件以便define? 我认为您做的事情太复杂了。
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。
谢谢您的意见。我感到非常困惑,因为我认为第一行代码和第二行代码之间存在某种关系(请参阅我的其他评论)。当我欺骗第一行代码时,它停止了第二行代码的通知。因此,我感到困惑。我现在知道这与常量无关,而是PHP如何以自上而下的方式解释我的代码。看,我以为常数在被引用时就被评估了。但是,事实并非如此,PHP一旦获取代码,就会对其进行评估。谢谢!
如果您想在编写常量时对其求值,那么我认为函数是更好的选择。
PHP抱怨,因为未在数组中定义索引"状态"。 你需要写
!isset($_SESSION['status']) || empty($_SESSION['status']
当您"欺骗"所描述的代码时,PHP将永远不会尝试访问不存在的数组索引,这就是为什么您不会得到任何通知的原因。
在第四个代码示例(带有isset)中,您仍然在第二行代码中访问不存在的数组索引,因此我怀疑这就是为什么仍然有一个提示。
实际上,根据php.net/manual/en/function.empty.php上的文档,即使变量不存在,empty()语言构造也不会发出警告,因此,请仔细检查isset()和empty ()不需要。
@Andreas,谢谢您的投入。您说的如何欺骗PHP使其不在不存在的数组索引中查找的内容使您有点不高兴!所以我去用我的代码做更多的测试。因为我想知道为什么第一行代码(被欺骗时)阻止了第二行代码的通知。我很困惑。因此,当我欺骗PHP时,它继续进行操作并将该变量定义为null,因此在我第一次欺骗它之后,这些通知就再也不会困扰我。有了isset和empty函数,它就永远不会以这种方式开始工作!感谢您让我意识到这一点。