Require_once似乎不会影响所有功能?

时间:2012-03-01 21:10:04

标签: php scope mysqli require-once

在我的小项目中,一切都运行良好,直到我决定清理一点并将与数据库相关的php文件移动到他们自己的文件夹中。事情变得很奇怪。

我想在这里使用两个函数:

function getEntries () {
    require_once("mysqliVariables.php");
    $mysqli = new mysqli($dbHost, $dbUname, $dbPwd, $dbName);           
    $sql = "statement...";
    $result = $mysqli->query($sql) or die($mysqli->error);

    echo $dbHost; // prints host
    return $result;
}

function getBiggestMonth () {
    require_once("mysqliVariables.php");
    $mysqli = new mysqli($dbHost, $dbUname, $dbPwd, $dbName);           
    echo $dbHost; // prints nothing! why?       

    $sql = "statement...";
    $result = $mysqli->query($sql) or die($mysqli->error); // this line does not run, of course.

    return $result;
}

我在另一个文件(和文件夹)中使用另一个函数来调用这些函数,就像这样开始:

function listTasks() {      
    require_once("db/mysqliFunctions.php");

    // Get entries using mysqli.
    $tasks = getEntries();

    echo "<pre>";
    var_dump($tasks);
    echo "</pre>"; // program works fine this far.

    $bm = getBiggestMonth(); // program breaks somehow during this function call.

我的变量在如下的php文件中:

<?php   
$dbHost = "host";
$dbUname = "username";
$dbPwd = "password";
$dbName = "databasename";

&GT;

如果我切换了funtion的调用顺序,那么getBiggestMonth()运行正常而另一个则不运行。此外,当所有文件都位于同一个文件夹中时,所有这些工作都很好(函数是类中的静态函数,但这应该不是问题,这里仍存在同样的问题) ,所以我不明白变量范围在这里可能有什么不同,而require_once应该处理其他事情。帮助

2 个答案:

答案 0 :(得分:1)

这是因为您使用的是require_once。它只包含一次配置。您可以将其更改为使用require,以便它可以按预期工作。

  

require_once()语句与require()相同,除了PHP   检查文件是否已被包含,如果是,则不包括   (要求)再次。

您正在使用require_once将文件提取到getEntries()功能的范围内。 PHP记录了require d的文件,因此当您在require_once中调用getBiggestMonth()时,它知道它已经包含在getEntries()中。因为已经包含它,所以不再需要该文件,因此您不会在getBiggestMonth()范围内获取变量。

require_once与变量无关,它只监视当前PHP进程中包含的文件。

答案 1 :(得分:1)

getEntries()返回后的echo语句显然不会在函数退出后退出。