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_NOTICE
s, 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.