[Fwd: [PHP] constant() - php5]

php.internals

Jochem Maas

21 years ago
hi, I just wanted to say about 'include' ... er no actually I have this little thing with constant() which I asked about on php-generals and the response from a couple of regulars suggest it might be a bug, or more correctly, an inconsistency. Jason Barnett wrote also:
> tested with PHP 5.0.5-dev > > <?php > > /* Causes E_WARNING */ > echo "constant('UNDEFINED_CONSTANT')\n"; > echo constant('UNDEFINED_CONSTANT'); > > /* Causes E_NOTICE */ > echo "UNDEFINED_CONSTANT\n"; > echo UNDEFINED_CONSTANT; > > ?>
should(may) I submit a bugreport? -------- Original Message -------- anybody here know what the logic is behind constant() triggering a warning if the named constant is not found? contrived example: <? $cnst = "DEBUG"; // what I want to do but can't if ($dbg = constant($cnst)) { // do stuff } // the only real option, it seems - bit long winded to get round a stupid (IMHO) if (defined($cnst) && ($dbg = constant($cnst))) { // do stuff } PLEASE - nobody need bother to tell me about the @ operator, I am aware of it but I don't want to use it in this case. (addition: not for a warning) thanks & rgds, jochem

Pawel Bernat

21 years ago
> <? > > $cnst = "DEBUG"; > > // what I want to do but can't > if ($dbg = constant($cnst)) { > // do stuff > } > > // the only real option, it seems - bit long winded to get round a stupid (IMHO) > if (defined($cnst) && ($dbg = constant($cnst))) { > // do stuff > }
What is stupid with validating name before using it? p.
-- Paweł Bernat; uselessness' lover; select'<asm'||chr(64)||'asm'||'.'||'flynet'||chr(46)||'pl>'as email; Slowly and surely the unix crept up on the Nintendo user ...

Jochem Maas

21 years ago
Pawel Bernat wrote:
>><? >> >>$cnst = "DEBUG"; >> >>// what I want to do but can't >>if ($dbg = constant($cnst)) { >> // do stuff >>} >> >>// the only real option, it seems - bit long winded to get round a stupid (IMHO) >>if (defined($cnst) && ($dbg = constant($cnst))) { >> // do stuff >>} > > What is stupid with validating name before using it?
its inconsistent to trigger an E_WARNING when doing: echo constant('CNST'); when: echo CNST; only triggers an E_NOTICE. (assuming, in both cases that CNST is not defined). IMHO it should at most trigger an E_NOTICE.

Derick Rethans

21 years ago
On Fri, 1 Jul 2005, Jochem Maas wrote:
> echo constant('CNST'); > > when: > > echo CNST; > > only triggers an E_NOTICE. > (assuming, in both cases that CNST is not defined). > > IMHO it should at most trigger an E_NOTICE.
Did you compare the output of the two statements? echo constant('CNST'); shows nothing (except the warning) echo CNST; shows "CNST" (and a notice). This makes perfect sense to me to differentiate between them like this. Derick
-- Derick Rethans http://derickrethans.nl | http://ez.no | http://xdebug.org

Jochem Maas

21 years ago
Derick Rethans wrote:
> On Fri, 1 Jul 2005, Jochem Maas wrote: > > >>echo constant('CNST'); >> >>when: >> >>echo CNST; >> >>only triggers an E_NOTICE. >>(assuming, in both cases that CNST is not defined). >> >>IMHO it should at most trigger an E_NOTICE. > > > Did you compare the output of the two statements?
I did.
> echo constant('CNST'); > shows nothing (except the warning) > > echo CNST; > shows "CNST" (and a notice). > > This makes perfect sense to me to differentiate between them like this.
ok - agreed that the echo behaviour is logical - but I wasn't actually pertaining to the echo behaviour (and what was being echo'ed wasn't relevant to my original question). my point is that using a constant directly in your code when that constant doesn't exist only causes an E_NOTICE but passing a string to constant() when a constant of the given name doesn't exist causes an E_WARNING. I would either expect both to cause the same level of error OR that trying to use an undefined constant directly in code would cause a lower level of error. but if you say the error output behaviour is expected/correct/desired then I'm happy to except it (and adjust my expectations accordingly) - if you (anyone) could explain why (because I don't grok the logic behind this behaviour) I would be very grateful, maybe it will bring me one step closer to being able to call myself a real programmer. :-/ anyway thanks for taking the time to reply, I gather that you, Derick (amongst others!), have a plate full of PHP work in the form of unicode and date related stuff (which I am very much looking forward to!) - i.e. you are busy-busy, time is short, etc etc. kind rgds, Jochem

Nicholas Telford

21 years ago
Due to PHPs dynamic typing, unquoted strings are treated as strings unless a constant by that name exists. Thankfully it's clever enough to raise a notice to tell you it couldn't find a constant by that name, which makes debugging much easier. The reason constant() throws a warning rather than a notice is because PHP knows you're looking for a constant by that name and flags it as a more serious error, wheras before, it could just be that you want to use an unquoted string :) If you think it's a bit strange, it may seem so, but logically, if an unquoted number is equivilent to it's quoted counter-part, the same must be true for strings. Nicholas Telford Jochem Maas wrote: