2012-12-29 159 views
0

我想重構一些代碼,但我有點困惑。我定義我的數據庫連接,如下所示:我可以將一個變量傳遞給一個函數嗎?

try{ 
    global $conn; 
    $conn = new PDO("mysql:host=$host",$root,$pw); [...] 

現在我想檢索錶行的功能,但它需要$conn。有什麼辦法可以讓$conn進入這個功能?我試圖將其設置爲默認值,但不工作:

function get($table,$conn=$conn,$limit=10){ [...] 

然後我嘗試了use關鍵字,但我認爲這是僅適用於匿名函數:

function get($table,$limit=10)use($conn){ 
    $query = $conn->query(" [...] 

如何做其他人做這個?我在這裏錯過了很明顯的東西嗎

+0

這不是一個局部變量,所以你可能想改進你的問題的措辭,所以它聽起來沒有誤導。 – hakre

+0

你說得對,我編輯了它。讓它成爲全球化是我急於進入功能的絕望嘗試。 – RubenGeert

+1

理想情況下,你的'get'函數應該是與'$ conn'屬性相同的類的一個方法。通過這種方式可以通過以下方式訪問:'$ this-> conn' –

回答

4
function get($table, $limit=10) 

正如你已經在你的問題中寫道,這個函數頭是不完整的。如果沒有$conn,該功能本身就無法完成它所需要的功能。

由於這是在全局命名空間的功能,最簡單的事情可能是使用全局變量:

function conn_get($table, $limit=10) { 

    global $conn; 

我也命名空間的功能,使關係明確。這樣做的問題是兩件事情:

  1. 全球職能是維持
  2. 全局變量保持

所以你通常做在這種情況下,是包裝成一類這個很貴很貴:

class Conn 
{ 
    private $conn; 

    public function __construct(PDO $conn) { 

     $this->conn = $conn; 
    } 

    public function get($table, $limit=10) { 

     $query = $this->conn->query("[...]"); 
     ... 
    } 
} 

然後,通過在其周圍可以使用Conn對象:

$pdo = new PDO("mysql:host=$host", $root, $pw); 
$conn = new Conn($pdo); 

然後:

$conn->get('ColorTable', 200); 

私有變量接管與同一對象內的每個方法都可以訪問它的利益的全局變量的作用。所以現在的一切都在它自己的空間裏,與全球空間背道而馳,不會像對方那樣快速。隨着時間的推移,這很容易(更容易)改變和維護。

+0

Thx爲解釋!它也在工作! – RubenGeert

0

當你調用的函數,即:

$table_rows = get($table, $conn); 

您傳遞函數範圍內的局部變量。

但是,您不能將默認的非靜態變量定義爲:$conn=$conn會引發致命錯誤。

0

你可以做最簡單的事情就是創建一個將返回的$conn變量

function conn(){ 
    $conn = NULL; 
    ...some database connection setup etc... 
    return $conn; 
} 

,並打電話給你需要使用它

function getDb(){ 
conn()->query(" [...]"); 
} 

其他功能的功能conn()功能將可用於您的PHP腳本的所有功能。

但是,如果您打算製作更復雜的Web應用程序,我建議您使用PHP框架或創建PHP類並應用OOP原則來處理數據庫連接。

+1

您剛剛用一個全局函數替換了一個全局變量 - 如果沒有廣泛地討論它的優點和缺點,看起來似乎不正確。 – hakre

+0

我只是直截了當地回答,以及OP說他希望將一個變量傳遞給函數,但在我的回答中,我建議他必須使用PHP框架或創建一個PHP類,它指的是更好的答案。 –

0

在PHP中,use是匿名/ lambda函數的使用方式,但不適用於普通函數。

如果數據庫連接在全球範圍內飛來飛去,你可以把它作爲一個正常的變量,你的功能,像這樣:

function get(PDO $conn, $table,$limit=10) { 
    $query = $conn->query(" [...] 
} 

除此之外(!不好的做法)是獲得全球$conn可變進功能,像這樣:

function get($table,$limit=10) { 
    $query = $GLOBALS['conn']->query(" [...] 
} 

但是,我們建議採用面向對象的方法!您可能需要inject the Database Class via dependency injection進入您需要的類別。

相關問題