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

时间:2013-10-17 10:30:30

标签: php

我有一个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框架。如果您需要任何其他信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

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

解决问题的最佳方法是将数据直接传递给您的函数,并将函数return设置为这些值。全局化变量可能会直接起作用,但是你很容易忘记你正在做的事情,因为你已经破坏了变量的范围。

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