Hi Andi,

Okay, it's not as simple as I thought it was - and you're correct, the
behaviour has not changed for php4/5.

Objects in both PHP4 and PHP5 will throw an error if you use the method
$blah[$someobject] = 'val'; (first method)
Warning:  Illegal offset type

However, both do not throw an error if you use $blah = array($someobject =>
'val'); (second method)

When we compare this behaviour with resources, it gets interesting. A
resource is casted to an interger when used as an array key for the first
method, but not the second.

This raises a number of questions:
1) Should the behaviour of method 1, and method 2 be the same.
2) Should the behaviour of objects be the same as resources (in the context
of casting for use as an array key)

Below is a sample script which shows the differences

--------------------
<pre>
<?php
// Create a sample object
class id_obj { var $_id; function id_obj($id) { $this->_id = $id; } }
// Create two new objects
$id1 = new id_obj(1);
$id2 = new id_obj(2);
// Add them to an array with two different methods
$array = array(); $array[$id1] = 'sdf';
$array2 = array ($id1 => 'id1', $id2 => 'id2');
echo "objects: first method:\n";
var_dump($array);
echo "objects: second method:\n";
var_dump($array2);

// Create two resources
$fp1 = fsockopen("www.example.com", 80, $errno, $errstr, 30);
$fp2 = fsockopen("www.example.com", 80, $errno, $errstr, 30);
// Add them to an array with two different methods
$resarray = array(); $resarray[$fp1] = 'fp1';
$resarray2 = array($fp1 => 'fp1', $fp2 => 'fp2');
// Show the result
echo "resources: first method:\n";
var_dump($resarray);
echo "resources: second method:\n";
var_dump($resarray2);
?>
</pre>
--------------------

The output:

-----------
Warning:  Illegal offset type on line 9
objects: first method:
array(0) {
}
objects: second method:
array(0) {
}
resources: first method:
array(1) {
  [2]=>
  string(3) "fp1"
}
resources: second method:
array(0) {
}
--------------

Thanks.



"Andi Gutmans" <[EMAIL PROTECTED]> wrote in message
news:[EMAIL PROTECTED]
> This code doesn't seem to have changed. Can you send me a 3-4 liner which
> errors out in PHP 4 and not in PHP 4?
>
> Thanks,
>
> Andi
>
> At 11:03 PM 5/25/2004 +1000, Aidan Lister wrote:
> >I'm going to go ahead and post this as a bug, unless there is a reason
noone
> >replied...
> >
> >"Aidan Lister" <[EMAIL PROTECTED]> wrote in message
> >news:[EMAIL PROTECTED]
> > > Hello devs,
> > >
> > > I'd like to discuss the use of objects as array keys.
> > >
> > > <?php
> > > class idobject {
> > >     private $_id;
> > >     function __construct ($id) { $this->_id = $id; }
> > >     function __tostring () {  return (int)$this->_id; }
> > > }
> > >
> > > $blah1 = new idobject(1);
> > > $blah2 = new idobject(2);
> > > $blah3 = new idobject(3);
> > > $blah4 = new idobject(4);
> > >
> > > $array = array (
> > >  $blah1 => 'blah1',
> > >  $blah2 => 'blah2',
> > >  $blah3 => 'blah3',
> > >  $blah4 => 'blah4',
> > >  );
> > >
> > > echo "<pre>";
> > > var_dump($array);
> > > echo "</pre>";
> > > ?>
> > >
> > > In PHP4 this results in an error,
> > > In PHP5 there is no error, the array is simply empty.
> > >
> > > An array key can only be a string/int, thus, when someone attempts to
use
> >an
> > > array as a key would it not make sense to cast the object?
> > >
> > > This behaviour would then be consistant with resources.
> > >
> > > Regards,
> > > Aidan
> >
> >--
> >PHP Internals - PHP Runtime Development Mailing List
> >To unsubscribe, visit: http://www.php.net/unsub.php

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to