Next revision | Previous revisionNext revisionBoth sides next revision |
rfc:calltimebyref [2008/05/21 13:02] – created sfox | rfc:calltimebyref [2011/04/06 10:59] – external edit 127.0.0.1 |
---|
====== Request for Comments: How to write RFCs ====== | ====== Request for Comments: allow_call_time_pass_reference ====== |
* Version: 1.0 | * Version: 1.0 |
* Date: 2008-05-21 | * Date: 2008-05-21 |
| |
This RFC aims to clarify the situation with call-time pass-by-ref in PHP 5.3. | This RFC aims to clarify the situation with call-time pass-by-ref in PHP 5.3. |
| |
| |
| |
===== History ===== | ===== History ===== |
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. | 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. 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. | 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: | 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: |
| |
| <code> |
; - allow_call_time_pass_reference = Off [Code cleanliness] | ; - allow_call_time_pass_reference = Off [Code cleanliness] |
; It's not possible to decide to force a variable to be passed by reference | ; 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 | ; when calling a function. The PHP 4 [sic] style to do this is by making the |
; function require the relevant argument by reference. | ; function require the relevant argument by reference. |
| </code> |
| |
| 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. |
| |
In fact, allowing return values by reference is the default behaviour in PHP, and has been from PHP 4.0 beta right up to PHP 5.3. | |
| |
===== Reality Check ===== | ===== Reality Check ===== |
| |
In some circumstances, on some platforms, returning 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. | 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. |
| |
===== Future ===== | ===== Future ===== |
| |
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 returned 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. | 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. |
| |
===== Proposal ===== | ===== Proposal ===== |