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


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.


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


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


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.


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;


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