2012-06-23 2 views
0

На этих страницах я использовал один класс соединения и один класс для хранения логики для страницы. Однако теперь у меня есть страница, где мне нужно использовать несколько классов на основе различных сценариев, которые могут произойти.Как использовать несколько классов без нескольких соединений?

Это то, что я смог сделать, но это похоже на плохую практику. Я искал вокруг, но не могу найти решение. Поэтому мой вопрос в том, что является лучшим способом того, что я пытаюсь сделать.

<?php 
require 'class/connect.php'; 
$db = new Connect(); 
require 'class/normal-page.php'; 
require 'class/get-page.php'; 
?> 

    <?php if (!isset($_GET['id'])) { ?> 
     <?php $normalpage = new NormalPage($db); ?> 
    <?php 
     } else { 
     $id = $_GET["id"]; 
     $getpage = new Getpage($id, $db); 
    ?> 

     <h1><?php echo $getpage->getTitle(); ?></h1> 
     <p><?php echo $getpage->getDescription(); ?></p> 
    <?php } ?> 


class Normalpage { 

    function __construct($db) { 

     $query = 'SELECT something FROM table'; 
     $result = $db->query($query); 
} 
} 

Надеюсь, что информации достаточно, чтобы иметь смысл. Короче говоря, я включаю класс connect и использую переменную в обоих классах.

+1

В дополнение к ответу @ nickb, я бы порекомендовал вам изучить автозагрузку классов. Таким образом, вам не нужно указывать, какие файлы классов вы должны включать, поскольку они загружаются автоматически, см. Http://php.net/manual/en/language.oop5.autoload.php – jeroen

+0

Я думаю, вы можете сделать свой жизнь немного проще с [автозагрузкой] (http://php.net/manual/de/language.oop5.autoload.php). ** Редактирование: ** Как и jeroen написал, в то же время, та же идея;) – hakre

ответ

3

Это правильный способ работы с объектом базы данных. Фактически, он называется шаблоном проектирования dependency injection, и на самом деле он довольно распространен. Возможно, вам стоит рассмотреть вопрос о сохранении параметра конструктора $db переменной-члену, поэтому другие методы класса могут обращаться к базе данных через что-то вроде $this->db, если объявить переменную-член как private $db;.

Однако, возможно, вы захотите рассмотреть шаблон дизайна factory, так как он поможет организовать классы для ваших страниц. См. Этот пример из приведенной выше ссылки:

class Factory 
{ 
    public static function build($type) 
    { 
     $class = 'Format' . $type; 
     if (!class_exists($class)) { 
      throw new Exception('Missing format class.'); 
     } 
     return new $class; 
    } 
} 

class FormatString {} 
class FormatNumber {} 

try { 
    $string = Factory::build('String'); 
} 
catch (Exception $e) { 
    echo $e->getMessage(); 
} 

try { 
    $number = Factory::build('Number'); 
} 
catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+1

Кроме того, вы можете взглянуть на создание Connect a [singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) или просто заменить '$ db' со статической переменной класса в' Connect'. Это означало бы, что вы всегда можете получить доступ к своей переменной $ db как 'Connect :: db' или' Connect :: db() '. – Stecman

+0

У вас возникнут проблемы с одиночными играми при одновременном использовании нескольких соединений с БД. – brezanac

+1

Также см. [Кому нужны синглтоны?] (Http://stackoverflow.com/a/4596323/862594) – nickb

Смежные вопросы