Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can';t访问嵌套函数中的变量_Php - Fatal编程技术网

Php Can';t访问嵌套函数中的变量

Php Can';t访问嵌套函数中的变量,php,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

我有一个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”。
将变量传递给main函数,然后再传递给第二个函数是可行的,但它会创建非常不可读的代码,参数太多,因为这同样适用于其他所有变量

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

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;

$b = $a + $b;
} 

Sum();
echo $b;  
返回2,这让我怀疑PHP配置有问题,因为根据PHP文档()它应该返回3

如何使全局变量工作,或者是否有其他方法可以从嵌套函数中访问变量而无需多次传递它们


PHP版本为5.3.10-1ubuntu3.8,并且还安装了Zend framework。如果您需要任何其他信息,请告诉我。

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

$query10 = "select name from table where id = '" . $args[0] . "'";
它更易于阅读,您可以将此语法与字符串键一起使用,就像
$args['myvar']
一样

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

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

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

$query10 = "select name from table where id = '" . $args[0] . "'";
它更易于阅读,您可以将此语法与字符串键一起使用,就像
$args['myvar']
一样

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

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

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

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

传递表示要使用的数据库连接的对象是依赖项注入的一种简单形式,它使单元测试等工作变得更容易


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

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

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

传递表示要使用的数据库连接的对象是依赖项注入的一种简单形式,它使单元测试等工作变得更容易


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

请参见,代码是有效的,因此您的问题前提是错误的。您可以使用全局变量,也可以传递变量,没有其他方法。一般人都不喜欢全球化。您应该围绕传递参数来设计应用程序。OOP在这里可以提供很多帮助,而不是纯粹的过程函数。@deceze它永远不会像OP在他电脑上体验的那样返回2server@deceze这只是证明我得到的结果是错误的?对答案有点困惑。deceze的链接显示任何PHP版本的答案都应该是3,这也让我非常好奇。您显示的代码在任何PHP版本中都应该显示
3
。如果它不适合你,那就意味着代码中有比你展示的更多的东西。如果您修复了未向我们展示的代码中的任何错误,您可以使
全局
工作。看,代码工作,因此您的问题前提是错误的。您可以使用全局变量,也可以传递变量,没有其他方法。一般人都不喜欢全球化。您应该围绕传递参数来设计应用程序。OOP在这里可以提供很多帮助,而不是纯粹的过程函数。@deceze它永远不会像OP在他电脑上体验的那样返回2server@deceze这只是证明我得到的结果是错误的?对答案有点困惑。deceze的链接显示任何PHP版本的答案都应该是3,这也让我非常好奇。您显示的代码在任何PHP版本中都应该显示
3
。如果它不适合你,那就意味着代码中有比你展示的更多的东西。如果您修复了未向我们显示的代码中的任何错误,则可以使
全局
正常工作