The scope of a variable is the region of your program in which it is defined. A global variable has global scope -- it is defined everywhere in your JavaScript code. On the other hand, variables declared within a function are defined only within the body of the function.
In general, the scope is defined as the extent up to which something can be worked with. In programming also the scope of a variable is defined as the extent of the program code within which the variable can be accessed or declared or worked with. There are mainly two types of variable scopes: Local Variables.
Scope of a variable refers to the part of the program, where it is accessible, i.e., an area where you can refer (use) it. We can say that scope holds the current set of variables and their values. The two types of scopes are the local scope and global scope.
The Typescript variables have three scopes. Global, Function and local. Using var you can create global & function variable.
Variables have a limited "scope", or "places from which they are accessible". Just because you wrote $foo = 'bar';
once somewhere in your application doesn't mean you can refer to $foo
from everywhere else inside the application. The variable $foo
has a certain scope within which it is valid and only code in the same scope has access to the variable.
Very simple: PHP has function scope. That's the only kind of scope separator that exists in PHP. Variables inside a function are only available inside that function. Variables outside of functions are available anywhere outside of functions, but not inside any function. This means there's one special scope in PHP: the global scope. Any variable declared outside of any function is within this global scope.
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
}
$foo
is in the global scope, $baz
is in a local scope inside myFunc
. Only code inside myFunc
has access to $baz
. Only code outside myFunc
has access to $foo
. Neither has access to the other:
<?php
$foo = 'bar';
function myFunc() {
$baz = 42;
echo $foo; // doesn't work
echo $baz; // works
}
echo $foo; // works
echo $baz; // doesn't work
File boundaries do not separate scope:
a.php
<?php
$foo = 'bar';
b.php
<?php
include 'a.php';
echo $foo; // works!
The same rules apply to include
d code as applies to any other code: only function
s separate scope. For the purpose of scope, you may think of including files like copy and pasting code:
c.php
<?php
function myFunc() {
include 'a.php';
echo $foo; // works
}
myFunc();
echo $foo; // doesn't work!
In the above example, a.php
was included inside myFunc
, any variables inside a.php
only have local function scope. Just because they appear to be in the global scope in a.php
doesn't necessarily mean they are, it actually depends on which context that code is included/executed in.
Every new function
declaration introduces a new scope, it's that simple.
function foo() {
$foo = 'bar';
$bar = function () {
// no access to $foo
$baz = 'baz';
};
// no access to $baz
}
$foo = 'foo';
class Bar {
public function baz() {
// no access to $foo
$baz = 'baz';
}
}
// no access to $baz
Dealing with scoping issues may seem annoying, but limited variable scope is essential to writing complex applications! If every variable you declare would be available from everywhere else inside your application, you'd be stepping all over your variables with no real way to track what changes what. There are only so many sensible names you can give to your variables, you probably want to use the variable "$name
" in more than one place. If you could only have this unique variable name once in your app, you'd have to resort to really complicated naming schemes to make sure your variables are unique and that you're not changing the wrong variable from the wrong piece of code.
Observe:
function foo() {
echo $bar;
}
If there was no scope, what would the above function do? Where does $bar
come from? What state does it have? Is it even initialized? Do you have to check every time? This is not maintainable. Which brings us to...
function foo($bar) {
echo $bar;
return 42;
}
The variable $bar
is explicitly coming into this scope as function argument. Just looking at this function it's clear where the values it works with originate from. It then explicitly returns a value. The caller has the confidence to know what variables the function will work with and where its return values come from:
$baz = 'baz';
$blarg = foo($baz);
$foo = 'bar';
$baz = function () use ($foo) {
echo $foo;
};
$baz();
The anonymous function explicitly includes $foo
from its surrounding scope. Note that this is not the same as global scope.
global
As said before, the global scope is somewhat special, and functions can explicitly import variables from it:
$foo = 'bar';
function baz() {
global $foo;
echo $foo;
$foo = 'baz';
}
This function uses and modifies the global variable $foo
. Do not do this! (Unless you really really really really know what you're doing, and even then: don't!)
All the caller of this function sees is this:
baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!
There's no indication that this function has any side effects, yet it does. This very easily becomes a tangled mess as some functions keep modifying and requiring some global state. You want functions to be stateless, acting only on their inputs and returning defined output, however many times you call them.
You should avoid using the global scope in any way as much as possible; most certainly you should not be "pulling" variables out of the global scope into a local scope.
Although variables defined inside of a function's scope can not be accessed from the outside that does not mean you can not use their values after that function completes. PHP has a well known static
keyword that is widely used in object-oriented PHP for defining static methods and properties but one should keep in mind that static
may also be used inside functions to define static variables.
Static variable differs from ordinary variable defined in function's scope in case that it does not loose value when program execution leaves this scope. Let's consider the following example of using static variables:
function countSheep($num) {
static $counter = 0;
$counter += $num;
echo "$counter sheep jumped over fence";
}
countSheep(1);
countSheep(2);
countSheep(3);
Result:
1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence
If we'd defined $counter
without static
then each time echoed value would be the same as $num
parameter passed to the function. Using static
allows to build this simple counter without additional workaround.
Static variable exists only in a local function scope. It can not be accessed outside of the function it has been defined in. So you may be sure that it will keep its value unchanged until the next call to that function.
Static variable may only be defined as a scalar or as a scalar expression (since PHP 5.6). Assigning other values to it inevitably leads to a failure at least at the moment this article was written. Nevertheless you are able to do so just on the next line of your code:
function countSheep($num) {
static $counter = 0;
$counter += sqrt($num);//imagine we need to take root of our sheep each time
echo "$counter sheep jumped over fence";
}
Result:
2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence
Static function is kinda 'shared' between methods of objects of the same class. It is easy to understand by viewing the following example:
class SomeClass {
public function foo() {
static $x = 0;
echo ++$x;
}
}
$object1 = new SomeClass;
$object2 = new SomeClass;
$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother
This only works with objects of the same class. If objects are from different classes (even extending one another) behavior of static vars will be as expected.
Another way to keep values between function calls is to use closures. Closures were introduced in PHP 5.3. In two words they allow you to limit access to some set of variables within a function scope to another anonymous function that will be the only way to access them. Being in closure variables may imitate (more or less successfully) OOP concepts like 'class constants' (if they were passed in closure by value) or 'private properties' (if passed by reference) in structured programming.
The latter actually allows to use closures instead of static variables. What to use is always up to developer to decide but it should be mentioned that static variables are definitely useful when working with recursions and deserve to be noticed by devs.
I won't post a complete answer to the question, as the existing ones and the PHP manual do a great job of explaining most of this.
But one subject that was missed was that of superglobals, including the commonly used $_POST
, $_GET
, $_SESSION
, etc. These variables are arrays that are always available, in any scope, without a global
declaration.
For example, this function will print out the name of the user running the PHP script. The variable is available to the function without any problem.
<?php
function test() {
echo $_ENV["user"];
}
The general rule of "globals are bad" is typically amended in PHP to "globals are bad but superglobals are alright," as long as one is not misusing them. (All these variables are writable, so they could be used to avoid dependency injection if you were really terrible.)
These variables are not guaranteed to be present; an administrator can disable some or all of them using the variables_order
directive in php.ini
, but this is not common behaviour.
A list of current superglobals:
$GLOBALS
- All the global variables in the current script$_SERVER
- Information on the server and execution environment$_GET
- Values passed in the query string of the URL, regardless of the HTTP method used for the request$_POST
- Values passed in an HTTP POST request with application/x-www-form-urlencoded
or multipart/form-data
MIME types$_FILES
- Files passed in an HTTP POST request with a multipart/form-data
MIME type$_COOKIE
- Cookies passed with the current request$_SESSION
- Session variables stored internally by PHP$_REQUEST
- Typically a combination of $_GET
and $_POST
, but sometimes $_COOKIES
. The content is determined by the request_order
directive in php.ini
.$_ENV
- The environment variables of the current scriptIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With