在另一个类中使用包含的类

时间:2011-04-28 22:27:26

标签: php oop adodb

我正在尝试使用数据库类(ADOdb for PHP),但我不知道如何在另一个类中使用它。 例如:

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

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

我认为问题在于我无法调用$ conn,因为它在类外定义。

注意:未定义的变量:conn

致命错误:在非对象上调用成员函数Connect()

也许我做错了,但我真的不知道如何解决这个问题。

有人可以帮帮我吗?非常感谢!

4 个答案:

答案 0 :(得分: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
    }
}
?>

或者您可以使用Singleton数据连接对象。但这被认为是一种反模式,所以我会像选项2那样注入你的依赖。

答案 1 :(得分: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我真的非常建议放弃ADODB并开始学习PDO

答案 2 :(得分: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 include和instantiation。

编辑:请参阅Dependency Injection上的这篇文章,因为养成使用它(而不是全局变量)的习惯可能会在未来节省很多麻烦。

答案 3 :(得分: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);