Why do undefined constants evaluate to true?

Try defined('WHATEVER_THIS_ISNT_DEFINED')

When PHP encounters a constant that is not defined, it throws an E_NOTICE, and uses the constant name you've tried to use as a string. That's why your snippet prints Huh!, because a non-empty string (which is not "0") will evaluate to true.

From the manual:

If you use an undefined constant, PHP assumes that you mean the name of the constant itself, just as if you called it as a string (CONSTANT vs "CONSTANT"). An error of level E_NOTICE will be issued when this happens.

If you set your error reporting level to report E_NOTICEs, which is a good practice during development, you will also see the notice thrown.

  • PHP Constant Syntax
  • defined()
  • Casting to Boolean
  • error_reporting
  • error_reporting() function

From the manual:

If you use an undefined constant, PHP assumes that you mean the name of the constant itself, just as if you called it as a string (CONSTANT vs "CONSTANT").

Basically, if WHATEVER_THIS_ISNT_DEFINED isn't defined, PHP interprets it as "WHATEVER_THIS_ISNT_DEFINED". Non-empty strings evaluate to true, so your expression will always pass (unless WHATEVER_THIS_ISNT_DEFINED is defined and set to a falsey value.)

This is, frankly, stupid behaviour. It was implemented, I believe, to allow things like $foo[bar] to work when the programmer should have used $foo['bar']. It's illogical behaviour like this that makes people think PHP isn't a real programming language.

The way to test whether a constant is defined is with defined.


Undefined constants are treated as strings by PHP: docs. Taking that fact, think it through in English language:

If "WHATEVER_THIS_ISNT_DEFINED", then do something.

... it is logical that it is "true" - you aren't comparing anything to anything else.

That is why, when doing if statements, it is best practice to include a specific evaluation. If you're checking for false, put it in the code: if (something === false) vs if (something). If you're checking to see if it is set, use isset, and so on.

Also, this highlights the importance of developing with notices and warnings enabled. Your server will throw a notice for this issue:

Notice: Use of undefined constant MY_CONST - assumed 'MY_CONST' in some_script.php on line 5

Turn on notices and warnings to develop, turn them off for production. Can only help!


Try defined(). If it's not defined then the constant assumes it's simply text.

Tags:

Php

Constants