views:

207

answers:

4

I've had this problem before before with no real resolution. It's happening again so I'm hoping you experts can help.

I set a variable on my index.php based on the $_GET array. So I use this code:

$admin = isset($_GET['admin']) ? $_GET['admin'] : "dashboard";

Below that, I use a function to include my layout:

include_layout("admin_header.php");

which calls this function:

function include_layout($template="") {
    include(SITE_ROOT.DS.'layouts'.DS.$template);
}

So far, so good, everything works. But if I try to echo the $admin variable from within the admin_header.php file, I get nothing. It's as if it's not set. I even test it by using echo $admin; right before I include the header file, and it outputs there, but it's not set from the admin_header.php file's perspective.

Why would this happen? Is it something to do with using a function to include, rather than including it directly? And if so, WHY would that matter?

THANKS!!!!!!!!

+5  A: 

It's not possible to access global variables unless you say so explicitly. You have to put global $admin in the function to be able to access the variable.

The reason is you include the file inside of a function, so the $admin variable lives in the global scope, while the included file lives in the functions scope.

function include_layout($template="") {
    global $admin;
    include(SITE_ROOT.DS.'layouts'.DS.$template);
}

Another possibility is to use the extract method.

function include_layout($template="", $variables) {
    extract($variables, EXTR_SKIP);
    include(SITE_ROOT.DS.'layouts'.DS.$template);
}

include_layout("test.php", array('admin' => $admin));
Ikke
You could explain why it doesn't work as expected - namely that the file is included in the context of the function.
gnud
That was it. Thanks!
Jason Rhodes
+10  A: 

Its because that variable is out of scope because you are including the file using a function. You either need to pass the variable to the function in another parameter or declare the variable as global within the function

either:

function include_layout($template="") {
    global $admin;
    include(SITE_ROOT.DS.'layouts'.DS.$template);
}

or:

function include_layout($template="",$admin="") {
    include(SITE_ROOT.DS.'layouts'.DS.$template);
}
include_layout("admin_header.php",$admin);
seengee
+2  A: 

It might matter because PHP doesn't give functions access to global variables unless you explicitly ask for it. Sanitizing your input would also be a good idea.

Azeem.Butt
What do you mean by "sanitizing your input"? If you're talking about the $_GET variable, thanks -- I'm just trying to get the includes working right now.
Jason Rhodes
+2  A: 

It's a variable scoping issue. $admin is not defined inside the function, include_layout(). You can adjust your code a few ways. One is to say "global $admin;" inside include_layout(). Another is to set the variable, $admin, inside of "admin_header.php" if, for instance, the variable is only needed in that one layout context.

JBD