繁体   English   中英

在其他 class 中使用附带的 class

[英]Use of included class in another class

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

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

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

我认为问题在于我不能调用 $conn,因为它在 class 之外定义。

注意:未定义变量:conn

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

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

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

您有多种选择:

使用全局保留字:

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

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

或者在创建时将 $conn 传递给您的 object

$contacts = new Contacts($conn);

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

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

为什么不简单地这样做呢?!

<?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);

?>

在 class 外部建立连接是有意义的,然后传入已经可用的 object。 当然,在所有需要它的类之间共享相同的连接 object。

PS 我真的真的建议放弃 ADODB 并开始学习 PDO

您需要引用全局变量:

<?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 包含和实例化。

编辑:请参阅这篇关于依赖注入的文章,因为养成使用它(而不是全局变量)的习惯可能会在以后省去很多麻烦。

$conn不在您的变量 scope 中。 使用以下方法使其工作:

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

另一种方法是引用 object 中的变量:

class Contacts {
    private $ref;
    public function __construct($conn)
    {
        $this->ref = $conn;
    }
    public function getData(){
        $ref->Connect(...);
        //do something
    }
}

$contacts = new Contacts($conn);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM