OOP重复扩展

时间:2010-06-29 19:34:34

标签: php oop

我有两个类,它们都是从SQL类扩展的

像这样:

class SQL {  
    private $db_connect_id;  
    function connect($ad, $db, $us, $pa){  
        $this->db_connect_id = mssql_connect($ad, $us, $pa);  
        mssql_select_db ($db, $this->db_connect_id) or die('sql error');  
    }  
    function sql_query($query = ""){  
        unset($this->query_result);  
        if($query != ""){  
            $this->num_queries++;  
            $this->query_result = @mssql_query($query, $this->db_connect_id) or die('error query');  
        }  
        if($this->query_result){  
            unset($this->row[$this->query_result]);  
            unset($this->rowset[$this->query_result]);  
            return $this->query_result;  
        }  
    }   
}

class WEB extends SQL {  
    function __construct(){ $this->connect(params) }  
    function __destruct(){ $this->disconnect() }  
}

class AUTH extends SQL {  
    function __construct(){ $this->connect(params) }  
    function __destruct(){ $this->disconnect() }  
}

问题是,如果我同时打电话给他们两个

$WEB = new WEB();  
$AUTH = new AUTH();

$WEB将不再有效。它失去了与数据库的连接,它使用来自AUTH ...的db_connect_id更改db_connect_id 我认为这是一个愚蠢的问题,我太累了,但我必须完成。 我做错了什么? 谢谢

3 个答案:

答案 0 :(得分:3)

http://php.net/manual/en/function.mssql-connect.php

第四个参数new_link必须作为true传递(因为默认为false)。

答案 1 :(得分:1)

从你发布的有限代码中无法分辨,但我认为很明显你会发生一些类似单身的行为,即SQL及其子类的所有实例都在共享引用。 / p>

如果您使用实际代码替换bla bla,我们可以为您缩小范围。

答案 2 :(得分:1)

您的问题中提供的代码没有任何问题。

您所描述的问题是使用SQL类的静态属性,可能是为了保存数据库连接资源。

静态属性在类的所有实例之间共享,这是您似乎要描述的行为。

此类设计将按照您的方式运作:

class SQL {
    private $database;

    function connect() {
        $this->datavbase = ....;
    };
}

class WEB extends SQL {
    function __construct(){ $this->connect(params) }
    function __destruct(){ $this->disconnect() }
}

class AUTH extends SQL{
    function __construct(){ $this->connect(params) }
    function __destruct(){ $this->disconnect() }
}

此类设计将以您想要的方式工作:

class SQL {
    private static $database;

    function connect() {
        $this->datavbase = ....;
    };
}

class WEB extends SQL {
    function __construct(){ $this->connect(params) }
    function __destruct(){ $this->disconnect() }
}

class AUTH extends SQL{
    function __construct(){ $this->connect(params) }
    function __destruct(){ $this->disconnect() }
}