Є багато способів структурувати код і проект для вашої веб-програми, і ви можете приділяти багато або мало уваги розробці архітектури. Але зазвичай доцільно дотримуватися загальних шаблонів, тому що це буде зробіть свій код легшим для керування та зрозумілим для інших.
Одним із найбільш часто використовуваних шаблонів проектування є заводський шаблон. У цьому шаблоні клас просто створює об’єкт, який ви хочете використовувати. Розглянемо наступний приклад фабричного зразка:
<?php
клас Автомоб
{
приватний $vehicleMake;
приватна $vehicleModel;
публічна функція __construct($make, $model)
{
$this->vehicleMake = $make;
$this->vehicleModel = $model;
}
публічна функція getMakeAndModel()
{
повернути $this->vehicleMake. ' '. $this->vehicleModel;
}
}
клас AutomobileFactory
{
публічна статична функція create($make, $model)
{
повернути новий автомобіль ($make, $model);
}
}
// створити об'єкт Automobile на заводі
$veyron = AutomobileFactory::create('Bugatti', 'Veyron');
print_r($veyron->getMakeAndModel()); // виводить "Bugatti Veyron"Цей код використовує фабрику для створення об’єкта Automobile. Існує дві можливі переваги створення вашого коду спосіб; перший полягає в тому, що якщо пізніше вам знадобиться змінити, перейменувати або замінити клас автомобіля, ви можете це зробити, і ви потрібно лише змінити код на заводі, а не кожне місце у вашому проекті, де використовується клас Automobile. Друга можлива перевага полягає в тому, що якщо створення об’єкта є складною роботою, ви можете виконати всю роботу в factory замість повторення кожного разу, коли ви хочете створити новий екземпляр.
Використання фабричного зразка не завжди є необхідним (або розумним). Приклад коду, використаний тут, настільки простий, що фабрика це просто додало б непотрібної складності. Однак якщо ви робите досить великий або складний проект, ви можете заощадити себе багато проблем на дорозі, використовуючи фабрики.
При розробці веб-додатків часто концептуально та архітектурно має сенс дозволити доступ лише одному один екземпляр певного класу. Шаблон Singleton дозволяє нам це зробити.
ЗАВДАННЯ: ПОТРІБЕН НОВИЙ ПРИКЛАД ОДНОГО КОДУ
Наведений вище код реалізує шаблон одного елемента за допомогою статичної змінної і статичного методу створення getInstance().
Зверніть увагу на наступне:* Конструктор __construct() оголошено як захищений для
запобігти створенню нового екземпляра за межами класу за допомогою оператора new.
__clone() оголошено приватним, щоб запобігти
клонування екземпляра класу за допомогою оператора clone.__wakeup() оголошено як приватний, щоб запобігти
десеріалізація екземпляра класу через глобальну функцію unserialize()
.getInstance() з ключовим словом static. Це дозволяє створювати підкласи класу Singleton у
приклад.Шаблон Singleton корисний, коли нам потрібно переконатися, що у нас є лише один екземпляр класу для всього життєвий цикл запиту у веб-додатку. Зазвичай це відбувається, коли у нас є глобальні об’єкти (такі як Configuration клас) або спільний ресурс (наприклад, чергу подій).
Ви повинні бути обережними, використовуючи шаблон одного елемента, оскільки за своєю природою він вводить у ваш глобальний стан застосування, що знижує тестоздатність. У більшості випадків ін’єкцію залежностей можна (і потрібно) використовувати замість синглтона клас. Використання ін’єкції залежностей означає, що ми не вводимо непотрібного зв’язку в дизайн нашого додаток, оскільки об’єкт, що використовує спільний або глобальний ресурс, не потребує знання конкретно визначеного класу.
За допомогою шаблону стратегії ви інкапсулюєте конкретні сімейства алгоритмів, що дозволяє класу клієнта відповідати за створити екземпляр певного алгоритму, щоб не знати про фактичну реалізацію. Є кілька варіацій шаблон стратегії, найпростіший з яких наведено нижче:
Цей перший фрагмент коду описує сімейство алгоритмів; вам може знадобитися серіалізований масив, трохи JSON або, можливо, просто масив даних:
<?php
інтерфейс OutputInterface
{
публічна функція load();
}
клас SerializedArrayOutput реалізує OutputInterface
{
публічна функція load()
{
return serialize($arrayOfData);
}
}
клас JsonStringOutput реалізує OutputInterface
{
публічна функція load()
{
повернути json_encode($arrayOfData);
}
}
клас ArrayOutput реалізує OutputInterface
{
публічна функція load()
{
повернути $arrayOfData;
}
}Інкапсулюючи наведені вище алгоритми, ви робите його гарним і зрозумілим у своєму коді, щоб інші розробники могли легко додати нові типи виводу, не впливаючи на код клієнта.
Ви побачите, як кожен конкретний клас «виводу» реалізує OutputInterface - це служить двом цілям, перш за все це надає простий договір, якому повинні підкорятися будь-які нові конкретні реалізації. По-друге, запровадивши заг інтерфейс, який ви побачите в наступному розділі, що тепер ви можете використовувати Підказ типу, щоб переконатися, що клієнт, який використовує ці поведінки, має правильний тип, у цьому випадку “OutputInterface”.
Наступний фрагмент коду описує, як клас клієнта, що викликає, може використовувати один із цих алгоритмів і навіть краще встановити поведінка, необхідна під час виконання:
<?php
клас SomeClient
{
приватний $вихід;
публічна функція setOutput(OutputInterface $outputType)
{
$this->output = $outputType;
}
публічна функція loadOutput()
{
повернути $this->output->load();
}
}Викликаючий вище клас клієнта має приватну властивість, яка має бути встановлена під час виконання та мати тип “OutputInterface”. Після встановлення цієї властивості виклик loadOutput() викликає метод load() у конкретному класі типу виводу що було встановлено.
<?php
$client = новий SomeClient();
// Хочете масив?
$client->setOutput(новий ArrayOutput());
$data = $client->loadOutput();
// Хочете JSON?
$клієнт->setOutput(новий JsonStringOutput());
$data = $client->loadOutput();Шаблон переднього контролера – це місце, де у вас є єдина точка входу для вашої веб-програми (наприклад, index.php), яка обробляє всі запити. Цей код відповідає за завантаження всіх залежностей, обробку запиту та відправка відповіді браузеру. Шаблон переднього контролера може бути корисним, оскільки він сприяє модульному коду і дає вам центральне місце для підключення коду, який слід запускати для кожного запиту (наприклад, очищення введення).
Шаблон модель-подання-контролер (MVC) і його родичі HMVC і MVVM дозволяють розбити код на логічні об’єкти які служать дуже конкретним цілям. Моделі служать рівнем доступу до даних, де дані витягуються та повертаються у форматах придатний для використання у вашій програмі. Контролери обробляють запити, обробляють дані, отримані від моделей, і завантажують переглядів, щоб надіслати у відповідь. А представлення — це шаблони відображення (розмітка, xml тощо), які надсилаються у відповідь на веб-браузер.
MVC є найпоширенішим архітектурним шаблоном, який використовується в популярних фреймворках PHP.
Дізнайтеся більше про MVC та його родичі: