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

Posted

技术标签:

【中文标题】Require_once 似乎不会影响所有功能?【英文标题】:Require_once doesn't seem to affect all functions? 【发布时间】:2012-03-20 09:59:43 【问题描述】:

在我的小项目中一切正常,直到我决定稍微清理一下并将与数据库相关的 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";

?>

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

【问题讨论】:

【参考方案1】:

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

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

您正在使用require_once 将文件拉入getEntries() 函数的范围。 PHP 会记录required 中的文件,因此当您在getBiggestMonth() 中调用require_once 时,它知道它已经包含在getEntries() 中。因为它已经包含在内,所以不需要再次添加该文件,因此您不会在 getBiggestMonth() 范围内获取变量。

require_once 与变量没有任何关系,它只是监视已包含在当前 PHP 进程中的文件。

【讨论】:

但是既然已经被要求了,应该不需要再要求了吧?我不太了解 $dbHost 是如何在 getBiggestMonth() 中不回显的,因为如果变量不存在,它们将是必需的,如果存在,它什么也不做。所以它应该总是回声? 我已尝试在上面的更新答案中进一步解释。 啊哈!我现在知道了。这比他们将它放在 php.net/manual 中的方式更容易理解。确实,它现在似乎可以工作了,谢谢!【参考方案2】:

getEntries() 中返回后的 echo 语句显然不会起作用,因为函数在返回后退出。

【讨论】:

以上是关于Require_once 似乎不会影响所有功能?的主要内容,如果未能解决你的问题,请参考以下文章

符号链接 - require_once 似乎不起作用?

require与require_once有啥区别?PHP

来自空对象的“Interiting”似乎不会影响性能

Android - 粗体标签似乎不会影响 Strings.xml 中的 URL 文本 [重复]

python字符串前面加r的问题,不会影响\d这个转义字符

梨邮件功能密件抄送不会发送