我正在尝试从所需文件中定义的函数访问变量:
**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()
返回正确的值...我该如何解决这个问题?
答案 0 :(得分:1)
function run() {
require('cfg.php');
require('function.php');
print(fn());
}
您的代码遇到variable scope个问题。 cfg.php
和function.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;
}