2011-04-28 69 views
3

我想使用數據庫類(ADOdb for PHP),但我不知道如何在另一個類中使用它。 例子:在另一個類中使用包含的類

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

我認爲這個問題是我不能調用$康恩,因爲它定義在類外。

注意:未定義的變量:康恩

致命錯誤:調用非對象的成員函數連接()

也許我做了錯誤的方式,但我真的不知道如何解決這個問題。

有人可以幫我嗎?非常感謝!

+0

您應該準備好更多關於PHP中的變量作用域的信息 2011-04-28 23:05:44

回答

4

爲什麼不簡單地這樣做?!

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

$conn->Connect(...); 

class Contacts { 

    protected $_connection; 

    public function __construct($conn) 
    { 
     $this->_connection = $conn; 
    } 
    public function getData(){ 

     //do something 

    } 
} 

$contacts = new Contacts($conn); 

$foobar = new FooBar($conn); 

?> 

在類的外部建立連接,然後傳入已經可用的對象是有意義的。當然,在所有需要它的類中共享相同的連接對象。

P.S我真的會reallly建議放棄ADODB並開始學習PDO

+0

當我在班級之上建立它時,我的連接是否始終保持開放狀態?我真的不喜歡那樣或者不重要? – Dnns 2011-04-28 22:51:13

+1

是的,它保持打開狀態,但Contacts類不應負責建立連接或知道連接細節。它使錯誤處理更復雜一些。那麼接下來的課程將如何使用它......你將不得不檢查連接是否已經打開......以及如果你改變了你使用班級的順序......如我所說 - 它是一團糟。 – 2011-04-28 22:54:35

+0

嗯,好的謝謝。我正在使用ADODB,因爲一次又一次地沒有建立我的數據庫連接。但是我真的不知道當我(試着嘿嘿)編碼OOP時,什麼是「建立」連接的最佳方式。 – Dnns 2011-04-28 23:05:05

2

需要引用全局變量:

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

這就是說,你可能會更好使用這樣的依賴注入:

<?php 
class Contacts { 

    private $db; 

    public function setDB($conn) { 
     $this->db = $conn; 
    } 

    public function getData(){ 
     if (!$this->db) { 
      throw new Exception(); 
     } 
     $conn = $this->db; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

然後包括你的ADODB包括和實例在一個初始化部分。

編輯:請參閱關於Dependency Injection的文章,因爲養成使用這個(而不是全局變量)的習慣可能會節省很多麻煩。

+1

希望你+1,但連接是如此重要,它應該像Tim Cooper,PabloSerbo – meouw 2011-04-28 22:42:22

1

$conn超出了您的變量範圍。使用以下,使其工作:

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 

另一種方式來做到這一點是有你的對象內部變量的引用:

class Contacts { 
    private $ref; 
    public function __construct($conn) 
    { 
     $this->ref = $conn; 
    } 
    public function getData(){ 
     $ref->Connect(...); 
     //do something 
    } 
} 

$contacts = new Contacts($conn); 
+0

這樣的構造器進來我試圖做一個GLOBAL var,但我做錯了。非常感謝! – Dnns 2011-04-28 22:34:06

+0

是否可以在CLASS中的其他地方定義GLOBAL變量,因此我不必在其他函數中再次定義它們。 – Dnns 2011-04-28 22:36:18

+0

使用全球從來沒有解決方案 – 2011-04-28 22:42:25

4

你有多種選擇:

使用全球預留字:

<?php 
include_once("adodb.inc.php"); 
$conn = NewADOConnection('mysql'); 

class Contacts { 
    public function getData(){ 
     global $conn; 
     $conn->Connect(...); 
     //do something 
    } 
} 
?> 

或者在創建時將$ conn傳遞給您的對象

$contacts = new Contacts($conn); 

class Contacts { 
    protected $conn; 
    public function __construct($conn){ 
     $this->conn = $conn; 
    } 
    public function getData(){ 
     $this->conn->Connect(...); 
     //do something 
    } 
} 
?> 

或者你可能是你的單身數據連接對象。但這被認爲是反模式,所以我會注入你的依賴項,如選項2.

相關問題