What does the PHP error message “Notice: Use of undefined constant” mean?

前端 未结 9 2181
悲&欢浪女
悲&欢浪女 2020-11-21 05:04

PHP is writing this error in the logs: \"Notice: Use of undefined constant\".

Error in logs:

PHP Notice:  Use of undefined constant          


        
9条回答
  •  长情又很酷
    2020-11-21 06:07

    The error message is due to the unfortunate fact that PHP will implicitly declare an unknown token as a constant string of the same name.

    That is, it's trying to interpret this (note the missing quote marks):

    $_POST[department]
    

    The only valid way this would be valid syntax in PHP is if there was previously a constant department defined. So sadly, rather than dying with a Fatal error at this point, it issues this Notice and acts as though a constant had been defined with the same name and value:

    // Implicit declaration of constant called department with value 'department'
    define('department', 'department');  
    

    There are various ways you can get this error message, but they all have the same root cause - a token that could be a constant.

    Strings missing quotes: $my_array[bad_key]

    This is what the problem is in your case, and it's because you've got string array keys that haven't been quoted. Fixing the string keys will fix the bug:

    Change:

    $department = mysql_real_escape_string($_POST[department]);
    ...(etc)...
    

    To:

    $department = mysql_real_escape_string($_POST['department']);
    ...(etc)...
    

    Variable missing dollar sign: var_without_dollar

    Another reason you might see this error message is if you leave off the $ from a variable, or $this-> from a member. Eg, either of the following would cause a similar error message:

    my_local;   // should be $my_local
    my_member;  // should be $this->my_member
    

    Invalid character in variable name: $bad-variable-name

    A similar but more subtle issue can result if you try to use a disallowed character in a variable name - a hyphen (-) instead of an underscore _ would be a common case.

    For example, this is OK, since underscores are allowed in variable names:

    if (123 === $my_var) {
      do_something();
    }
    

    But this isn't:

    if (123 === $my-var) {
      do_something();
    }
    

    It'll be interpreted the same as this:

    if (123 === $my - var) {  // variable $my minus constant 'var'
      do_something();
    }
    

    Referring to a class constant without specifying the class scope

    In order to refer to a class constant you need to specify the class scope with ::, if you miss this off PHP will think you're talking about a global define().

    Eg:

    class MyClass {
      const MY_CONST = 123;
    
      public function my_method() {
        return self::MY_CONST;  // This is fine
      }
    
    
      public function my_method() {
        return MyClass::MY_CONST;  // This is fine
      }
    
      public function my_bad_method() {
        return MY_CONST;  // BUG - need to specify class scope
      }
    }
    

    Using a constant that's not defined in this version of PHP, or is defined in an extension that's not installed

    There are some system-defined constants that only exist in newer versions of PHP, for example the mode option constants for round() such as PHP_ROUND_HALF_DOWN only exist in PHP 5.3 or later.

    So if you tried to use this feature in PHP 5.2, say:

    $rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);
    

    You'd get this error message:

    Use of undefined constant PHP_ROUND_HALF_DOWN - assumed 'PHP_ROUND_HALF_DOWN' Warning (2): Wrong parameter count for round()

提交回复
热议问题