ID:               47345
 User updated by:  alt dot e-mail at gmx dot de
 Reported By:      alt dot e-mail at gmx dot de
 Status:           Open
 Bug Type:         Feature/Change Request
 Operating System: Irrelevant
 PHP Version:      5.3.0beta1
 New Comment:

Addendum:

The code for my suggestion should really be:
$newColors = array();
foreach ( $colors as $color ) {
    try { $newColors[] = clone $color; }
    // do nothing, error in __clone-method or whatever
    catch ( MySomethingException $e ) {}
    // Not an object, can't be cloned, "TypeException" would be
    // the exception PHP throws for non-clonables.
    // Really do not care what that name is, just that there is one.
    catch ( TypeException $e ) { $newColors[] = $color; }
}


Previous Comments:
------------------------------------------------------------------------

[2009-02-09 09:27:01] alt dot e-mail at gmx dot de

Description:
------------
Since v5.2.5, cloning a non-object results in a fatal error. In  my
opinion that is the wrong behaviour!

It's not really a fatal error (as in DEATH, CORE-DUMP,
END-OF-THE-WORLD) to clone a non-object. It's really just an exception
(as in OOPS, HELP?, DO-WHAT-NOW?), that should be user-catchable.

A practical example:

I have an array where the values are strings or objects that can be
cast to string with "__toString". If I want to create a copy of that
array, I also need to clone the objects. 

Reproduce code:
---------------
<?php
class Color {
    // assume their values are between 0.0 and 1.0
    private $r, $g, $b;
    public function toString() {
        return sprintf("#%02X%02X%02X",
        (int)$this->r*255, (int)$this->g*255, (int)$this->b*255);
    }
}
// somewhere in your code you create an array of colors
$colors = array(
    "#FFF000", new Color( 0, 0, 1 ), // and many more
);
// somewhere else you want to copy that array
// this is the current way
$newColors = array();
foreach ( $colors as $color ) {
    if ( is_object( $color ) {
        try { $newColors[] = clone $color; }
        // do nothing, error in __clone-method or whatever
        catch ( MySomethingException $e ) {}
    }
    else { $newColors[] = $color; }
}
// this is the way it should be
$newColors = array();
foreach ( $colors as $color ) {
    try { $newColors[] = clone $color; }
    catch ( TypeException/*or something*/ $e ) { $newColors[] = $color;
}
}



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=47345&edit=1

Reply via email to