On Wed, Nov 23, 2011 at 3:42 PM, Gustavo Lopes <glo...@nebm.ist.utl.pt>wrote:

> Em Wed, 23 Nov 2011 14:19:42 -0000, Ferenc Kovacs <tyr...@gmail.com>
> escreveu:
>
>  On Wed, Nov 23, 2011 at 3:14 PM, Daniel Convissor <
>> danielc@analysisandsolutions.**com <dani...@analysisandsolutions.com>>
>> wrote:
>>
>>  > It's actually very simple. Take variable $a which is a string
>>> > ("foo"). Now it you do $a[0] that would produce first letter - "f".
>>> > Now here's a tricky part - if you do $a['blah'] it would convert
>>> > 'blah' to number, get 0 and return the same letter "f".
>>>
>>> To me, this is the bug.  $a['blah'] does not exist.  An undefined index
>>> notice should be raised.  The key "blah" should not be converted to 0.
>>> The following two things should behave the same:
>>>
>>> $b = array('exists' => 'foo');
>>> echo $b['blah'] . "\n";
>>>
>>> $a = 'foo';
>>> echo $a['blah'] . "\n";
>>>
>>> But that second one echos out "f".  This is a huge WTF.
>>>
>>
>>
>> and the following should also behave the same:
>> $a = 'foo';
>>
>> echo $a[2];
>> echo $a['2'];
>> echo $a['2 cats'];
>>
>> because this is how the type juggling works in php:
>> http://php.net/manual/en/**language.types.type-juggling.**php<http://php.net/manual/en/language.types.type-juggling.php>
>>
>>
> But this is *not* (and afaik has never been) how indexes in arrays work.
> The conversion of array keys has always different rules:
>
> <?php
> $a['2 cats'] = null;
> var_dump($a);
> ^D
> array(1) {
>  ["2 cats"]=>
>  NULL
> }
>

yeah, because using associative arrays (hence strings as indexes) is a sane
operation.
but we are talking about strings here.


>
> The mapping between strings and integers used for arrays is 1 to 1, and
> strings that can be mapped to integers are always mapped (so you cannot
> have a '1' (string) key and a 1 (int) key). These different rules are what
> makes possible to store any kind of string in an array, and changing this
> would be a huge error.
>
> I see, however, that it's not the case for indexing strings, where the lax
> rules are followed:
>
> <?php
> $a = 'foo';
> var_dump($a['2 cats']);
> ^D
> string(1) "o"
>
> If there's any change to be made, it would be to change the way string
> indexing works, not the other way around.
>
>
php.net/manual/en/language.types.string.php#language.types.string.substr<http://hu.php.net/manual/en/language.types.string.php#language.types.string.substr>
"Non-integer types are converted to integer."
So it is a documented behavior, so the current change is just a bugfix imo.

-- 
Ferenc Kovács
@Tyr43l - http://tyrael.hu

Reply via email to