|
|
 |
The scope of a variable is the context within which it is defined.
For the most part all PHP variables only have a single scope.
This single scope spans included and required files as well. For
example:
Here the $a variable will be available within
the included b.inc script. However, within
user-defined functions a local function scope is introduced. Any
variable used inside a function is by default limited to the local
function scope. For example:
This script will not produce any output because the echo statement
refers to a local version of the $a variable,
and it has not been assigned a value within this scope. You may
notice that this is a little bit different from the C language in
that global variables in C are automatically available to
functions unless specifically overridden by a local definition.
This can cause some problems in that people may inadvertently
change a global variable. In PHP global variables must be
declared global inside a function if they are going to be used in
that function.
First, an example use of global:
Example 12-1. Using global |
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
|
|
The above script will output "3". By declaring
$a and $b global within the
function, all references to either variable will refer to the
global version. There is no limit to the number of global
variables that can be manipulated by a function.
A second way to access variables from the global scope is to use
the special PHP-defined $GLOBALS array. The
previous example can be rewritten as:
Example 12-2. Using $GLOBALS instead of global |
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;
?>
|
|
The $GLOBALS array is an associative array with
the name of the global variable being the key and the contents of
that variable being the value of the array element.
Notice how $GLOBALS exists in any scope, this
is because $GLOBALS is a superglobal.
Here's an example demonstrating the power of superglobals:
Example 12-3. Example demonstrating superglobals and scope |
<?php
function test_global()
{
global $HTTP_POST_VARS;
echo $HTTP_POST_VARS['name'];
echo $_POST['name'];
}
?>
|
|
Another important feature of variable scoping is the
static variable. A static variable exists
only in a local function scope, but it does not lose its value
when program execution leaves this scope. Consider the following
example:
Example 12-4. Example demonstrating need for static variables |
<?php
function Test()
{
$a = 0;
echo $a;
$a++;
}
?>
|
|
This function is quite useless since every time it is called it
sets $a to 0 and prints
"0". The $a++ which increments the
variable serves no purpose since as soon as the function exits the
$a variable disappears. To make a useful
counting function which will not lose track of the current count,
the $a variable is declared static:
Example 12-5. Example use of static variables |
<?php
function Test()
{
static $a = 0;
echo $a;
$a++;
}
?>
|
|
Now, every time the Test() function is called it will print the
value of $a and increment it.
Static variables also provide one way to deal with recursive
functions. A recursive function is one which calls itself. Care
must be taken when writing a recursive function because it is
possible to make it recurse indefinitely. You must make sure you
have an adequate way of terminating the recursion. The following
simple function recursively counts to 10, using the static
variable $count to know when to stop:
Example 12-6. Static variables with recursive functions |
<?php
function Test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test();
}
$count--;
}
?>
|
|
Note:
Static variables may be declared as seen in the examples above.
Trying to assign values to these variables which are the
result of expressions will cause a parse error.
Example 12-7. Declaring static variables |
<?php
function foo(){
static $int = 0; static $int = 1+2; static $int = sqrt(121); $int++;
echo $int;
}
?>
|
|
The Zend Engine 1, driving PHP 4, implements the
static and
global modifier
for variables in terms of
references. For example, a true global variable
imported inside a function scope with the global
statement actually creates a reference to the global variable. This can
lead to unexpected behaviour which the following example addresses:
Executing this example will result in the following output:
NULL
object(stdClass)(0) {
} |
A similar behaviour applies to the static statement.
References are not stored statically:
Executing this example will result in the following output:
Static object: NULL
Static object: NULL
Static object: NULL
Static object: object(stdClass)(1) {
["property"]=>
int(1)
} |
This example demonstrates that when assigning a reference to a static
variable, it's not remembered when you call the
&get_instance_ref() function a second time.
User Contributed Notes
Variable scope
dpk at dpk dot net
12-May-2005 12:01
This may have been covered in some other way, but I'm not certain. When you assign an array to a $GLOBALS member, and then assign a variable to that array, you somehow destroy the data inside of $GLOBALS, contrary to what you'd expect:
$GLOBALS['foo'] = array ('bar' => 'frank');
print $GLOBALS['foo']['bar'];
print "\n";
$foo = $GLOBALS['foo']['bar'];
print "$foo\n";
print $GLOBALS['foo']['bar'];
print "\n";
prints:
frank
frank
f
rather than "frank frank frank". I don't know how to fix this, so I'm just posting this so others know what to expect.
kouber at php dot net
28-Apr-2005 07:36
If you need all your global variables available in a function, you can use this:
<?
function foo() {
extract($GLOBALS);
}
?>
27-Apr-2005 06:46
Be careful if your static variable is an array and you return
one of it's elements: Other than a scalar variable, elements
of an array are returned as reference (regardless if you
didn't define them to be returned by reference).
<?php
function incr(&$int) {
return $int++;
}
function return_copyof_scalar() {
static $v;
if (!$v)
$v = 1;
return($v);
}
function return_copyof_arrayelement() {
static $v;
if (!$v) {
$v = array();
$v[0] = 1;
}
return($v[0]);
}
echo "scalar: ".
incr(return_copyof_scalar()).
incr(return_copyof_scalar()).
"\n";
echo "arrayelement: ".
incr(return_copyof_arrayelement()).
incr(return_copyof_arrayelement()).
"\n";
?>
Should print
scalar: 11
arrayelement: 11
but it prints:
scalar: 11
arrayelement: 12
as in the second case the arrays element was returned by
reference. According to a guy from the bug reports the
explanation for this behaviour should be somewhere here in
the documentation (in 'the part with title: "References with
global and static variables"'). Unfortunately I can't find
anything about that here. As the guys from the bug reports
are surely right in every case, maybe there is something
missing in the documentation. Sadly I don't have a good
explanation why this happens, so I decided to document at
least the behaviour.
vdephily at bluemetrix dot com
22-Apr-2005 04:51
Be carefull about nested functions :
<?php
function foo1()
{
$who = "world";
function bar1()
{
global $who;
echo "Hello $who";
}
}
function foo2()
{
$GLOBALS['who'] = "world";
function bar2()
{
global $who;
echo "Hello $who";
}
}
function foo3()
{
$GLOBALS['who'] = "world";
echo "Hello $who";
global $who;
echo "Hello $who";
}
?>
S dot Radovanovic at TriMM dot nl
15-Feb-2005 09:50
Sadly I have found out that I have been wrong about my statements below, why?
Well:
1. only the variables that were set in the constructor were 'live' in my referenced object
2. I was assigning this an object and not a reference
So:
I fixed nr. 1 by adding the & when initializing the object (this way this works on the initialized object and not a copy of it)
<?php
$objErrorConfig = & new Config("error.conf");
$objErrorConfig->setSection("messages");
$objErrorConfig = & new Config();
$errorMessage = $objErrorConfig->get($errorName);
?>
Now the variables assigned after the constructor ($objErrorConfig->setSection("messages");) will also be 'live' in the static obj array.
I had to find a workaround for nr.2, since it is impossible to assign a reference to this. That's why I used code proposed by others, nl. I referenced all the members of the objects:
<?php
$arrClassVars = get_class_vars(get_class($theObject));
foreach($arrClassVars as $member=>$value) {
$this->$member = &$theObject->$member;
}
$arrSingletonObject[$this->_configfile] = & $this;
?>
So in the end, I had better used what everbody was using (creating a Singleton through an method, instead of through the constructor), but hey, I learned something again :)
S dot Radovanovic at trimm dot nl
05-Feb-2005 04:54
To use the Singleton Pattern (as available in PHP5), we must do a little trick in PHP4.
Most examples I've seen look like this:
//Creation of singleton, Example, Example1 objects
//and then
<?
$myExample =& singleton('Example');
$myExample1 =& singleton('Example1');
?>
What I wanted was a way to use the Singleton Pattern on initialization of a new object (no calling of a method by reference (or something like that)).
The initializor doesn't have to know that the object it is trying to initialize uses the Singleton Pattern.
Therefor I came up with the following:
Beneath is part of a Config object that allows me to retrieve configuration data read from specific ini files (through parse_ini_file). Because I wanted to use the Config object in different other objects without having to pass a reference to the Config object all the time and without some of them having to now how the Config object was loaded (which configuration file was used) I had the need for the Singleton pattern.
To accomplish the Singleton pattern in the Constructor I've created a static array containing references to configuration file specific objects (each new configuration file creates a new instance of the Config object).
If we then try to create a new instance of an already loaded Config object (with the same configuration file), the objects set this to the reference of the previously created object, thus pointing both instances to the same object.
Here's the main part of the script.
Here's an example of how to use the Config object:
<?php
Config::setIniPath("/home/mydir/data/conffiles");
$objTemplateConfig = new Config("template.conf");
$objErrorConfig = new Config("error.conf");
$templatePath = $objTemplateConfig->get("template_path");
$errorColor = $objErrorConfig->get("error_color");
$objErrorConfig = new Config();
$errorMessage = $objErrorConfig->get($errorName);
?>
So without the initializor knowing it he/she has retrieved a reference to a previously instantiated Config object (knowledge of this resides with the object).
Here's the constructor part of the config object:
S dot Radovanovic at trimm dot nl
05-Feb-2005 04:54
<?php
function __constructor($configfile = '', $blnSingleton = true) {
static $arrSingletonObject = array();
static $lastConfigfile;
if(!empty($configfile)) {
$lastConfigfile = $configfile;
} else if(!empty($lastConfigfile)) {
$configfile = $lastConfigfile;
} else {
trigger_error("No configfile has been specified.", ERROR);
return;
}
$this->_configfile = $configfile;
if($blnSingleton) {
if(!isset($arrSingletonObject[$this->_configfile])) {
$arrSingletonObject[$this->_configfile] = &$this;
$this->_parseIniFile();
} else {
$this = $arrSingletonObject[$this->_configfile];
}
}
}
?>
pulstar at ig dot com dot br
08-Sep-2004 08:02
If you need all your global variables available in a function, you can use this:
<?php
function foo(parameters) {
if(version_compare(phpversion(),"4.3.0")>=0) {
foreach($GLOBALS as $arraykey=>$arrayvalue) {
global $$arraykey;
}
}
}
?>
info AT SyPlex DOT net
31-Aug-2004 07:35
Some times you need to access the same static in more than one function. There is an easy way to solve this problem:
<?php
function &getStatic() {
static $staticVar;
return $staticVar;
}
function fooCount() {
$ref2static = & getStatic();
echo $ref2static++;
}
fooCount(); fooCount(); fooCount(); ?>
shyam dot g at gmail dot com
02-Jul-2004 05:52
in response to Michael's comments, it is imperative to observe that static variables in methods of an object are not class level variables.
and since both a and b from the previous example are 2 different objects, there is no question of the static variable being shared between the objects.
The variable is static with respect to the function and not the class.
sam
Michael Bailey (jinxidoru at byu dot net)
04-Jun-2004 01:43
Static variables do not hold through inheritance. Let class A have a function Z with a static variable. Let class B extend class A in which function Z is not overwritten. Two static variables will be created, one for class A and one for class B.
Look at this example:
<?php
class A {
function Z() {
static $count = 0;
printf("%s: %d\n", get_class($this), ++$count);
}
}
class B extends A {}
$a = new A();
$b = new B();
$a->Z();
$a->Z();
$b->Z();
$a->Z();
?>
This code returns:
A: 1
A: 2
B: 1
A: 3
As you can see, class A and B are using different static variables even though the same function was being used.
Randolpho
02-Apr-2004 02:53
More on static variables:
My first not is probably intuitive to most, but I didn't notice it mentioned explicitly, so I'll mention it: a static variable does not retain it's value after the script's execution. Don't count on it being available from one page request to the next; you'll have to use a database for that.
Second, here's a good pattern to use for declaring a static variable based on some complex logic:
<?
function buildStaticVariable()
{
$foo = null;
return $foo;
}
function functionWhichUsesStaticVar()
{
static $foo = null;
if($foo === null) $foo = buildStaticVariable();
}
?>
Using such a pattern allows you to separate the code that creates your default static variable value from the function that uses it. Easier to maintain code is good. :)
jmarbas at hotmail dot com
16-Jan-2004 05:34
Whats good for the goose is not always good for the iterative gander. If you declare and initialize the static variable more than once inside a function ie.
function Test(){
static $count = 0;
static $count = 1;
static $count = 2;
echo $count;
}
the variable will take the value of the last declaration. In this case $count=2.
But! however when you make that function recursive ie.
function Test(){
static $count = 0;
static $count = 1;
static $count = 2;
$count++;
echo $count;
if ($count<10){
Test();
}
}
Every call to the function Test() is a differenct SCOPE and therefore the static declarations and initializations are NOT executed again. So what Im trying to say is that its OK to declare and initialize a static variable multiple times if you are in one function... but its NOT OK to declare and initialize a static variable multiple times if you call that same function multiple times. In other words the static variable is set once you LEAVE a function (even if you go back into that very same function).
Jack at soinsincere dot com
14-Nov-2003 12:11
Alright, so you can't set a static variable with a reference.
However, you can set a static variable to an array with an element that is a reference:
<?php
class myReference {
function getOrSet($array = null) {
static $myValue;
if (!$array) {
return $myValue[0]; }
$myValue = $array; static $myValue;
}
}
$static = "Dummy";
$dummy = new myReference;
$dummy->getOrSet(array(&$static));
$static = "Test";
print $dummy->getOrSet();
?>
flobee at gmx dot net
06-Nov-2003 02:26
i found out that on any (still not found) reason the <?php static $val =NULL; ?> is not working when trying to extract the data form the $var with a while statment
e.g.:
<?php
funktion get_data() {
static $myarray = null;
if($myarray == NULL) {
$myarray = array('one','two');
}
while(list($key,$val) = each( $myarray ) ) {
echo "x: $key , y: $val";
}
}
?>
when using foreach($myarray AS $key => $val) { .... instad of while then i see the result!
ppo at beeznest dot net
08-Jul-2003 08:59
Even if an included file return a value using return(), it's still sharing the same scope as the caller script!
<?php
$foo = 'aaa';
$bar = include('include.php');
echo($foo.' / '.$bar);
?>
where include.php is
<?php
$foo = 'bbb';
return $foo;
?>
The output is: bbb / bbb
Not: aaa / bbb
j at superjonas dot de
14-Mar-2003 12:08
> pim wrote:
> in addition:
> if you define a function in that included file, it can't get
> the variables from the inluded file's scope. global won't work.
> The only way to give such an include function access to global
> vars is via arguments. I don't know if this is a bug in PHP.
>
> //---- from within function included file -----
> echo $var1; // this one works
> function foo()
> {
> global $var1;
> echo $var1; // this one doesn't
> }
It works if you additionally declare the variables from the inluded file's scope as global.
example:
<?php
function func1() {
include("file2.php");
func2();
}
func1();
?>
<?php
global $var; $var = 'something';
function func2() {
global $var; echo $var; }
?>
ben-xo aatt dubplates.org
13-Mar-2003 12:05
regarding the above "unset" example: I quote from the manual page for "unset".
"If a static variable is unset() inside of a function, unset() destroyes the variable and all its references. "
As mentioned above, on this page, static vars are implemented as references. When you unset() a reference, what you are doing is deleting a particular name for that variable. In your example, you delete the LOCAL NAME $a, but the static contents are still there (hidden) and next time you call your function, a NEW LOCAL NAME (again $a...) is linked to the SAME backing data.
Workaround would be something like "$a = null".
unset($a) is very much like $a = &null however, which, if you read the notes above, won't have the desired affect on static or global variables.
04-Mar-2003 09:25
As far as I can see, it's not possible to unset() a static variable inside the function:
function Test($unset = false) {
static $a = 0;
echo $a++;
if ($unset) unset($a);
}
Test();
Test();
Test(true);
Test();
Test();
This will output 01234. I would expect it to at least show 01201.
pim at lingewoud dot nl
27-Feb-2003 01:46
shevek wrote:
>> If you include a file from within a function using include(),
>> the included file inherits the function scope as its own
>> global scope, it will not be able to see top level globals
>> unless they are explicit in the function.
in addition:
if you define a function in that included file, it can't get the variables from the inluded file's scope. global won't work. The only way to give such an include function access to global vars is via arguments. I don't know if this is a bug in PHP.
//---- from within function included file -----
echo $var1; // this one works
function foo()
{
global $var1;
echo $var1; // this one doesn't
}
jg at nerd-boy dot net
07-Feb-2003 06:10
It's possible to use a variable variable when specifying a variable as global in a function. That way your function can decide what global variable to access in run-time.
function func($varname)
{
global $$varname;
echo $$varname;
}
$hello = "hello world!";
func("hello");
This will print "hello world!", and is roughly the same as passing by reference, in the case when the variable you want to pass is global. The advantage over references is that they can't have default parameters. With the method above, you can do the following.
function func($varname = FALSE)
{
if ($varname === FALSE)
echo "No variable.";
else
{
global $$varname;
echo $$varname;
}
}
$hello = "hello world!";
func("hello"); // prints "hello world!"
func(); // prints "No variable."
wjs@sympaticoDOTca
10-Dec-2002 11:03
Becareful where you define your global variables:
This will work:
<?php
$MyArray = array("Dog");
function SeeArray(){
global $MyArray;
if (in_array("Dog",$MyArray)){
foreach ($MyArray as $Element){
echo "$Element <hr/>";
}
}
}
SeeArray();
?>
while this will not:
<?php
SeeArray();
$MyArray = array("Dog");
function SeeArray(){
global $MyArray;
if (in_array("Dog",$MyArray)){ foreach ($MyArray as $Element){
echo "$Element <hr/>";
}
}
}
?>
jez at india dot com
31-Oct-2002 02:35
If anyone needs a permanent array / hash, similar in functionality to ASP's application object, check out the article on
http://zez.org/article/articleview/46/1/
which has some working code (written by me) attached. This code implements a hash with application scope, i.e. its contents can be accessed from all php scripts running on the same computer. You could use it, for example, to globally cache configuration settings for a site.
The hash is also cached in the db, i.e. it's inviolable. Its contents are buffered in memory, so there's no hit on the db when accessing the hash apart from the first time you read it, and of course when you write to it.
mu at despammed dot com
16-Oct-2002 06:12
morthanpurpl: You don't have to initialize variables you use first inside a variable, at least not in PHP4.2.2. The following will just work fine and output "iam":
<?php
function dumdum()
{
global $a;
$a = "iam";
}
dumdum();
echo $a;
?>
heatwave at fw dot hu
15-Oct-2002 07:12
Some people (including me) had a problem with defining a long GLOBAL variable list in functions (very error prone). Here is a possible solution. My program parses php file for functions, and compiles GLOBAL variable lists. Then you can just remove from the list those variables which need not be global.
<?php
$pfile=file("myfile.php4");
for($i=0;$i<sizeof($pfile);$i++) {
if(eregi("function",$pfile[$i])) {
list($part1,$part2)=sscanf($pfile[$i],"%s %s");
echo "\n\n $part1 $part2:\nGLOBAL ";
$varlist=array();
$level=0; $end=$i;
do {
$lpar=explode("{",$pfile[$end]);
$level+=sizeof($lpar)-1;
$lpar=explode("}",$pfile[$end]);
$level-=sizeof($lpar)-1;
$end++;
} while(($end<sizeof($pfile))&&($level>0));
$pstr="";
for($j=$i;$j<=$end;$j++) $pstr.=$pfile[$j];
$lpar=explode("$",$pstr);
for($j=1;$j<sizeof($lpar);$j++) {
eregi('[a-zA-Z_][a-zA-Z0-9_]*',$lpar[$j],$cvar);
$varlist[$cvar[0]]=1;
}
array_walk($varlist,'var_print');
}
}
function var_print ($item, $key) {
echo "$key,";
}
?>
stlawson AT sbcglobal DOT net
05-Jul-2002 10:22
aslak is right! Check this out:
$t1 = "outie";
function foo1()
{
global $t1;
$t1 = 'innie' ;
echo ('in foo1() $t1 is an ' . $t1) ;
}
echo ('before foo1() $t1 is an ' . $t1) ;
foo1() ;
echo ('after foo1() $t1 is an ' . $t1) ;
// is identical to?:
$t2 = "outie";
function foo2()
{
$t2 = &$GLOBALS['t2'];
$t2 = 'innie' ;
echo ('in foo2() $t2 is an ' . $t2) ;
}
echo ('before foo2() $t2 is an ' . $t2) ;
foo2() ;
echo ('after foo2() $t2 is an ' . $t2) ;
Output:
before foo1() $t1 is an outie
in foo1() $t1 is an innie
after foo1() $t1 is an innie
before foo2() $t2 is an outie
in foo2() $t2 is an innie
after foo2() $t2 is an innie
Also I cleaned up aslak's code a bit ;)
aslak at novita dot no
26-Jun-2002 06:54
Basicly what happens is this:
$var t;
function foo()
{
global $t;
}
is identical to:
function foo()
{
$t=&$GLOBALS[t];
}
which will answer the above argument becouse when you use
$t=&$somelocal;
you overwrite the first $t=&.....
cellog at users dot sourceforge dot net
02-Jun-2002 07:57
regarding May 27 comment.
Try this file, and you will see that what I said in my comment holds:
<?php
$testvar = 1 ;
$testvar2 = 2 ;
function foo ()
{
global $testvar ;
global $testvar2 ;
$testvar3 = 6;
$testvar = 3 ; echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3 <br>" ; $testvar = 4 ; echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3 <br>" ; $testvar = &$testvar2 ; echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3<br> " ; $testvar=5 ; echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3<br>" ; $testvar = &$testvar3;
echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3<br>" ; $testvar = 7; echo "$testvar,$GLOBALS[testvar],$GLOBALS[testvar2],$testvar3<br>" ; }
foo() ;
?>
doing $testvar = &$testvar2 assigns $testvar to point at $testvar2, which is pointing at $GLOBALS[testvar2]. Later, I assign $testvar = &$testvar3, which points it at the local variable.
The & operator *only* changes what the left-hand variable points at, and not the contents of what it used to point at (to borrow from old-fashioned pointer terminology :).
JeanRobert at Videotron dot ca
27-May-2002 04:18
Comment on May 21.
This explanation does not explain why assigning a global variable
reference to a globalvariable does not modify it (See the statement
"$testvar = &$testvar2" bellow).
Here is my own explanation:
Inside a function, if we assign a variable reference to a global
variable then this global variable is replaced by a new local
variable instance. In other words, once done, futur assignment to
this variable will only modify the local copy and leave the original
global variable unchanged. Looking at the following code will
help you to understand it. (Just as a reminder $GLOBALS[testvar]
always refers to the original $testvar global variable).
$testvar = 1 ;
$testvar2 = 2 ;
function foo ()
{
global $testvar ;
global $testvar2 ;
$testvar = 3 ; //Assigning a constant works as expected.
echo "$testvar,$GLOBALS[testvar] " ; // 3,3
$testvar = 4 ; //Assigning a variable also works as expected.
echo "$testvar,$GLOBALS[testvar] " ; // 4,4
$testvar = &$testvar2 ; // Assiging a reference allocates a new
// local testvar instance.
echo "$testvar,$GLOBALS[testvar] " ; // 2,4
$testvar=5 ; // Assigning a value to testvar now only modifies
// the local instance.
echo "$testvar,$GLOBALS[testvar]" ; //5,4
}
foo() ;
If you plan to assign a variable reference to a global variale then
you should use '$GLOBALS[testvar]=&$variable' instead of
'$testvar=&$variable'.
cellog at users dot sourceforge dot net
21-May-2002 06:02
comment on april 9 regarding:
function foo ()
{
global $testvar;
$localvar = new Object ();
$testvar = &$localvar;
}
The reason this doesn't work is that when you use & to assign to $testvar, it reassigns $testvar to point at what $localvar points at.
$testvar = $localvar should work as well as $GLOBALS['testvar'] = &$localvar, although instance data will be copied and any references to parent classes will be broken. I hate that :).
In other words, the declaration "global $testvar;" is telling php "make $testvar point at the same location as $GLOBALS['testvar']" but "$testvar = &$localvar" tells php "make $testvar point at the same location as $localvar"!!!
30-Apr-2002 03:14
Seems as though when a cookie is saved and referenced as a variable of the same name as the cookie, that variable is NOT global. If you make a function ro read the value of the cookie, the cooke variable name must be declared as a global.
example:
function ReturnCookie()
{
$cookieName = "Test_Cookie";
global $$cookieName;
if (isset($$cookieName))
{
echo ("$cookieName is set");
$returnvalue = $$cookieName;
}
else
{
$newCookieValue = "Test Value";
setcookie("$cookieName","$newCookieValue", (time() + 3153600));
echo ("made a cookie:" . $newCookieValue ."<BR>");
$returnvalue = $newCookieValue;
}
echo ("the cookie that was set is now $returnvalue <BR>");
return $returnvalue;
}
huntsbox at pacbell dot net
02-Apr-2002 10:11
Not sure of the implications of this but...
You can create nested functions within functions but you must make sure they aren't defined twice, e.g.:
function norm($a, $b) {
static $first_time = true;
if ($first_time) {
function square($x) {
return $x * $x;
}
$first_time = false;
}
return sqrt(square($a) + square($b));
}
print square(5); // error, not defined yet
print norm(5,4);
print "<br>";
print norm(3,2);
print square(5); // OK
If you don't include the if ($first_time) you get an error saying you can't define square() twice. Note that square is not local to the function it just appears there. The last line successfully accesses square in the page scope. This is not terribly useful, but interesting.
jochen_burkhard at web dot de
29-Mar-2002 01:47
Please don't forget:
values of included (or required) file variables are NOT available in the local script if the included file resides on a remote server:
remotefile.php:
<?PHP
$paramVal=10;
?>
localfile.php:
<?PHP
include "http://otherserver.com/remotefile.php";
echo "remote-value= $paramVal";
?>
Will not work (!!)
steph_rondinaud at club-internet dot fr
09-Feb-2002 06:41
I'm using PHP 4.1.1
While designing a database access class, I needed a static variable that will be incremented for all instances of the class each time the class connected to the database. The obvious solution was to declare a "connection" class variable with static scope. Unfortunatly, php doesn't allow such a declaration.
So I went back to defining a static variable in the connect method of my class. But it seems that the static scope is not inherited: if class "a" inherit the "db access" class, then the "connection" variable is shared among "a" instances, not among both "a" AND "db access" instances.
Solution is to declare the static variable out of the db access class, and declare "global" said variable in the connect method.
admin at essentialhost dot com
03-Feb-2002 08:30
Quick tip for beginners just to speed things up:<P>
If you have a bunch of global variables to import into a function, it's best to put them into a named array like $variables[stuff]. <P>
When it's time to import them you just so the following; <P>
function here() {
$vars = $GLOBALS['variables'];
print $vars[stuff];
}
This really helps with big ugly form submissions.
tomek at pluton dot pl
10-Dec-2001 12:53
When defining static variables you may use such declarations:
static $var = 1; //numbers
static $var = 'strings';
static $var = array(1,'a',3); //array construct
but these ones would produce errors:
static $var = some_function('arg');
static $var = (some_function('arg'));
static $var = 2+3; //any expression
static $var = new object;
danno at wpi dot edu
24-Jul-2001 02:28
WARNING! If you create a local variable in a function and then within that function assign it to a global variable by reference the object will be destroyed when the function exits and the global var will contain NOTHING! This main sound obvious but it can be quite tricky you have a large script (like a phpgtk-based gui app ;-) ).
example:
function foo ()
{
global $testvar;
$localvar = new Object ();
$testvar = &$localvar;
}
foo ();
print_r ($testvar); // produces NOTHING!!!!
hope this helps someone before they lose all their hair
carpathia_uk at mail dot com
07-May-2001 04:21
On confusing aspect about global scope...
If you want to access a variable such as a cookie inside a function, but theres a chance it may not even be defined, you need to access it using he GLOBALS array, not by defining it as global.
This wont work correctly....
function isLoggedin()
{
global $cookie_username;
if (isset($cookie_username)
echo "blah..";
}
This will..
function isLoggedin()
{
if (isset($GLOBALS["cookie_username"]))
echo "blah..";
}
shevek at anarres dot org
04-Feb-2000 06:51
If you include a file from within a function using include(), the included file inherits the function scope as its own global scope, it will not be able to see top level globals unless they are explicit in the function.
$foo = "bar";
function baz() {
global $foo; # NOTE THIS
include("qux");
}
| |