php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #8130 Changing a copy of an array affects the original
Submitted: 2000-12-05 20:28 UTC Modified: 2001-08-28 17:26 UTC
From: wstockal at msysgroup dot com Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 4.0.6-dev OS: Redhat Linux 6.2
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: wstockal at msysgroup dot com
New email:
PHP Version: OS:

 

 [2000-12-05 20:28 UTC] wstockal at msysgroup dot com
A short script:
<?php
  class test_class_2{
        var $name;
        function distort_reality(){
                 echo("Method Called.<br>\n");
                 return;
        }
  }
  $a[] = new test_class_2;
  $a[0]->name = 'Original';
  echo('$b = $a<br>'."\n");
  $b = $a;
  echo("Original contains: {$a[0]->name}<br>\n");
  echo("Copy contains: {$b[0]->name}<br><p>\n");
  echo("Change contents for \$b<br>\n");
  $b[0]->name = 'Copy';
  echo("Original contains: {$a[0]->name}<br>\n");
  echo("Copy contains: {$b[0]->name}<br><p>\n");
  $a[0]->distort_reality();
  echo('Once again, $b = $a<br>'."\n");
  $b = $a;
  echo("Original contains: {$a[0]->name}<br>\n");
  echo("Copy contains: {$b[0]->name}<br><p>\n");
  echo("Change contents for \$b<br>\n");
  $b[0]->name = 'Copy';
  echo("Original contains: {$a[0]->name}<br>\n");
  echo("Copy contains: {$b[0]->name}<br>\n");
?>

The output from the script:

$b = $a
Original contains: Original
Copy contains: Original

Change contents for $b
Original contains: Original
Copy contains: Copy


Method Called.
Once again, $b = $a
Original contains: Original
Copy contains: Original


Change contents for $b
Original contains: Copy
Copy contains: Copy

Basically, if $a is an array of objects and any method of an object is called any subsequent copy of $a becomes linked to the original.  Any change to the copy propagates through to the original.

Configure line:
 './configure' '--with-config-file-path=/usr/local/stronghold/conf' '--with-apxs=/usr/local/stronghold/bin/apxs' '--enable-versioning' '--disable-debug' '--with-zlib' '--with-gd=/usr/local' '--with-gdbm' '--with-db2' '--with-mysql' '--with-xml' '--with-ldap' '--with-cpdflib=/usr/local' '--with-png-dir=/usr' '--with-jpeg-dir=/usr' '--with-tiff-dir=/usr' '--with-xpm-dir=/usr/X11R6' '--enable-sysvshm=yes' '--enable-sysvsem=yes' '--enable-track-vars=yes' '--enable-bcmath=yes' '--enable-memory-limit=yes'

Running as a module under apache 1.3.14

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-12-06 11:23 UTC] wstockal at msysgroup dot com
OK, this only affects objects in the array whose methods
have been accessed.  Other objects are still copies.  It
also works on php-4.0.3pl1 on the Win32 platform.
 [2000-12-07 02:28 UTC] wstockal at msysgroup dot com
Is this the same as bug 6417?
 [2001-01-06 02:38 UTC] cynic@php.net
Confirmed in 4.0.4pl1 RC1
 [2001-04-28 15:27 UTC] jmoore@php.net
Reproduced in 4.0.6-dev one for the bug squash
 [2001-06-17 04:54 UTC] jmoore@php.net
This will not be fixed anytime soon. It is a deep seated problem in the implementation and fixing it would cause speed problems and numerous other problems, This is somthing that can be coded around too so should not cause massive problems.

- James
 [2001-08-28 17:26 UTC] wstockal at msysgroup dot com
This problem can also affect the private copies of variables
used inside of functions.

Script:

  class test {
        var $property;
        function do_something(){
                 return;
        }
  }
  function mangle($array_in) {
           $array_in[0]->property = 'trashed';
  }
  $array[0] = new test;
  $array[0]->property = 'ok';
  mangle($array);
  echo("<h2>Before:</h2>\n");
  echo("\$array[0]->property is {$array[0]->property}<br>\n");
  $array[0]->do_something();
  mangle($array);
  echo("<h2>After:</h2>\n");
  echo("\$array[0]->property is {$array[0]->property}<br>\n");


Output:

<h2>Before:</h2>
$array[0]->property is ok<br>
<h2>After:</h2>
$array[0]->property is trashed<br>

 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Nov 22 02:01:28 2024 UTC