Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to avoid call-time pass-by-reference deprecated error in PHP?

Tags:

php

I'm trying to reduce the warnings that are sent to my apache server log.

One warning is:

Call-time pass-by-reference has been deprecated.

It is hard for me to imagine why this was deprecated since it is such a useful programming feature, basically I do this:

public function takeScriptsWithMarker(&$lines, $marker) {

    ...
}

and I call this function repeatedly getting results back from it and processing them but also letting the array $lines build up by being sent into this method repeatedly.

  1. To reprogram this would be extensive.
  2. I don't want to just "turn off warnings" since I want to see other warnings.

So, as call-by-reference is deprecated, what is the "accepted way" to attain the functionality of this pattern: namely of sending an array of strings into a method, have them be changed by the method, then continuing to use that array?

like image 761
Edward Tanguay Avatar asked Jun 28 '09 21:06

Edward Tanguay


4 Answers

Actually, there's no problem with the way you define the function. Is a problem with the way you call the function. So for your example, instead of calling it like:

takeScriptsWithMarker(&$lines, $marker);

You'd call it like:

takeScriptsWithMarker($lines, $marker); // no ampersands :)

So the feature is still available. But I don't know the reason behind this change.

like image 194
Ionuț G. Stan Avatar answered Nov 08 '22 00:11

Ionuț G. Stan


like noted above in a previous answer, the issue is at CALL time, not definition time.. so you could define a function as:

function foo(&$var1,$var2,$var3=null){
    // procesing here
}

then call as:

$return = foo($invar1,$invar2);

your first invar is passed by reference, second one is not.

the error appears when you try to call like so:

$return = foo(&$invar1,$invar2);
like image 34
Jason Avatar answered Nov 08 '22 01:11

Jason


You can set allow_call_time_pass_reference to true in your php.ini file. But it's a hack.

like image 6
Otto Allmendinger Avatar answered Nov 08 '22 01:11

Otto Allmendinger


You could pass an array with a reference in:

public function takeScriptsWithMarker(array(&$lines, $marker))

which should only take a small amount of refactoring at the other end.

like image 1
jetboy Avatar answered Nov 08 '22 02:11

jetboy