Использование включенного класса в другом классе - PullRequest
3 голосов
/ 29 апреля 2011

Я пытаюсь использовать класс базы данных (ADOdb для PHP), но я не знаю, как использовать его в другом классе. Пример:

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

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

Мне кажется, проблема в том, что я не могу вызвать $ conn, потому что он определен вне класса.

Примечание: неопределенная переменная: conn

Неустранимая ошибка: вызов функции-члена Connect () для необъекта

Может быть, я делаю это неправильно, но я действительно не знаю, как это исправить.

Может кто-нибудь помочь мне? Большое спасибо!

Ответы [ 4 ]

4 голосов
/ 29 апреля 2011

Почему бы просто так не поступить?!

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

?>

Имеет смысл установить соединение вне класса, а затем передать уже работающий объект.И, конечно же, для совместного использования одного и того же объекта соединения между всеми классами, которым он требуется.

PS Я бы действительно очень рекомендовал бы сбросить ADODB и начать изучать PDO .

4 голосов
/ 29 апреля 2011

У вас есть несколько вариантов:

Используйте глобальное резервное слово:

<?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.

2 голосов
/ 29 апреля 2011

вам нужно сослаться на глобальную переменную:

<?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и создание экземпляров в разделе инициализации.

Редактировать: см. Эту статью на Внедрение зависимостей , поскольку использование этого (а не глобальных) привычки может спасти от многих головных болей в будущем.

1 голос
/ 29 апреля 2011

$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);
...