Re: A really wacky design decision
| From: | clancy_1 at cybec dot com dot au | Date: | Sun, 04 Oct 2009 10:36:37 +0000 |
| Subject: | Re: A really wacky design decision | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-298547@lists.php.net to get a copy of this message | ||
On Sat, 03 Oct 2009 11:57:36 -0400, fsb@thefsb.org (Tom Worster) wrote:
>On 10/3/09 7:21 AM, "clancy_1@cybec.com.au" <clancy_1@cybec.com.au> wrote:
>
>> However there is one feature of PHP which, to my mind, is really bad design.
>> How many of
>> you can see anything wrong with the following procedure to search a list of
>> names for a
>> particular name?
>>
>> $i = 0; $j = count ($names); while ($i < $j)
>> { if ($names[$i] == $target) { break; }
>> ++$i;
>> }
>>
>> As long as the names are conventional names, this procedure is probably safe
>> to use.
>> However if you allow the names to be general alphanumeric strings, it is not
>> reliable. One
>> of my programs recently broke down in one particular case, and when I
>> eventually isolated
>> the bug I discovered that it was matching '2260' to '226E1'. (The logic
>> of
>> this is: 226E1
>> = 226*10^1 = 2260).
>>
>> I agree that I was well aware of this trap, and that I should not have used a
>> simple
>> comparison, but it seems to me to be a bizarre design decision to assume that
>> anything
>> which can be converted to an integer, using any of the available notations, is
>> in fact an
>> integer, rather than making the default to simply treat it as a string.
>
>this is odd.
>
>i might think it ok for (2260 == '226E1') to be true since php would be
>doing type juggling in a logical left-to-right manner: we start with an
>integer 2260, next is the juggling comparison operator, then a string, so it
>might reasonably try to convert the string to an integer and then compare.
>
>but with ('2260' == '226E1'), where both lhs and rhs are already of the same
>time, it seems elliptical, to say the least, that php should search the
>types to which it can convert the strings looking for one in which they are
>equal.
The order doesn't matter; 2260 == 226e1, and 226e1==2260.
It looks as if (for comparisons) PHP's order of preference is Integer > Real > ?? > ??
>
String.
If you use '==' it will try to convert everything to integer, but if you use
'===' it will
try to render them in some standard format (so that 226e1 === 2.26e3), but will not
convert real to integer. Despite which if you print them without specifying a format it
will print them all as 2260.
All very messy!
Clancy