Edit report at http://bugs.php.net/bug.php?id=46885&edit=1
ID: 46885 User updated by: Chowarmaan at gmail dot com Reported by: Chowarmaan at gmail dot com Summary: pass by reference does not return object created in function Status: Closed Type: Bug Package: Scripting Engine problem Operating System: * PHP Version: 5.2.8 New Comment: Can not duplicate at this time with 5.2.13. Previous Comments: ------------------------------------------------------------------------ [2008-12-18 15:28:59] Chowarmaan at gmail dot com I retried this as you showed, and then again in my code sample. I can not reduplicate this problem. I have been using the 5.2.8 since it came out as it is on my development machine, and the only PHP on that machine. I confirmed this with the first test and this test using the php -v and phpinfo(); Originally I noticed the problem using Zend 5.5.1, but I can not reduplicate the problem there either. ------------------------------------------------------------------------ [2008-12-18 14:26:00] j...@php.net Are you really using PHP 5.2.8? Because this works just fine for me with both styles. Here's my simplified script: <?php class tst { function get(&$r , $t = 0) { if (!($r instanceof tst2 )) $r = new tst2(); $r->set('Testing Complete'); } } class tst2 { public $var; public function set($s) { $this->var = $s; } } $t = new tst; $t->get($resp, 100); var_dump($resp->var); $t->get(&$resp, 100); var_dump($resp->var); ?> And output: # php -dallow_call_time_pass_reference=on t.php string(16) "Testing Complete" string(16) "Testing Complete" # php -dallow_call_time_pass_reference=off t.php Warning: Call-time pass-by-reference has been deprecated in t.php on line 25 string(16) "Testing Complete" string(16) "Testing Complete" ------------------------------------------------------------------------ [2008-12-17 23:14:39] Chowarmaan at gmail dot com Both lines were added to show what works and what does not. The first call is the desired call by the program and what I can see in the PHP manual. However, $Response does not become an object of TEST_CLASS2 when the GetResponse function ends. The second call, &$Response does maintain the TEST_CLASS2 object type. The second line should not be in the script, it is just there to illustrate the problem. The first call to GetResponse() is the correct call by the language syntax, but it has the bug. ------------------------------------------------------------------------ [2008-12-17 02:44:50] j...@php.net How about you comment out the latter call and let the script work like it does? ------------------------------------------------------------------------ [2008-12-16 21:26:23] Chowarmaan at gmail dot com Description: ------------ Calling a function in a class that accepts a variable by reference, then checks the variable and creates an object for it will not allow the object to be returned outside of the function. Reproduce code: --------------- <?php class TEST_CLASS { function __construct() { } function GetResponse(&$Response, $Timeout = 0) { if (!($Response instanceof TEST_CLASS2 )) $Response = new TEST_CLASS2(); $Response->SetText_('Testing Complete'); return TRUE; } } class TEST_CLASS2 { public $Variable; public function SetText_($s) { $this->Variable = $s; } } $Test = new TEST_CLASS(); $Test->GetResponse($Response, 100); // Fails $Test->GetResponse(&$Response, 100); // Works echo $Response->Variable . "\n"; ?> Expected result: ---------------- $Response should be of type TEST_CLASS2 and the echo should return the text: Testing Complete Actual result: -------------- $Response is a NULL ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=46885&edit=1