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

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

Posted by: admin April 23, 2020 Leave a comment

Questions:

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?

How to&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.

Answer:

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);

Answer:

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

Answer:

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.

Answer:

You could pass in the array, let it manipulate it, and then “return” it, instead of messing with the original reference. It shouldn’t be too hard to just include a return and assignment.

public function takeScriptsWithMarker($lines, $marker) {
    //...
    return $lines;
}

Usage:

$lines = takeScriptsWithMarker($lines, $marker);