FAQ
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

Search Discussions

  • Aidan Lister at May 25, 2004 at 1:09 pm
    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
  • Andi Gutmans at May 25, 2004 at 1:13 pm
    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
  • Aidan Lister at May 25, 2004 at 2:31 pm
    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
  • Aidan Lister at May 29, 2004 at 12:52 pm
    Andi, any interest in this?

    "Aidan Lister" <aidan@php.net> wrote in message
    news:20040525143059.95129.qmail@pb1.pair.com...
    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

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupphp-internals @
categoriesphp
postedMay 22, '04 at 6:40a
activeMay 29, '04 at 12:52p
posts5
users2
websitephp.net

2 users in discussion

Aidan Lister: 4 posts Andi Gutmans: 1 post

People

Translate

site design / logo © 2022 Grokbase