2012-03-01 73 views
2

一切工作在我的小項目很好,直到我決定清理一點點移動的數據庫相關的PHP文件到自己的文件夾。然後事情變得很奇怪。Require_once似乎不影響所有功能?

我想在這裏使用兩個功能:

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"; 

>

如果我切換funtion的調用順序,然後getBiggestMonth()運行正常,另一個則不會。此外,所有的這工作罰款時,所有文件均位於同一個文件夾(功能然後在類中的靜態函數,但不應該是一個問題,同樣的問題仍然在這裏),所以我不明白變量作用域在這裏可能有多不同,require_once應該處理其他事情。幫幫我?

回答

1

這是因爲您使用的是require_once。它只會包含一次配置。您可以將其更改爲使用require,以便其按預期工作。

放在require_once()語句會,如果該文件已經被包含 檢查相同的要求()除了PHP,如果是這樣,不包括 (需要)再次。

您正在使用require_once將文件拉入getEntries()函數的範圍。 PHP記錄了require d的文件,因此當您在getBiggestMonth()中調用require_once時,它知道它已包含在getEntries()中。因爲它已包含在內,所以它不再需要文件,所以你不會在你的getBiggestMonth()範圍內得到你的變量。

require_once與變量沒有任何關係,只是監視已包含在當前PHP進程中的文件。

+0

但既然已經已要求,不應該有需要再次需要它?我不太瞭解$ dbHost在getBiggestMonth()中沒有被回顯,因爲如果變量不在那裏,它們將是必需的,如果它們是,它什麼也不做。所以它應該總是回聲? – hannu40k 2012-03-01 21:27:40

+0

我試圖在上面更新的答案中進一步解釋它。 – Treffynnon 2012-03-01 21:32:08

+0

啊哈!我現在知道了。這比他們如何將它放在php.net/manual中更容易理解。事實上,它似乎現在工作,謝謝! – hannu40k 2012-03-01 21:37:09

1

getEntries()返回後的echo語句顯然不起作用,因爲函數在返回後退出。