2013-10-15 37 views
0

我正試圖在對象的屬性中保留一個打開的pgsql數據庫連接。在對象屬性中存儲資源的PHP

將數據庫連接作爲構造函數的參數傳遞給對象並保存在屬性中。 稍後調用需要數據庫連接的類的函數,並從該屬性讀取數據。 然而,它不知道怎麼讀爲一個工作的數據庫連接。

我檢查了對象外的數據庫連接,並且在類中的函數被調用後,它仍然在那裏打開。

爲什麼資源似乎關閉在對象中,有什麼辦法可以保持它打開?

代碼示例:

public class test{ 

    public function __construct($db_conn){ 
     $this->db_conn = $db_conn; 
     var_dump($this->db_conn);  // this returns resource(4) of type (pgsql link) 
    } 


    public function testDBConn(){   
     var_dump($this->db_conn);   //this returns resource(4) of type (Unknown) 
     $result = pg_query($this->db_conn, 'SELECT * FROM tbl_test'); 
    } 
} 

更新: 我使用實際上是類擴展另一個類。這會導致「PHP致命錯誤:無法通過引用重新分配對象」錯誤,如果我嘗試通過引用設置屬性。如果我的類沒有擴展另一個類,那麼通過引用方法設置屬性效果很好。

有沒有辦法讓它在重載的類中工作?

回答

1

如果您通過引用設置屬性,這將工作。

public function __construct(&$db_conn){ 
    $this->db_conn = &$db_conn; // note the & 
    var_dump($this->db_conn); 
} 

爲了使這個非常清楚,這裏2測試用例:

class reftest { 
    public $test = NULL; 
    public function __construct(&$test) { 
     $this->test = &$test; 
    } 
} 

$test = 'a'; 
echo "\$test before: $test<br>"; 
$reftest = new reftest($test); 
echo "\$test after: $test and " . $reftest->test . "<br>"; 
$test = 'b'; 
echo "\$test after: $test and " . $reftest->test . "<br>"; 

輸出:

$test before: a 
$test after: a and a 
$test after: b and b 

如果你錯過了&標誌之一你的行爲你描述:

class reftest { 
    public $test = NULL; 
    public function __construct(&$test) { 
     $this->test = $test; 
    } 
} 

$test = 'a'; 
echo "\$test before: $test<br>"; 
$reftest = new reftest($test); 
echo "\$test after: $test and " . $reftest->test . "<br>"; 
$test = 'b'; 
echo "\$test after: $test and " . $reftest->test . "<br>"; 

輸出:

$test before: a 
$test after: a and a 
$test after: b and a