Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 08-23-2008, 11:42 AM
AndrewD AndrewD is offline
 
Join Date: Jul 2002
Location: Scotland
Posts: 3,486
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default PHP references question

I suspect I'm missing something very obvious here. Can someone explain the behaviour of this code:

Code:
<?php

$test = "12345";
$anothertest = "";
$yetanothertest = "";

function getref() {
	global $test;
	global $anothertest;
	global $yetanothertest;

	$anothertest =& $test;
	$GLOBALS['yetanothertest'] =& $test;

	echo "<br /><br />Inside<br />";
	echo "test:".$test."<br />";
	echo "anothertest:".$anothertest."<br />";
	echo "yetanothertest:".$yetanothertest."<br />";
}

getref();

echo "<br /><br />Outside<br />";
echo "test:".$test."<br />";
echo "anothertest:".$anothertest."<br />";
echo "yetanothertest:".$yetanothertest."<br />";

echo "<br /><br />";

?>
which prints out

Inside
test:12345
anothertest:12345
yetanothertest:

Outside
test:12345
anothertest:
yetanothertest:12345

In other words, within the function, the reference assignment seems to have updated $anothertest but not $yetanothertest, yet having left the function, it's the other way round.

With direct assignments ($A = $B) instead of references ($A =& $B), both of the global variables are updated and correctly displayed inside and outside the function.
Reply With Quote
  #2  
Old 08-24-2008, 08:56 AM
Guest190829
Guest
 
Posts: n/a
Default

What values were you expecting?

PHP Code:
$GLOBALS['yetanothertest'] =& $test
Assigns the global variable by to reference to the local variable to test; it's not affecting $yetanothertest in the local scope of the function.

and

PHP Code:
$anothertest =& $test
Is only affecting the reference of the local variable $anothertest...$anothertest does not have scope after the function call, however, if you assigned a value to the variables as you mentioned...it will affect all the variables that reference that data.

I know I'm not explaining it that well, there's a section in the PHP manual dedicated to explaining references over at php.net.
Reply With Quote
  #3  
Old 08-24-2008, 10:21 AM
AndrewD AndrewD is offline
 
Join Date: Jul 2002
Location: Scotland
Posts: 3,486
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Danny.VBT View Post
What values were you expecting?
I was expecting $GLOBALS['abc'] to be identical to global $abc inside the function, and it isn't.

As you say, it's explained in the php help manual:

Warning
If you assign a reference to a variable declared global inside a function, the reference will be visible only inside the function. You can avoid this by using the $GLOBALS array. Think about global $var; as a shortcut to $var =& $GLOBALS['var'];. Thus assigning other reference to $var only changes the local variable's reference.

I didn't get that far on that page.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 12:47 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03688 seconds
  • Memory Usage 2,182KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (2)bbcode_php
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (3)post_thanks_box
  • (3)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (3)post_thanks_postbit_info
  • (3)postbit
  • (2)postbit_onlinestatus
  • (3)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete