> > I have a feeling that PHP has a memory problem somewhere :/.
I'm not sure if it caused any of the issues either of you spoke of,
but I can report that PHP does have some pointer problems. I've
been putting off this email until I had written up something nicer,
but it's probably better to just get the word out (assuming this isn't
already known)...
PHP has problems related to using a temporary as the source for a
reference. An obvious no-no is to write "$x =& NULL;" or
"$x =& @$y[5];". These are parse errors. On the other hand, PHP won't
complain about:
function &f() {
$y = array();
return @$y[5];
}
$x =& f();
It even acts OK. The above code could be a mistake or it could be
a misguided attempt at optimization (believing that keeping a ref
to a temporary is better than setting $x equal to the temporary).
Maybe there was a desire to modify $y if applicable, but otherwise
be OK with modifying a temporary. In any case, if you have a large
enough system and code like that lying around, there's a good chance
you'll get crashes. You may not get a crash but instead see unrelated
data mysteriously changed in functions that get called later.
There are at least 2 ways to adjust the code above to make PHP
happy. One is to remove the "&" in the assignment. Another is
to create a "real" temporary variable instead of letting PHP make its
own temporary. ie
function &f() {
$y = array();
$temp = @$y[5];
return $temp;
}
$x =& f();
I've had crashes go away and mysterious data overwrites go away with
the only change to the system being replacing a piece of code like
the first block of this email with a piece of code like the second
block. This has happened for just about every kind of "=& temp" you
can think of. Here are a few examples (in addition to the case above)
of using temporaries as sources for references. I think we've had a
crash / mysterious data overwrite for just about all of these (if not
all).
function f1() {
$y = 5;
return $y;
}
$x =& f1(); // Get rid of the & or add an & to f1
function &f2() {
return NULL; // Get rid of & below or use "$r = NULL; return $r;"
}
$x =& f2();
function g() {
return NULL;
}
function h(&$x) {
$x = 5;
}
h(g());
That last one could use some combination of the above recommendations
to be fixed. For the record, I agree that there are few (if any) cases
where the above code is the best code for a design problem, but I also
dislike that these code blocks can lead to crashes / corruptions.
BTW, we have never had a problem with using a temporary reference as
the source for a non-reference copy. That is to say the following has
never caused us a problem:
function &f() {
$y = 5;
return $y;
}
$x = f();
Best of luck,
Todd
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php