ООП PHP
Composer и автозагрузка
Отделение ядра приложения от пользовательских классов
Подключение сторонней библиотеки
Отделение ядра приложения от пользовательских классов
Подключение сторонней библиотеки
Попробуем подключить библиотеку, например, phpmailer - это библиотека, которая позволяет отправлять почту. Для этого создадим папку phpmailer и распакуем туда папки из библиотеки: папку language и папку src.
Содержание папки 13 ("Composer и автозагрузка"):
Для того, чтобы использовать библиотеку необходимо:
во первых - импортировать PHPmailer в пространство имен,
во вторых - подключить классы - с ними справится автозагрузчик.
Подключаем PHPmailer.php из папки src (по документации библиотеки PHPmailer) (для АВТОЗАГРУЗКИ):
- require_once 'phpmailer/src/PHPmailer.php';
Для того, чтобы использовать библиотеку необходимо создать объект класса PHPMailer:
- $mail = new PHPMailer\PHPMailer\PHPMailer();
- debug($mail); - распечатываем этот объект.
Файл index.php:
-- index.php --
<?php
use \{ , };
use \ \{ , };
// Подключаем PHPmailer.php из папки src (по документации библиотеки PHPmailer)
// ( для АВТОЗАГРУЗКИ )
require_once 'phpmailer/src/PHPmailer.php';
(-1);
// Опишем функцию автозагрузки ( для АВТОЗАГРУЗКИ )
function ($class)
{
echo $class . "<br>"; // для проверки
$class = ("\\", "/", $class);
$file =
// создаем объект $mail класса PHPMailer
$mail = new \ \ \ ();
($mail); // распечатываем этот объект
?>
Выведет:
PHPMailer\PHPMailer\PHPMailer Object
(
[Priority] =>
...
...
...
- объект класса PHPMailer - создался. Здесь встает вопрос - зачем нужен автозагрузчик, который не совсем справляется с такой работой (так как пришлось подключать вручную - require_once 'phpmailer/src/PHPmailer.php', или можно было создать еще один загрузчик для библиотеки PHPMailer). А если таких библиотек будет много?
В этом случае нам на помощь приходит пакетный менеджер Composer и придут на помощь стандарты PSR (PSR). Эти стандарты регламентируют (стандартизируют) написание кода. (PSR-4 – Улучшенная автозагрузка).
Composer
Для работы с композером (автозагрузка с помощью композера):
- удаляем объект $mail,
- удаляем подключение PHPmailer.php,
- удаляем папку phpmailer (мы ее будем использовать и загружать из композера),
- размещаем классы по разным папкам (ядро и приложения).
Для работы с композером создаем файл composer.json (папка 13):
Файл composer.json:
-- файл composer.json --
{
- первый ключ для примера (можно не создавать - он будет пустым)
"require": {},
- второй ключ - здесь мы указываем, согласно какому стандарту, мы
- хотим производить автозагрузку: "psr-4". Здесь мы должны указать,
- согласно данному стандарту, где находятся наши классы (папка "classes\\"
- второй слэш - экранирующий) и задать для них псевдоним;
- мы указываем, если ты встретишь в пространстве имен "classes\\",
- тогда заходи в папку "classes" и все классы ищи именно там.
"autoload": {
"psr-4":{
"classes\\": "classes"
}
}
}
Заходим в Open Server и открываем консоль.
Заходим в наш проект: cd domains\PHPoop1\13 и жмем "Enter" - переходим в нужную нам папку.
Выполняем команду: composer install -> "Enter" - данная команда, основываясь на файле composer.json, создаст нужный нам автозагрузчик по стандарту psr-4 и создаст папку vender, в которую поместит сам композер и там будут находиться все зависимости, которые мы укажем в ("require": {}) - у нас пока там пусто (зависимости - пакеты, библиотеки, которые мы хотим использовать для нашего проекта) и будет прописано соответствие: ("classes\\": "classes" - Если встретися пространство имен ("classes\\"), то нужно зайти в папку "classes"; еще будет создан файл composer.log, в котором будут перечисленны все пакеты, которые мы установили и т. д. (жмем Enter).
Если композер давно не использовался, то нужно выполнить команду: composer self-update - для обновления.
- в нашем проекте появилась папка vendor, в которой появился автозагрузчик autoload.php, который нам необходимо подключить в индексном файле, и папка композера.
Файл autoload.php:
-- autoload.php --
// autoload.php @generated by Composer
require_once . '/composer/autoload_real.php';
return ();
Подключаем файл autoload.php в индексном файле. От текущей папки __DIR__ нас интересует autoload.php:
- require_once __DIR__ . '/vendor/autoload.php';
При этом закомментируем наш автозагрузчик (function autoloder1($class)).
Файл index.php:
-- index.php --
<?php
use \{ , };
use \ \{ , };
// закомментируем подключение PHPmailer.php
// require_once 'phpmailer/src/PHPmailer.php';
(-1);
// подключаем автозагрузчик композера (файл autoload.php)
// от текущей папки __DIR__ нас интересует autoload.php
require_once . '/vendor/autoload.php';
// закомментируем автозагрузчик (function autoloder1($class))
//------------------------------------------------------------------------------
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
function ($product)
{
echo "<p>Предлагаем чехол для гаджета {$product -> ()} </p>" ;
}
$book = new ('Три мушкетера', 20, 1000);
$notebook = new ('Dell', 1000, 'Intel');
($notebook);
($book);
?>
- после перезагрузки страницы у нас все работает.
В папке composer есть автозагрузчик autoload_psr4.php, который использует стандарт автозагрузки PSR-4:
Файл autoload_psr4.php:
-- файл autoload_psr4.php --
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = ( ( ));
$baseDir = ($vendorDir);
return array(
'classes\\' => array($baseDir . '/classes'),
);
?>
Отделение ядра приложения от пользовательских классов
Отделим ядро нашего приложения от пользовательских классов:
- в папке vendor создадим ядро (папка core) и перенесем туда папку с интерфейсами и файл Product.php и будем считать что это наше ядро (для примера).
- переменуем папку classes в папку app - и будем считать, что это наше приложение;
- в файле composer.json переименуем:
- "classes\\": "classes" на - "core\\": "vendor/core",
- и дописываем еще одно правило:
- "app\\": "app";
- в интерфейсах меняем:
- namespace classes\interfaces на - namespace core\interfaces,
- и в файле Product.php меняем:
- namespace classes на - namespace core;
- в классах приложения (папка app) меняем:
- namespace classes на - namespace app,
- и в юзах (use) меняем:
- use classes\interfaces\I3D на - use core\interfaces\I3D,
- use classes\interfaces\IGadget на - use core\interfaces\IGadget,
- добавляем:
- use core\Product (импортируем данный класс);
- соответствующие замены делаем в файле index.php в юзах (use):
- use app\{BookProduct,NotebookProduct};
- use core\interfaces\{IGadget,I3D} ;
- Далее мы должны пересоздать автозагрузчик, для этого в консоли вызываем список команд командой "composer" и выбираем "dump-autoload" или "dumpautoload" (данные команды сгенерируют новый автозагрузчик, используя файл composer.json). Набираем в консоли команду "composer dump-autoload" и жмем "Enter"
Устанавливаем библиотеку PHPmailer (сторонняя библиотека):
- Заходим в Open Server и открываем консоль
- Заходим в наш проект: cd domains\PHPoop1\13 и жмем "Enter" - переходим в нужную нам папку.
- с сайта phpmailer копируем команду: composer require phpmailer/phpmailer и запускаем ее в консоли;
- в результате установки появляется новый log - файл , в папке vendor появилась библиотека phpmailer,
- в файле autoload_psr4.php - появилась новая запись:
- 'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src')
Установка композера вручную - в примере на ютуб (https://www.youtube.com/watch?time_continue=4&v=FFwtoK8NRps).
В индексном файле создадим объект $mail:
- $mail = new \PHPMailer\PHPMailer\PHPMailer();
и посмотрим, все ли у нас работает:
- debug($mail);
:
Файл composer.json:
-- файл composer.json --
{
"require": {
"phpmailer/phpmailer": "^6.0"
},
"autoload": {
"psr-4":{
"core\\": "vendor/core"
"app\\": "app"
}
}
}
Интерфейс IGadget.php:
-- интерфейс IGadget --
<?php
namespace \ ;
interface
{
// публичный метод getCase() без реализации
public function ();
}
?>
Интерфейс I3D.php:
-- интерфейс I3D.php --
<?php
namespace \ ;
interface
{
// константа интерфейса
const TEST2 = 'test interface';
// метод интерфейса (данный метод не имеет реализацию)
public function ();
}
?>
Файл Product.php:
-- файл Product.php --
<?php
namespace ;
abstract class
{
//...
//...
//...
}
?>
файл BookProduct.php:
-- файл BookProduct.php --
<?php
namespace ;
use \ \ ; // импортируем I3D
use \ ; // импортируем данный класс
class extends implements
{
//...
//...
//...
}
?>
файл NotebookProduct.php:
-- файл NotebookProduct.php --
<?php
namespace ;
use \ \ ; // импортируем IGadget
use \ ; // импортируем данный класс
class extends implements
{
//...
//...
//...
}
?>
Файл index.php:
-- index.php --
<?php
use \{ , };
use \ \{ , };
(-1);
// подключаем автозагрузчик композера (файл autoload.php)
// от текущей папки __DIR__ нас интересует autoload.php
require_once . '/vendor/autoload.php';
//------------------------------------------------------------------------------
function ($data)
{
echo '<pre>' . ($data, 1 ) . '</pre>';
}
function ($product)
{
echo "<p>Предлагаем чехол для гаджета {$product -> ()} </p>";
}
$book = new ('Три мушкетера', 20, 1000);
$notebook = new ('Dell', 1000, 'Intel');
($notebook);
($book);
// создаем объект $mail класса PHPMailer
$mail = new \ \ \ ();
($mail); // распечатываем этот объект
?>
Получим:
Предлагаем чехол для гаджета Dell
app\BookProduct Object
(
[numPages] => 1000
[name:core\Product:private] => Три мушкетера
[price:protected] => 20
[discount:core\Product:private] => 5
)
PHPMailer\PHPMailer\PHPMailer Object
(
[Priority] =>
...
...
...
В файле autoload_psr4.php - появилась новая запись:
-- файл autoload_psr4.php --
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = ( ( ));
$baseDir = ($vendorDir);
return array(
'core\\' => array($baseDir . '/core'),
'app\\' => array($baseDir . '/app'),
// появилась новая запись
'PHPMailer\\PHPMailer\\' => array($vendorDir . '/phpmailer/phpmailer/src'),
);
?>
Итоговое содержание папки 13 ("Composer и автозагрузка"):
С использованием автозагрузчика композера мы не подключали вообще ничего. Достаточно было установить пакет библиотеки и можно уже использовать данную библиотеку. Никаких require, никаких собственных автозагрузчиков не нужно - всем этим занимается композер.
Установка композера вручную - в примере на ютуб (youtube.com).
Наверх Наверх