PHP - 奇怪的全局行为

时间:2014-03-08 21:05:16

标签: php function include global-variables

我正在尝试从所需文件中定义的函数访问变量:

**main.php**

function run() {
    require('cfg.php');
    require('function.php');
    print(fn());
}


**cfg.php**

$test = 'Var!';


**function.php**

function fn() {
    global $test;
    return $test;
}

我期待“Var!”作为输出。但是$test似乎是NULL。 我也尝试过这个用于调试:

**function.php

var_dump($test);
function fn() {
    global $test;
    return $test;
}

var_dump()返回正确的值...我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

为什么不起作用?

function run() {
    require('cfg.php');
    require('function.php');
    print(fn());
}

您的代码遇到variable scope个问题。 cfg.phpfunction.php中的变量/函数仅存在于run()函数中,并且无法全局访问。

考虑您的fn()功能:

function fn() {
    global $test;
    return $test;
}

您正在尝试访问$test变量。它没有全局定义,因此尝试访问它将返回NULL(应该如此)。

考虑第二种情况:

$test = 'Var!';

var_dump($test);

function fn() {
    global $test;
    return $test;
}

此处,$test变量定义的。因此global $test;变量将正确地将变量导入函数作用域,并且return语句将返回变量。这就解释了为什么你得到第二个代码块的输出Var!

您应该使用什么?

使用global变量不被视为良好做法,因为它违反了封装等。我建议不要使用它们。

使用常量来存储配置。常量的范围是全局。您可以在脚本中访问常量 中的常量,而不考虑范围。

将您的逻辑分成多个文件。使用cfg.php进行配置,functions.php进行功能等。这样,您可以独立保存文件,并根据要求。这样,您还可以避免必须从包含文件中包含(甚至包括来自包含文件的包含)等的头痛。


config.php

<?php

define('test', 'Var!')

functions.php:

<?php

function doSomething($foo) {
    // do something with $foo and return
}

function somethingElse($bar) {
    // do something with $bar and return
}

main.php:

<?php

require_once 'cfg.php';
require_once 'include.php';

// more code

答案 1 :(得分:0)

您在cfg.php函数的上下文中包含run - 因此,变量定义会创建一个局部变量。

如果你将$test = 'Var!'更改为$GLOBALS['test'] = 'Var!',你会得到预期的行为,但是这会使问题消失,这不是一个好办法 - 将变量从一个脚本注入到另一个脚本中范围永远不会。

你可能应该做的是使用constants,例如:

// cfg.php
const TEST = 'Var!';

// main.php
require('cfg.php');

function run() {
    require('function.php');
    print(fn());
}

// function.php

function fn() {
    return TEST;
}