0

我试图在对象的属性中保持打开的 pgsql 数据库连接。

数据库连接作为构造函数的参数传递给对象并保存在属性中。稍后调用需要数据库连接的类的函数,并从属性中读取。但是,它以某种方式不被读取为有效的数据库连接。

我检查了对象外部的数据库连接,在调用类中的函数后,它仍然在那里打开。

为什么资源似乎在对象中关闭,有什么办法可以让它保持打开状态?

代码示例:

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 致命错误:无法通过引用分配给重载对象”错误。如果我的类没有扩展另一个类,那么通过引用设置属性的方法效果很好。

有没有办法让它在重载的类中工作?

4

1 回答 1

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
于 2013-10-15T10:27:35.753 回答