无法访问嵌套函数中的变量


Can't access variables in nested functions

我有一个PHP数据库连接,在访问时可以完美运行,如下所示:

$con = mysqli_connect("localhost","username","password","database");  
$result = mysqli_query($con, $query);  

我还可以通过将其作为参数传递来在函数中访问它:

function test($con, $args) {
    $query10 = "select name from table where id = '$args[0]'";
    $result10 = mysqli_query($con, $query10);
}
test($con, array('value1','value2'));

但是,当我尝试从另一个函数调用的函数访问连接时:

mainFunction() {
    test($con, array('value1','value2'));
} 

我得到"faultCode0faultStringWarning:mysqli_query()期望参数1是mysqli,null给定"。
将变量传递给mainFunction,然后传递给第二个函数是有效的,但它会创建带有太多参数的非常不可读的代码,因为同样适用于其他每个变量。

所以我尝试使用全局变量,但由于某种原因它们不起作用。运行

$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
} 
Sum();
echo $b;  

返回 2,这让我怀疑 PHP 配置有问题,因为根据 PHP 文档 (http://php.net/manual/en/language.variables.scope.php) 它应该返回 3。

如何让全局变量工作,或者有没有另一种方法可以从嵌套函数访问变量而无需多次传递它们?

PHP 版本是 5.3.10-1ubuntu3.8,也安装了 Zend 框架。如果您需要任何其他信息,请告诉我。

我不知道为什么你的全局变量测试不起作用,也许文件中还有其他代码你没有向我们展示,但无论如何,全局变量通常被认为是一个坏主意。

结构化编程的本质是您可以分离出不同的任务和关注点,而无需依赖全局副作用。经常使用的全局变量很难调试,并且很难用不同的实现替换,因为所有函数都希望能够随时凭空提取变量。

传递表示要使用的数据库连接的对象是依赖项注入的一种简单形式,可以更轻松地执行单元测试等操作。

还有其他获取数据库连接的方法,这些方法不像依赖注入那样彻底,但比全局变量更容易更改。例如,您可以定义一个函数get_db_connection,该函数保存一个"静态价值",并在每次调用时返回相同的连接。或者对类中的静态变量和方法执行相同的操作。

我的第一个建议是你需要将数组变量连接到你的字符串中

$query10 = "select name from table where id = '" . $args[0] . "'";

它更易于阅读,您可以将此语法与字符串键一起使用,例如 $args['myvar'] .

问题的最佳解决方案是将数据直接传递给函数,并让函数return这些值。全球化变量可能在直接意义上起作用,但您很容易忘记自己正在做什么,因为您已经破坏了变量的范围。

function Sum($a, $b) {
    return $a + $b;
}
$b = Sum($a, $b);