2013-10-17 62 views
0

我有一个完美的作品一个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框架。如果您需要任何其他信息,请让我知道。

+0

请参阅http://3v4l.org/dGpDl,代码有效,所以您对该问题的前提是错误的。你既可以使用全局变量,也可以传递变量,没有其他办法。全球通常都会皱眉。你应该围绕传递参数设计你的应用程序。 OOP可以在这里帮助很多,而不是纯粹的程序功能。 – deceze

+0

@deceze它永远不会像OP在他的服务器上体验到的那样返回2 –

+0

@DanyP正确。 – deceze

回答

0

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

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

它更容易阅读,你可以使用这个语法与字符串键以及像$args['myvar']

您的问题的最佳解决方案是将数据直接传递到您的功能,并具有您的功能return这些值。全球化你的变量可能有直接的作用,但你很容易失去你所做的事情的踪迹,因为你已经摧毁了变量的范围。

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

我不知道为什么你的全局变量的测试没有工作,也许有你不向我们展示了文件中的其它代码,但全局变量通常被认为是一个坏主意呢。

结构化程序设计的本质是,您可以在不依赖全局副作用的情况下分离出不同的任务和关注点。大量使用的全局变量对于调试非常棘手,并且很难用不同的实现来替换,因为所有函数都希望能够随时抽出变量。

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

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