Request for Comments: allow_call_time_pass_reference


This RFC aims to clarify the situation with call-time pass-by-ref in PHP 5.3.


Before PHP 4.0 was released, allow_call_time_pass_reference was introduced as a means of retaining back compatibility with PHP 3, at the point where returning by reference from a function declaration became possible [1]. By default, the INI switch has been On since inception [2]. The warning (formerly E_COMPILE_WARNING but currently E_DEPRECATED) is only thrown if the INI switch is Off. You therefore need to explicitly switch off the directive in order to discover that the behaviour is deprecated.

At the time allow_call_time_pass_reference was introduced, php.ini-recommended was interestingly referred to as 'php.ini-optimized'. Over the years, it has become fairly standard to regard php.ini-recommended as 'production settings'; things like display_errors=Off and log_errors=On have helped this perception along. From inception, allow_call_time_pass_reference was switched Off in php.ini-recommended but On in php.ini-dist and by default. For the last 8 years, therefore, the first anyone is likely to have known about their code being less than kosher is when it went live.

Even in the current php.ini-recommended, the switch is attributed only to 'Code cleanliness'. The full entry in the heading about changed settings reads:

; - allow_call_time_pass_reference = Off     [Code cleanliness]
;     It's not possible to decide to force a variable to be passed by reference
;     when calling a function.  The PHP 4 [sic] style to do this is by making the
;     function require the relevant argument by reference.

In fact, allowing values to be passed by reference is the default behaviour in PHP, and has been from PHP 4.0 beta right up to PHP 5.3.

Reality Check

In some circumstances, on some platforms, passing values by reference can actually speed up your code. In most cases, though - and for all when it comes to large arrays - it carries a performance penalty. If you make use of by-ref for performance reasons on a given platform, that optimization will not be portable.


The directive is completely gone from CVS HEAD [3]. The effect of this originally was that a new-to-many E_STRICT would be thrown when values are passed by reference. However, it's been moved to E_DEPRECATED recently. In either case, it will no longer be possible to turn the warning off.


Switch allow_call_time_pass_reference off by default in PHP_5_3 branch. At present there is no warning when running PHP under default settings, whereas in PHP 6 there will be a 'deprecated' warning given and no means of turning it off.



currently allow_call_time_pass_reference is set to Off in both php.ini-production and php.ini-development for 5.3, and Call-time pass-by-reference was removed from 5.4, so this RFC is implemented/obsolete.

rfc/calltimebyref.txt · Last modified: 2017/09/22 13:28 by