2014-02-14 56 views
-1

我有一個包含相當多的功能的輔助文件,但沒有「主」功能。這些輔助函數中的每一個都需要數據庫連接。爲了提高代碼的可維護性,我想把保存數據庫連接的變量置於全局狀態(任何函數之外),這樣每個函數都可以看到它,並且可以在它們的mysql調用中使用它。這裏是我的意思是:PHP全局變量的作用域

$path = $_SERVER['DOCUMENT_ROOT']; 
$connection = $path . '/scripts/connection.php'; 
include ($connection); // this initializes the variable '$link' 

function getLocation ($id) { 
    $sql = "SELECT name FROM Locations WHERE id=$id"; 
    $result = mysqli_query($link, $sql); 
    if (!$result) { return -1; } 
    $row = mysqli_fetch_array($result); 
    mysqli_close($link); 
    return $row['name']; 
} 

function getGroupID($group_id) { 
    $sql = "SELECT id FROM Groups WHERE group='$group_id'"; 
    $result = mysqli_query($link, $sql); 
    if (!$result) { return -1; } 
    $row = mysqli_fetch_array($result); 
    mysqli_close($link); 
    return $row['id']; 
} 

// and many other similar functions 

我寧願不把每個函數內的全球三大行從那時起,我一遍又一遍地重複代碼,但這個方法有沒有全局範圍。我可能會考慮將$link變量作爲參數傳遞,但這需要重構很多函數調用。我知道對這樣的全局變量有些皺眉,但在這種情況下,這是我最簡單的解決方案。另外,如果我用這個替換三條全局線: include '../scripts/connection.php' 我的代碼工作正常,但是後來我失去了一些相對引用的靈活性。我不明白爲什麼我在這裏發佈的代碼運行不同。

有沒有我可以在全球範圍宣佈這一$connection變量的方法嗎?

謝謝。

+0

你能不能把在那裏你現在把它定義變量'global'? – putvande

+0

@putvande把全局置於定義站點並沒有幫助,你必須把它放在使用變量的函數中。 – Barmar

+0

關於絕對路徑和相對路徑之間的差異,你是否重複了'$ connection'來查看它是否是你期望的路徑? –

回答

0

地說:

global $link; 

在每個函數的開始。

另一種方式做,這是定義打開的連接,並返回鏈接一個函數或類。連接可以是函數中的靜態變量;如果它已經把它不會重新打開的連接:

function get_db_conn() { 
    static $link; 

    if ($link) { 
     return $link; 
    } 
    $link = mysqli_connect(...); 
    return $link; 
} 

那麼所有其他功能都可以下手:

$link = get_db_conn(); 
+0

爲什麼會有人投票呢? –

+1

我懷疑全局變量的強迫性反對意見。 – Barmar

+0

一些答案表明使用全球起立投票,接受和讚揚。其他時間下來投票,「不要那樣做」,並刪除 – ElefantPhace

1

裏面的你的功能,使用方法:

global $connection

這會將全局範圍的變量拉入你的函數中。

或者,你可以看看的ORM - 我個人最喜歡的是IDIORM,但學說,推動也是好的。