在非对象上调用成员函数query()

时间:2010-05-05 22:54:28

标签: php class global-variables

好的,这太奇怪了!我正在运行PHP版本5.1.6,当我尝试运行下面的代码时,它给出了一个尚未实例化的对象的致命错误。一旦我取消评论这行代码 // $ cb_db = new cb_db(USER,PASSWORD,NAME,HOST); 一切正常。即使我已经在方法中将$ cb_db对象声明为全局对象。任何帮助将不胜感激。

require_once(ROOT_CB_CLASSES。'db.php');

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);

class cb_user {
    protected function find_by_sql( $sql ) {
        global $cb_db;

        //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

1 个答案:

答案 0 :(得分:2)

如果你打算使用全局变量(而不是通过构造函数传递连接),你应该确保它是全局编辑的,你计划使用它。

Global $cb_db;
$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);

class cb_user {
    protected function find_by_sql( $sql ) {
        global $cb_db;

        //$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

但是,我认为更好的方法是通过构造函数传递数据库连接。

$cb_db = new cb_db(USER, PASSWORD, NAME, HOST);
$cb_user = new cb_user($cb_db);

class cb_user {
    public __construct(cb_db $database)
    {
        $this->database = $database
    }

    protected function find_by_sql( $sql ) {

        $this->database = new cb_db(USER, PASSWORD, NAME, HOST);
        $result_set = $cb_db->query( $sql );

        $object_array = array();
        while( $row = $cb_db->fetch_array( $result_set ) ) {
            $object_array[] = self::instantiate( $row );
        }
        return $object_array;
    }
}

如果您发现这是使用该连接的唯一函数,您也可以将其传递给单个函数(find_by_sql($sql, $cb_db))。