Resources are passed by reference

When copying one resource to another, you're actually creating a reference to the original resource, this is not an actual copy.

This is illustrated by the following example:


echo '<pre>';
// create an image resource
$image = imagecreate(100, 100);

// print the resource
var_dump($image);
// the above prints "resource(30) of type (gd)"

// create a copy
// (actually creating a reference,
// although =& is not implicitly used)
$copy = $image;

// print the reference
var_dump($copy);

// the above prints "resource(30) of type (gd)", same as before

// destroy the image resource
imagedestroy($image);

// this prints "resource(30) of type (Unknown)"
// so the image was destroyed
var_dump($image);

// this also prints "resource(30) of type (Unknown)"
// meaning that the reference points to a destroyed image
var_dump($copy);

echo '</pre>';

Post this entry to: » del.icio.us  » Digg  » Furl  » Newsvine  » reddit  » Y!

Somewhat related posts

3 Responses to “Resources are passed by reference”

  1. Constantine Says:

    under PHP 5.0 and above !

  2. Marco Says:

    @Constantine, under PHP5, EVERYTHING is passed by reference unless we explicitly clone something. The great big change we've all been waiting for. I in fact refuse to take the Zend exam until it's PHP5ied because right now it would confuse the hell out of me.

    In PHP4, which Stoyan is referring to, a RESOURCE is passed by reference while anything else is passed by value. Try replacing the imagecreate line by $image = "foo"; and the imagedestroy line by unset($image); The copy will still result in a string in the var_dum($copy); line, indicating pass by value.

  3. Stoyan Says:

    That's right, thanks Marco. I had PHP4 in mind.

Leave a Reply