开发者

Unable to access global variable in included file

开发者 https://www.devze.com 2023-03-08 03:54 出处:网络
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.

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 g开发者_如何转开发ot 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).
}


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).


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消