RE: [PHP] A really wacky design decision
| From: | Andrea Giammarchi | Date: | Sat, 03 Oct 2009 11:39:53 +0000 |
| Subject: | RE: [PHP] A really wacky design decision | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-298507@lists.php.net to get a copy of this message | ||
And then you discover ===
$i = 0; $j = count ($names); while ($i < $j)
{ if ($names[$i] === $target) { break; }
++$i;
}
... regards
> To: php-general@lists.php.net
> From: clancy_1@cybec.com.au
> Date: Sat, 3 Oct 2009 21:21:00 +1000
> Subject: [PHP] A really wacky design decision
>
> Daevid Vincent is surprised that:
>
> $num = 123;
> $num = $num++;
> print $num; //this prints 123 and not 124 ?!!
>
> To me this is relatively logical. As I understand it, the post-increment operator says "do
> something with the variable, and then increment it. The trouble in this case is that we
> are doing something irrational; we are copying the number back to itself, and to me it is
> reasonably logical (or at least no less illogical than the alternative) to assume that if
> we copy it to itself, then increment the original version, the copy will not be
> incremented.
>
> 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. It is also a trap
> that it is very easy to fall into if you start off thinking about simple names, and then
> extend (or borrow) the procedure to use more general strings.
>
> And can anyone tell me whether, in the above case, it is sufficient to write simply:
> if ((string) $names[$i] == $target),
>
> or should I write:
> if ((string) $names[$i] == (string) $target)?
>
> (I decided to play safe and use strcmp ().)
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
_________________________________________________________________
Windows Live: Keep your friends up to date with what you do online.
http://www.microsoft.com/middleeast/windows/windowslive/see-it-in-action/social-network-basics.aspx?ocid=PID23461::T:WLMTAGL:ON:WL:en-xm:SI_SB_1:092010