John
John

Reputation: 1540

Unable to access global variable in included file

I am having an unexpected issue with scope. The include documentation (also applies to require_once) says the required file should have access to all variable at the line it was required.

For some reason I am not able to access a class instantiated with global scope inside a function that was required in.

Would anyone know why? I am obviously missing something.

I got it working through a reference to $GLOBALS[], but I still want to know why it is not working.

UPDATE:
The error I am getting is:

Fatal error: Call to a member function isAdmin() on a non-object in <path>.php on <line>

Code:

$newClass = new myClass();

require_once("path to my file");

----- inside required file -----
function someFunction() {
     $newClass->someMethod(); // gives fatal error. (see above).
}

Upvotes: 4

Views: 10887

Answers (2)

kapa
kapa

Reputation: 78671

Functions define a new scope, so inside a function you cannot access variables in the global scope.

Variable Scope

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

About included files, the manual states:

When a file is included, the code it contains inherits the variable scope of the line on which the include occurs.

So if you include something in a function, the included file's scope will be that of the function's.

UPDATE: Looking at your code example edited into the question, global $newClass; as the first line of the function should make it working.

$newClass = new myClass();
require_once("path to my file");

----- inside required file -----
function someFunction() {
     global $newClass;
     $newClass->someMethod(); 
}

Be aware though that using global can quickly make your code more difficult to maintain. Don't rely on the global scope, you can pass the object to the function as a parameter, or use a Singleton/Registry class (some tend to argue against the latter, but depending on the case it can be a cleaner solution).

Upvotes: 4

rid
rid

Reputation: 63442

The included code doesn't have a scope different than the code surrounding it. For example:

function a() {
    echo $b;
}

This will fail even if echo $b is in an included file. If you replace the above with:

function a() {
    include 'file.php';
}

... and file.php contains:

echo $b;

... then it's the same thing as if you wrote:

function a() {
    echo $b;
}

Think of it this way: whenever you use include / require, the contents of the included file is going to replace the include / require statement, just as if you removed the statement and pasted the contents of the file in its place.

It doesn't do anything else as far as scope is concerned.

Upvotes: 2

Related Questions