Re: Assign by reference...
| From: | Benjamin Berman | Date: | Tue, 13 Jun 2000 21:38:15 +0000 |
| Subject: | Re: Assign by reference... | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-1766@lists.php.net to get a copy of this message | ||
Rasmus Lerdorf wrote:
> $a=1;
> $b[]=&$a;
> $a=2;
> $b[]=&$a;
Rasmus,
In the case of simple values like ints, I would expect the behavior that
you suggest, namely that re-assigning $a would change the value of
variable at location &$a. But for things like vectors and especially
objects, I expect it to allocate the variable somewhere else in dynamic
memory. This is what I am used to doing in other languages, where
calling "new Obj" gives you a -pointer- to the new object. Look at the
following example in Perl and C++:
------
Perl
------
package Obj;
sub new
{
my ($class) = @_;
my $self = {};
return bless $self, $class;
}
$obj = new Obj();
push(@arr, $obj);
$obj->{a} = 1;
$obj = new Obj();
push(@arr, $obj);
$obj->{a} = 2;
foreach $el (@arr)
{
print $el->{a}."\n";
}
-----
C++
-----
#include <stdio.h>
class Obj
{
public:
int a;
};
main()
{
Obj* obj;
Obj* new_arr[2];
int i;
obj = new Obj();
new_arr[0] = obj;
obj->a = 1;
obj = new Obj();
new_arr[1] = obj;
obj->a = 2;
for (i=0; i<=1; i++)
{
Obj* obj = new_arr[i];
printf("%d\n", obj->a);
}
}
Both of these output "1,2". The same program could be written in java.
It is very natural in all three languages. My question is, can you do
it in PHP4?
thanks for your help,
ben.
Rasmus Lerdorf wrote:
>
> On Mon, 12 Jun 2000, Benjamin Berman wrote:
>
> > I'm having a problem with the new assign by reference feature in PHP4.
> > Consider the following code; it's an artificial example that takes an
> > array of numbers, for instance (1,2,3) and transforms it into an array
> > of arrays, where each array contains multiples of the original number,
> > for instance ((1,10,100), (2,20,200), (3, 30, 300)). Here is the code:
> >
> >
> > 1 $num_arr = array(1, 2, 3);
> > 2 $multiples_arr = array();
> > 3 while (list($key, $val) = each($num_arr))
> > 4 {
> > 5 $mult_arr = array($val, $val*10, $val*100);
> > 6 $multiples_arr[] = &$mult_arr;
> > 7 }
> > 8
> > 9 while (list($key, $mult_arr) = each($multiples_arr))
> > 10 {
> > 11 print join(",",$mult_arr)."<BR>\n";
> > 12 }
> >
> >
> > I would expect to get the output:
> >
> > 1,10,100
> > 2,20,200
> > 3,30,300
> >
> > But instead, I get the following:
> >
> > 3,30,300
> > 3,30,300
> > 3,30,300
> >
> >
> > This is counter-intuitive with respect to other programming languages
> > I've used. I can guess what's happening underneath to make PHP display
> > this behavior, but it still seems to contradict my notion of what
> > "assignment by reference" means. Is there any way to get PHP to do what
> > I want it to do here?
>
> I don't understand why you think this is counter-intuitive. To simplify
> it way down, you are basically doing:
>
> $a=1;
> $b[]=&$a;
> $a=2;
> $b[]=&$a;
>
> and you expect the $b array to contain 1,2
>
> But since all you are doing is putting a pointer to $a into the $b array
> twice, then you cannot possibly have different values in each slot. That
> is the whole point of references. There is only 1 copy of $a here.
>
> -Rasmus