Правильно ли использовать классы в других классах в php? - PullRequest
6 голосов
/ 07 января 2010

Надо было кого-то спросить об этом давным-давно.

Как лучше использовать другие классы в другом классе?

Например, допустим, у меня есть класс приложения:

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
}

и класс базы данных

class Database
{
    // connects to db on construct
    public function query() {
        // queries db
    }
}

Теперь я хочу добавить функцию в мой класс приложения, которая использует функцию из класса DB

class Application
{
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        global $db;
        $sql = foo;
        $db->query($sql);
    }
}

так что тогда у меня есть

$db = new Database();
$app = new Application();
$app->getVar('var');

Есть ли лучший способ сделать это? На самом деле то, что я ищу, - это стандартный способ сделать это, а не другой способ фальсификации.

Ответы [ 3 ]

12 голосов
/ 07 января 2010

Есть несколько способов сделать это. Глобальные переменные - это, конечно, один из способов, и на большинство тоже смотрят свысока. Вы можете создать Singleton , и все другие классы, которым требуется доступ к базе данных, будут вызывать этот синглтон.

final class Database {
    private static $connection;

    public static function getInstance() {
        if(self::$connection == NULL) {
            self::$connection = // init your database connection
        }
        return self::$connection;
    }
}

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

class Application {
    public function displayVar() {
        echo 'hello world';
    }
    public function getVar() {
        $db = Database::getInstance();
        $sql = foo;
        $db->query($sql);
    }
}

Это все хорошо для начала и отличный шаг по сравнению с использованием глобальных переменных, но вы можете добиться большего успеха с Dependency Injection . Внедрение зависимостей - это простая концепция, согласно которой, если у класса есть какие-либо внешние зависимости, такие как соединение с базой данных в вашем примере, вы явно передаете их нуждающемуся классу в его конструкторе или методе. Таким образом, новый код будет выглядеть как решение Джонатана. Основное преимущество использования внедрения зависимостей заключается в модульном тестировании, где вы можете легко заменить этот фактический объект базы данных фиктивным объектом и передать его тому, кто в нем нуждается.

class Application {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function displayVar() {
        echo 'hello world';
    }

    public function getVar() {
        $sql = foo;
        $this->db->query($sql);
    }
}

Для небольших проектов вы можете легко сделать это самостоятельно. Для больших проектов существуют различные DI-фреймворки для PHP

3 голосов
/ 07 января 2010

$db может быть собственностью вашего Application класса. Любая ссылка на него из экземпляра Application будет осуществляться через $this - $this->db

class Application {

  private $db = null;

  public function setDB($name) {
    $this->db = new Database($name);
  }

}
1 голос
/ 07 января 2010

Включите файл класса (или настройте автоинклюзию) в каждый PHP-файл, для которого требуется данный класс. Затем создайте его экземпляр по мере необходимости.

Если вам нужен «общий» экземпляр объекта, вы можете посмотреть шаблоны Singleton и Factory:

Шаблон синглтона Заводская модель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...