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" <andi@zend.com> wrote in message
news:5.1.0.14.2.20040525161238.061c8f78@127.0.0.1...
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" <aidan@php.net> wrote in message
news:20040522064028.3397.qmail@pb1.pair.com...
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