<?php
$foo = 1;
function meh(){
// <-- $foo can't be accessed
}
It doesn't look like a global variable. However, does it have disadvantages like global stuff if it's outside the function?
All variables defined outside any function are declared in global scope. If you want to access a global variable you have two choices:
Use the global keyword
<?php
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
?>
Or use the $GLOBALS
<?php
$a = 1;
$b = 2;
function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
?>
Read more at http://php.net/manual/en/language.variables.scope.php
Yes. They can be accessed from any location, including other scripts. They are slightly better as you have to used the global keyword to access them from within a function, which gives more clarity as to where they are coming from and what they do.
The disadvantages of global variables apply, but this doesn't instantly make them evil as is often perceived in some OO languages. If they produce a good solution that's efficient and easily understandable, then you're fine. There are literally millions of succesful PHP projects that use global variables declared like this. The biggest mistake you can make is not using them and making your code even more complicated when it would have been perfectly fine to use them in the first place. :D
<?php
$foo = 1;
function meh(){
global $foo;
// <-- $foo now can be accessed
}
?>
Outside of the function is sorta like global scope (when compared to C-like languages), but you have to do one thing to allow access to the var within a function:
function meh(){
global $foo;
// $foo now exists in this scope
}
In your example $foo gets created as variable in the global scope. (Unless your shown script was included() from within another functions/methods scope.)
PHP doesn't have real global variables. You have to manually alias it using the global $foo; statement to access them. (Also the "anything global is bad" advise is just that, bad advise.)
If I understand your question correctly, there really shouldn't be a problem. Unless you declare a variable as a global, it will been limited to the scope in which it is declared, in this case whatever php file the above code is defined in. You could declare another variable $foo in meh() and it would be independent of the $foo defined outside.
Related
I have heard using global variables is not good, however I am just trying to understand how the PHP language works. I am a beginner in the coding world.
Why can global variables be created within functions? Whether it is through the use of the global keyword or through a superglobal variable. I thought these two actions were used to access global variables in a function. I thought the only way you can create a global variable is to create it outside a function; in the global scope. I have looked at many different websites including w3schools.com and php.net
This is just some simple code I created to try and understand the way global variables work with functions:
<?php
function sample1() {
global $a;
echo $a = "this ";
}
sample1();
function sample2() {
echo $GLOBALS['$b'] = "is ";
}
sample2();
function sample3() {
global $c;
$c = "an ";
}
sample3();
echo $c;
function sample4() {
$GLOBALS['$d'] = "example ";
}
sample4();
echo $GLOBALS['$d'];
?>
This is the result of the code:
this is an example
All of the code works, but I don't understand how I created a global variable on any of these blocks of code? The global variables were not created outside of the functions. How can they be created inside of a function? What am I missing? Any response is appreciated - If possible, please keep the answer simple - I would like to discuss this further in the comment section, because I'm sure I will have follow up questions - Thank you
Variables can be created in the global scope in the two ways you just did - there's nothing saying that a function can't create (or change) a variable in the global scope - WHEN you explicitly ask for it through $GLOBALS or the global keyword.
The issue is that your belief "I thought the only way you can create a global variable is to create it outside a function; in the global scope." is not an exact statement. When you're using $GLOBALS and global, you're referring to the global scope. You're introducing a reference to the global scope inside your function.
With global you're in effect linking the local reference to the global reference, while with $GLOBALS you're explicitly referencing the global scope (which internally inside PHP can be introduced to the local scope in the same way).
In that case you're explicitly saying "I want this variable to be available in the global scope, make it so!" and PHP does what you're asking it to. This behaviour differ between languages, but as you've discovered for PHP, it's allowed.
It's not something I would recommend using in any way - it makes your code very hard to follow and argue around, so consider it an esoteric detail.
Here is a shortened version of my code:
<?php
$foo = "Bar";
function test () {
echo $foo; // Undefined variable?
}
test();
?>
I don't understand, why PHP says, that $foo is undefined. And I always find solutions for deactivating the error reporting, but I want to fix my code. What am I missing?
In PHP you cannot access global variables from functions unless you explicitly import them using global $foo;.
$foo = "Bar";
function test() {
global $foo;
echo $foo;
}
test();
Another option would be accessing it as $GLOBALS['foo'] - $GLOBALS is a special array that "contains" the global scope and is available wverywhere.
However, using global variables is usually a bad idea that results in spaghetti code. Try to avoid them. Usually the correct way is to make the variable a function argument:
function test($foo) {
echo $foo;
}
test('bar');
<?php
$foo = "Bar";
function test ($foo) {
echo $foo; // Now it's defined, as it's passed to the function.
}
test($foo);
?>
It is outside the scope of the function, therefor it does not know it exists.
Don't listen to them telling you to use global - it's not good practice, and will really clutter up your global array (and potentially cause security risks depending on what you toss in there).
Pass the parameters as arguments. This is the correct way.
In the function test, $foo is currently regarded as a local variable. But you didn't defined such a local variable in this method.
What you want, is to use the variable $foo defined outside this function. Hence you want to use a global variable. So you should declare it as such, ie, using global $foo in your function test.
You may want to read http://www.php.net/manual/en/language.variables.scope.php to get a better understanding of this concept.
add a global $foo on your function
$foo = "Bar";
function test () {
global $foo;
echo $foo; // Undefined variable?
}
test();
It seems you need some more tutorials... This is the basics of programming languages:
http://www.php.net/manual/en/language.variables.scope.php
You should pass you variable as parameter (in some cases, global variable can be used but rarely).
I just faced a piece of code which makes it possible accessing the variable by making it global and started thinking if it is different from other language approach/behavior
<?php
$a1 = "WILLIAM";
$a2 = "henry";
$a3 = "gatES";
echo $a1 . " " . $a2 . " " . $a3 . "<br />";
fix_names();
echo $a1 . " " . $a2 . " " . $a3;
function fix_names()
{
global $a1; $a1 = ucfirst(strtolower($a1));
global $a2; $a2 = ucfirst(strtolower($a2));
global $a3; $a3 = ucfirst(strtolower($a3));
}
?>
The code accesses variables defined outside the function and makes them global inside the function. This is unlikely in other languages. For example we write variables in global space in C and make them global, thus we can access them inside function. So we first make them global and then access them everywhere. In above code, we first access them inside the function (also I did not understand how we can access $a1, $a2, $a3 inside function when they are not passed as an argument) and then make them global. Is this because of any different behavior of PHP processor.
Also I did not understand how we can make variables global elsewhere away from its declaration.
Sorry this may not be a question asking exactly where the code is breaking, but I believe understanding why code is written in a particular manner and why it behaves in a particular manner is also important.
Putting it (hopefully) in much cleared words
I want to know: inside a function when we create a global variable with the same name as the variable that already exist in an outer scope, it actually global-izes the variable in outer scope instead of creating a new global variable (with null value). Is it like that? And if yes isn't that different from other languages? So is there any reason behind such distinct behavior?
In php functions has their own scope, thus if you declare the variable elsewhere outside the function it will not visible inside it. To use them inside the function you need to declare it global. Usually, I use Registry pattern to not polute global scope and store all global objects which I will use later.
According to the manual - http://php.net/manual/en/language.variables.scope.php
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.
...
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.
...
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.
This enables you to use the same $var name inside a function, without it reassigning the value-
$var = 'string';
function test(){
$var = 'new string';
return $var;
}
echo $var; // echo's - string
test(); // echo's - new string
Consider using sessions. You can define you variables in file file1.php like this:
session_start();
$_SESSION['a'] = 'William';
Then you can access any session variable in file file2.php like this:
echo $_SESSION['a'];
Please find a nice article on Global variables in php - It will tell you about various global variables that exist in Php Language and how to use and access these variables and their purpose.
Reference : https://www.w3elearners.com/php/global-variables/
Lets say I have this:
function myFunc()
{
global $distinct_variable;
die ($distinct_variable);
}
function anotherFunc()
{
$distinct_variable = 'Hello World';
myFunc();
}
anotherFunc();
For anotherFunc() to correctly show 'Hello World', it must be written like this
{
global $distinct_variable;
$distinct_variable = 'Hello World';
myFunc();
}
Now it will show the message, but why must I global $distinct_variable; in anotherFunc() since it is a global in myFunc() which is within anotherFunc()
Yes, I know that variables inside functions won't go outside of them, but I was thinking it should have worked...
Could someone explain why isn't it working?
Thanks.
Thank you for your answers, I get it now :)
A global variable is exactly that - it exists in the GLOBAL scope ONLY.
Everything in PHP (except superglobals) exist in only one scope - be that the global scope, or the scope of a function/method. Scope does not cascade - so just because you have a variable in an "outer" function does not make it available to an "inner" function.
Similarly, global fetches the variables defined in the GLOBAL scope only (the top-most scope), not simply "the scope above this one, from which I was called". This is what you tried to do, but it absolutely will not work. This level of finer-grained control is what function arguments/return values are for.
Each function has its own symbol table. There is also a global symbol table. Just because one function is being called from within another doesn't mean that the variables declared global in one are global in the other, or inherited from the other. They still refer to the variable in the "local" symbol table by default.
Doing global $somevar; echo $somevar boils down to echo $GLOBALS['somevar'];. That $GLOBALS superglobal does not include variables that were defined inside a function: only truly 'global' vars, which exist at the top level of the script.
I'm having trouble with global variables in php. I have a $screen var set in one file, which requires another file that calls an initSession() defined in yet another file. The initSession() declares global $screen and then processes $screen further down using the value set in the very first script.
How is this possible?
To make things more confusing, if you try to set $screen again then call the initSession(), it uses the value first used once again. The following code will describe the process. Could someone have a go at explaining this?
$screen = "list1.inc"; // From model.php
require "controller.php"; // From model.php
initSession(); // From controller.php
global $screen; // From Include.Session.inc
echo $screen; // prints "list1.inc" // From anywhere
$screen = "delete1.inc"; // From model2.php
require "controller2.php"
initSession();
global $screen;
echo $screen; // prints "list1.inc"
Update:
If I declare $screen global again just before requiring the second model, $screen is updated properly for the initSession() method. Strange.
Global DOES NOT make the variable global. I know it's tricky :-)
Global says that a local variable will be used as if it was a variable with a higher scope.
E.G :
<?php
$var = "test"; // this is accessible in all the rest of the code, even an included one
function foo2()
{
global $var;
echo $var; // this print "test"
$var = 'test2';
}
global $var; // this is totally useless, unless this file is included inside a class or function
function foo()
{
echo $var; // this print nothing, you are using a local var
$var = 'test3';
}
foo();
foo2();
echo $var; // this will print 'test2'
?>
Note that global vars are rarely a good idea. You can code 99.99999% of the time without them and your code is much easier to maintain if you don't have fuzzy scopes. Avoid global if you can.
global $foo doesn't mean "make this variable global, so that everyone can use it". global $foo means "within the scope of this function, use the global variable $foo".
I am assuming from your example that each time, you are referring to $screen from within a function. If so you will need to use global $screen in each function.
You need to put "global $screen" in every function that references it, not just at the top of each file.
If you have a lot of variables you want to access during a task which uses many functions, consider making a 'context' object to hold the stuff:
//We're doing "foo", and we need importantString and relevantObject to do it
$fooContext = new StdClass(); //StdClass is an empty class
$fooContext->importantString = "a very important string";
$fooContext->relevantObject = new RelevantObject();
doFoo($fooContext);
Now just pass this object as a parameter to all the functions. You won't need global variables, and your function signatures stay clean. It's also easy to later replace the empty StdClass with a class that actually has relevant methods in it.
You must declare a variable as global before define values for it.
The global scope spans included and required files, you don't need to use the global keyword unless using the variable from within a function. You could try using the $GLOBALS array instead.
It is useless till it is in the function or a class. Global means that you can use a variable in any part of program. So if the global is not contained in the function or a class there is no use of using Global