【问题标题】:Undefined variable in IF statement (but seems correctly declared)IF 语句中的未定义变量(但似乎正确声明)
【发布时间】:2016-02-10 21:55:34
【问题描述】:

有些事情让我抓狂,如果我在 IF 语句中声明一个变量,我会得到一个未定义的变量。如果我在 IF 语句上方声明此变量,PHP 通知就会消失。

我的代码:

if($tab_sel==FILENAME_DEFAULT){ // FILENAME_DEFAULT = index.php
  if(...){
       some functions
  }
  $nb_pages=ceil($count/$limit) : 0;
}
echo $nb_pages; //4000 is displayed on the page (OK), 

但在 Nginx 日志中,我得到:

FastCGI sent in stderr: "PHP message: PHP Notice : Undefined variable nb_pages in /.../index.php

但是当我加载页面时,我可以看到nb_page正确显示(例如:值为4000),但是在日志中,未定义的变量..

在我的示例中,如果我在“if($tab_sel==FILENAME_DEFAULT){”上方声明 nb_pages,未定义的就会消失。

有什么想法吗?

【问题讨论】:

  • 如果$tab_sel != 'index.php' 则不会定义$nb_pages。
  • 如果只有 $tab_sel==FILENAME_DEFAULT,则定义了 $nb_pages。
  • 谢谢,但 FILENAME_DEFAULT=index.php,否则我不会在页面上看到 nb_pages=4000
  • 您对变量范围感到困惑。我敢打赌,错误实际上是在 echo nb_page 行引发的。如果您在 if 块内定义 nb_page,它将仅在 if 块的生命周期内可用。 -- 除非有文档另有说明。
  • 你确定那个丹?我认为我们可以在 if 块中声明一个变量并在外部使用它,不是吗?

标签: php html nginx undefined


【解决方案1】:

那是因为您在 a 中创建了变量,如果它可能无法通过。在这种情况下,该变量将是未定义的,PHP 将抛出一个错误,因为它无法找到您之后要求的变量。

在 if 之前声明它就可以了。

$nb_pages;
if($tab_sel==FILENAME_DEFAULT){ 
  if(...){

【讨论】:

  • 是的,但是为什么它应该在 IF 之外声明,IF 语句不是 php 范围,对吧?只有函数是 php 作用域,不是吗?
  • @Julien 否。如果外部 if 语句返回 false,则永远不会创建变量,因此可能会引发未定义变量错误。
  • 你只是在if里面声明变量,当然如果if有效你可以使用它,但是如果条件不成立,这个变量永远不会被声明。
  • 是的,但它确实在 if 中,否则我不会在网站上看到 nb_pages=4000,不是吗?即使在开发服务器(我使用easyphp)中,也没有错误,并且显示为4000,但是在nginx日志上,我收到此警告,我不明白..
  • 好吧,如果条件匹配,它将起作用。日志中的警告是说它可能会在不匹配条件的情况下引发错误,这就是为什么它是一个警告。
【解决方案2】:

我认为这可能是环境问题。尝试将FILENAME_DEFAULT 和$nb_pages 都放入日志文件中:

file_put_contents(
    'test.log',
    date('[Y-m-d H:i:s] ') 
    . FILENAME_DEFAULT . "\t" . @$nb_pages . PHP_EOL,
    FILE_APPEND
);

@ 将阻止警告消息。

【讨论】:

    【解决方案3】:

    我找到了为什么它不起作用:

    in case of a 404 error page (called FILENAME_404)
    

    我还使用 index.php 文件,我在其中调用未声明的变量。

    这就是 Nginx 错误提到 index.php 的原因,不是因为它没有进入 if($tab_sel==FILENAME_DEFAULT){,而是因为在其他一些情况下我也使用 index.php 与tab_sel=FILENAME_404

    谢谢大家!

    【讨论】:

    • 这正是我所说的。在这些情况下,条件将不匹配。由于这些情况,这就是导致警告的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多