2016-11-30 3 views
1

Я видел на языке Java, что большинство библиотек построены с использованием шаблонов проектирования (одноэлементный, фасад, фабрика и т. Д.).Каковы шаблоны проектирования, используемые в PHP (либо в функции, либо в библиотеке или где угодно)

Есть ли рекомендованный ресурс для библиотек PHP 7 и codeigniter 3 для шаблонов проектирования? Я хотел бы лучше понять шаблоны дизайна, которые я должен использовать.

Пожалуйста, исключите singleton, поскольку он используется CI для создания объекта базы данных.

+0

Зачем голосовать за это? Хорошо знать, что использование шаблонов шаблонов в PHP. –

+0

Посмотрите на http://www.phptherightway.com/pages/Design-Patterns.html, но @NathanKing прав – indofraiser

+0

Я присоединяюсь к @ nathan-king и indorraiser, что это скорее общий вопрос программирования. Вы также можете проверить https://laracasts.com/series/design-patterns-in-php. Обратите также внимание на то, что CodeIgniter не соответствует современным тенденциям, происходящим в мире PHP за последние 6-7 лет, поскольку Я вижу, вы увидите меньше шаблонов проектирования в мире CI по сравнению, например. Symfony, Laravel, Zend или Phalcon. Это также указано на странице приветствия их документов: «_a framework, который не требует от вас соблюдения ограничительных правил кодирования.» –

ответ

4

Это немного общий вопрос программирования, а не специфический для PHP - любой шаблон проектирования ООП и применяется к любому языку ООП в той или иной форме. Наиболее часто используются Singleton, Factory, Facade и Repository. Вы можете реализовать любой шаблон, который вам нравится, так же, как вы можете, на других языках, таких как Java. Я дам вам пару примеров реализации - не используйте его как производственный код, они упрощенные примеры.

Шаблон Factory полезен, когда вам нужно решить классы.

Использование: у вас есть API, который позволяет администратору отклонять или одобрять новый запрос на создание пользователя - администратор просто передает конечной точке API строку 'approve' или 'reject'. Но мы никогда не работаем со струнами. Когда-либо. Вместо этого мы хотим представить действия в классах, реализующих общий интерфейс Action. Мы можем реализовать Factory для решения класса из предоставленной строки следующим образом:

interface Action 
{ 
    public function getUsername(): string; 
} 

class Approve implements Action 
{ 
    private $username; 

    public function __construct(string $username) 
    { 
     $this->username = $username; 
    } 

    public function getUsername(): string 
    { 
     return $this->username; 
    } 
} 

class Reject implements Action 
{ 
    private $username; 

    public function __construct(string $username) 
    { 
     $this->username = $username; 
    } 

    public function getUsername(): string 
    { 
     return $this->username; 
    } 
} 

class ActionFactory 
{ 
    public static function create(string $action, string $username): Action 
    { 
     switch (strtoupper($action)) { 
      case 'APPROVE': 
       return new Approve($username); 
       break; 

      case 'REJECT': 
       return new Reject($username); 
       break; 

      default: 
       throw new \InvalidArgumentException("Expected string `APPROVE` or `REJECT` - `$action` provided"); 
     } 
    } 
} 

(Бонусные баллы за заметив, что мы реализации двух шаблонов проектирования здесь: одноплодной & завод)


фасадная модель также используется много (фасады Laravel - это НЕ фасады, не путайте их с реальными фасадами). Наиболее частое использование шаблона фасада - это подключение базы данных к репозиторию. Опять же, здесь будут два шаблона: шаблон фасада и шаблон хранилища. Я оставлю тела методов для этого, но это должно дать вам представление об использовании. Я не рекомендую на самом деле использовать методы ниже - это невероятно упрощено для примера.

class Connection 
{ 
    public function __construct(string $connectionString); 

    public function update(string $table, string $query); 

    public function insert(string $table, array $data); 
} 

class UserRepository 
{ 
    public function __construct(Connection $connection); 

    public function createUser(User $user) 
    { 
     $this->connection->insert('users', $user->toArray()); 
    } 
} 

Вы могли бы иметь столько репозиториев, как вы хотите, и все они будут принимать Connection фасад в качестве зависимости в их конструктор, который обеспечивает взаимодействие с базой данных.

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