Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do undefined constants evaluate to true?

Tags:

php

constants

Stupid question - I'm surprised this one has bitten me. Why do undefined constants in PHP evaluate to true?

Test case:

<?php
    if(WHATEVER_THIS_ISNT_DEFINED)
        echo 'Huh?';
?>

The above example prints 'Huh?'

Thanks so much for your help! :)

like image 249
rinogo Avatar asked Jun 01 '11 20:06

rinogo


4 Answers

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
like image 110
kapa Avatar answered Oct 14 '22 05:10

kapa


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.

like image 23
lonesomeday Avatar answered Oct 14 '22 07:10

lonesomeday


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!

like image 2
Chris Baker Avatar answered Oct 14 '22 07:10

Chris Baker


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

like image 2
Nev Stokes Avatar answered Oct 14 '22 05:10

Nev Stokes