2014-01-22 3 views
0

Перемещение с C#/C++ на PHP ООП оказалось немного проблематичным, так как я не уверен, что стандартно разрабатывать макет кода таким же образом. Как это имеет место, мне любопытно, если следующее будет считаться проблематичным или неправильным, когда дело доходит до PHP.Классы менеджеров для объектов

  • CDeviceManager класс (1 инициирована)
  • CDevice класса
  • Держите частный массив CDevice в классе CDeviceManager
  • Используйте открытые методы для извлечения устройств, поиск устройств и т.д.

Однако наиболее проблемный вопрос заключается в заполнении каждого CDevice из базы данных MySQL. Было бы безопасным включить мой класс базы данных непосредственно в CDeviceManager и заполнить массив CDevice в CDeviceManager Construct?

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

+2

ООП не зависит от языка. Однако реализация на определенном языке может быть специфической, но вы знаете, что такое ООП и каковы его принципы, тогда я не вижу, где может быть проблема. Просто реализуйте свою структуру и логику. Или я чего-то не хватает? –

+1

Когда вы говорите «Класс базы данных», вы имеете в виду «PDO»? – PeeHaa

+0

Это класс MYSQLi, который я только что схватил, чтобы использовать https://github.com/ajillion/PHP-MySQL-Database-Class –

ответ

1

Лучше всего отделить свою бизнес-логику от системы хранения данных. Я рекомендую использовать инъекцию зависимостей для выполнения вашей работы. Конкретная реализация будет зависеть от ваших потребностей (и размера проекта), но, чтобы получить представление здесь будет то, что я хотел бы сделать:

class CDeviceManager 
{ 
    private $db; //holder for your database 
    private $cdevices = array(); 
    //more properties here 

    public function __construct(Database $db) 
    { 
     $this->db = $db; //database connection has now been injected into your class 
    } 

    //more methods here 
} 

Тогда где-то вдоль линии, когда вы создаете свой CDeviceManager объект можно впрыскивать базу данных подключение.

$cdm = new CDeviceManager(new Database(...)); 

Ваш Database класс, вероятно, будет оберткой для API PDO или MySQLi или любой другой базы данных вы хотели бы использовать. Вы также можете пойти дальше и иметь CDeviceManager реализовать какой-то интерфейс, который связан с различными функциями CRUD в вашей базе данных. Лучшая часть, однако, вы можете проверить это намного проще, потому что теперь вы можете поменять свое соединение с базой данных с макетной/тестовой базой данных, чтобы вы случайно не испортили свою производственную базу данных.

$cdm = new CDeviceManager(new MockDatabase(...)); 

или

$testdb = new TestDatabase(...); 
$cdm = new CDeviceManager($testdb); 

Так что да, в конце концов, это хорошо, чтобы отделить соединение с базой данных из ваших моделей домена. Некоторые рекомендуют пойти еще дальше и убедиться, что ваши модели домена полностью не знают механизм хранения в целом, таким образом, вы можете быть гибкими на вашем уровне системы хранения/сохранения. Например:

$cdm = new CDeviceManager(new FileRetriever()); //Maybe you are storing stuff in a flat file 

Надеюсь, что это поможет немного разобраться.

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