[TYPO3-core] #53682, PHP 5.5.6, call-time pass-by-reference, PHP 5.6

Markus Klein klein.t3 at mfc-linz.at
Fri Dec 13 10:06:29 CET 2013


Hi!

> 
> Hi,
> 
> > It is WRONG that passing variables by reference is deprecated. It is of
> course not!!!
> > http://php.net/manual/en/language.references.pass.php
> >
> > What has been deprecated long ago is the & operator used on variables in a
> function call. So called "call-time pass-by-reference". (function foo($x) {}    $a
> = ''; foo(&$a);)
> 
> Yes, true.
> 
> > It is indeed a breaking change in PHP 5.6+ that the support of passing
> variables by reference to a constructor is not possible anymore.
> 
> I checked Philipp's patch and as we are expecting an object to be passed,
> there's no point into using the & operator as an object is already passed by
> reference. So it's a breaking change yes and no since using the & operator is
> deprecated since long (perhaps not stated like that but since it does not bring
> anything into using it, at least it's somehow deprecated for long).

Sorry, this is again exactly the same mistake. It is NOT deprecated to use the & operator in a function definition.
The & has nothing to do whether it is an object or not. It is about changing the variable passed from outside!

Two examples:
function foo1(someclass &$s) {
  $s = new someclass('b');
}
function foo2(someclass $s) {
  $s = new someclass('b');
}

$a = new someclass('a'); // $a holds the reference to the object. Some number, eg. 0xFA56
foo1($a); // in the function $s now holds the memory address of $a, eg. 0xA56F; (it is a pointer)
// after the call $a holds the reference to the object created in foo1(), eg. 0x65AF

$a = new someclass('a');  // $a holds the reference to the object. Some number, eg. 0xFA56
foo2($a); // in the function $s now holds the reference to the object. $s is a copy of $a, $s now contains 0xFA56 as well
// after the call $a still holds the reference to the original object. eg. 0xFA56

So again: A pass by reference is used to change the original variable and has nothing to do with the fact that objects are passed by reference.



Kind regards
Markus

------------------------------------------------------------
Markus Klein
TYPO3 CMS Active Contributors Team Member



More information about the TYPO3-team-core mailing list