Развитие языков программирования растёт с большой скоростью
Скачать 2.79 Mb.
|
$type: $message"; echo "File: $file:$line "; echo " Context: $". join(', $', array_keys($context))." "; return true; } // регистрируем наш обработчик ошибок в систему с помощью функции set_error_handle set_error_handler('myHandler', E_ALL); ?> То есть, как вы смогли понять, то данная функция нужна для того чтобы создать свой обработчик ошибок. Есть небольшая проблема с данной функцией. Заключается она в том, что функция не отображает фатальной ошибки. И поэтому чтобы мы могли отобразить свой текст при фатальной ошибке надо воспользоваться функцией register_shutdown_function(): { echo "Данный текст всегда будет выводиться при ошибках"; } register_shutdown_function("shutdown_messa ge"); // Добавляем название функции которая будет выводит данные ?> Хорошо, но что же будет дальше? Дальше я хочу вам продемонстрировать функцию error_get_last(), которая позволяет PHP: Junior Kit 241 вывести последнюю полученную ошибку. Пример использования функции: { $err = error_get_last(); echo "Предыдущая ошибка: " . $err; } register_shutdown_function("shutdown_message"); ?> Но разве это все функции которые позволяют обрабатывать ошибки? Конечно же нет, вы можете зайти на официальную документацию и просмотреть какие ещё есть функции для обработки ошибок. Все это можно найти по адресу http://php.net/manual/ru/book.errorfunc.php Вы научились как можно сделать свой обработчик ошибок. Это может облегчить работу с кодом, когда вы будете разрабатывать свое большое приложение. 15. 3 Откладка кода В этом подразделе мы уже с вами поговорим то как можно откладывать код и просматривать отладочную информацию. Откладка кода позволяет более детально описать работу программы в логах, или в выводах консоли. Существует много способов представления откладки кода. Откладка кода не только позволяет с легкостью определять ошибки, но также и искать баги в коде. Так что давайте приступим! Что же может нам дать данные об переменной? Мы с вами знаем целых две функции, которые могут вывести такую информацию, это var_dump и print_r. Например, если у нас с вами будет какой-то PHP: Junior Kit 242 массив то можно сделать вывод информации об этом массиве, тем самым узнав больше об его элементах: $some_data = array( "Band" => "Kraftwerk", "Since" => "1970", "Genre" => "Electronic music", "Members" => array( "Ralf Hutter", "Henning Schmitz", "Fritz Hilbert", "Falk Grieffenhagen" ) ); print_r($some_data); ?> Вот результат выполнения программы: Array ( [Band] => Kraftwerk [Since] => 1970 [Genre] => Electronic music [Members] => Array ( [0] => Ralf Hutter [1] => Henning Schmitz [2] => Fritz Hilbert [3] => Falk Grieffenhagen ) ) PHP: Junior Kit 243 Как вы можете увидеть, то мы не только получаем данные об элементах массива, но также и структуру массива. Но думаю некоторые смогли здесь заметить небольшую проблему. И проблемой является то что не выводятся типы данных строк, и мы не можем понять точно что здесь является строкой, а что имеет числовой тип данных. И для решения этой проблемы, самым простым способом будет использовать функцию var_dump(), поскольку она выводит все данные об элементах, их типы данных и длину символов. Вот как будет выглядеть результат вывода с использованием функции var_dump() в предыдущем примере: array(4) { ["Band"]=> string(9) "Kraftwerk" ["Since"]=> string(4) "1970" ["Genre"]=> string(16) "Electronic music" ["Members"]=> array(4) { [0]=> string(11) "Ralf Hutter" [1]=> string(15) "Henning Schmitz" [2]=> string(13) "Fritz Hilbert" [3]=> string(18) "Falk Grieffenhagen" } } Сразу же видно, какая разницу между этими двумя выводами результатов. Точнее разницы между выводом данных функций print_r() и функцией var_dump(). Что ж проблема решена, что же будет идти дальше? С версии PHP 5.6 теперь вместе с самым языком программирования поставляется также отладчик кода phpdbg. Он сразу жу установлен в РНР как расширение. Конечно же можно использовать также другой отладчик, который создан также самими разработчиками Zend. Но для того чтобы работать с отладчиком очень рекомендовано использовать IDE - PHP Storm. Поскольку он хорошо позволяет отслеживать работу программы. PHP: Junior Kit 244 Но хочу сказать важную информацию, о том что phpdbg уже не используют, и вообще данное расширение умерло, т.е. его уже не используют. Зато появилось намного эффективное расширение - xDebug. И сейчас мы об нем поговорим. Для начала нам надо будет установить xDebug, и сделать это можно только через расширение Pecl. Для этого введите в командную строку такую команду: pecl install xdebug После этого у вас должны установиться файлы данного расширения. Следующим шагом будет подключение расширения. В разделе об криптографии мы уже с вами рассматривали то как можно подключить расширение к РНР через файл php.ini. Если кто то не помнит, как это делать, то вы просто указываете путь к расширению с помощью функции include_path. Конечно же есть и другой способ установки данного расширения. Для этого надо перейти на страницу установки xDebug по адресу https://xdebug.org/download.php, после чего просто скачать .dll файл и подключить его через функцию extension() в файлу конфигурации РНР - php.ini. Дальше после всего этого давайте сделаем тестирование нашего расширения, для этого создадим новый скрипт с таким кодом: $arr = array( "Name" => "Nice Book", "Author" => "Super Author", "Year" => "2018" ); var_dump($arr); ?> Думаю читатель сразу же задастся вопросом “Что? Мы же делали уже подобную вещь не раз, зачем это?”. А вот что я скажу, просто PHP: Junior Kit 245 запустите этот код и посмотрите на результат. И что? Вы видите здесь разницу с выводом данных? Вот первое что сделало данное расширение. У нас теперь улучшенный вывод данных с помощью функции var_dump(). Теперь вы можете увидеть информацию об области видимости и также много чего другого. Но кроме того что теперь у вас улучшенный вывод данных, с помощью функций для отладки кода - то теперь вывод ошибок также улучшен. И конечно вы можете получить намного больше информации об работе скрипта. Например, вот какой будет вывод ошибки, если мы пытаемся вывести на экран переменную которая не была объявлена: Изображение было взято с веб-cайта habr. Кроме того что ошибки выводятся с более детальной информацией. Можно также получить информации об том, сколько РНР использует оперативную память. Данное расширение это намного лучше использования разных функций для того чтобы выводить информацию об коде. На этом моменте я хочу завершить данный раздел и переходить к следующему. Но перед этим мы должны сделать небольшое заключение об том что мы выучили в данном разделе. Заключение Написать программу безошибочно невозможно. Каждый имеет право на ошибку. И во время разработки своего веб-приложения вы возможно частенько будете делать ошибки, и это нормально. На ошибках которые вы получаете во время написания программы - вы учитесь. Конечно же намного лучше учиться на чужих ошибках. PHP: Junior Kit 246 Уметь управлять ошибками в коде хорошо, и это можно использовать для того чтобы было легко выводить данные об коде. И с помощью таких расширений как xDebug, с легкостью можно найти ошибки в коде. Как и в конце каждого раздела, я попрошу читателя чтобы он ответил на вопросы и выполнил упражнения которые находятся в конце данного раздела. Вопросы и упражнения для самоконтроля 1. Какие могут быть причины возникновения ошибок в коде? 2. Какие есть виды ошибок? 3. Зачем нужен вывод ошибок в РНР? 4. Какие есть функции для управлением ошибок? 5. Как можно создать свой обработчик ошибок? Создайте свой обработчик ошибок который выводил бы отдельный текст к каждой ошибке. 6. Напишите программу которая выводила бы определенный текст при любой ошибке. PHP: Junior Kit 247 16 Пакетный менеджер В этом разделе мы с вами поговорим об том как можно управлять пакетами. А если более ясно, то как можно с легкостью и с небольшой тратой времени устанавливать разные библиотеки и фреймворки. Это позволяет разработчику сэкономить время также на выполнение таких рутинных задач как настройка веб-приложения созданного на фреймворке с помощью пакетного менеджера. Мы с вами будем использовать самый часто использующий пакетный менеджер для РНР - Composer. Первый подраздел будет об том как установить данный пакетный менеджер, дальше мы с вами на простых примерах будем устанавливать библиотеки для того чтобы показать простоту использования пакетного менеджера. 16.1 Установка Для установки нашего пакетного менеджера давайте перейдем на официальный веб-сайт composer’a, по такому адресу: https://getcomposer.org/ . После того как вы перейдете вы сможете увидеть красивый логотип данного приложения. Перейдите на страницу установки: https://getcomposer.org/download/, на странице вы можете увидеть способы установки которые зависят от вашей операционной системы. Я использую Windows, поэтому сейчас PHP: Junior Kit 248 речь пойдет об том как устанавливать пакетный менджер под эту операционную систему. Если у вас какая-то другая операционная система, то просто установите по инструкции которая предназначена для вашей операционной системы. Для того чтобы установить Composer под Windows, вам не придется брать и устанавливать это через командую строку. Достаточно будет просто скачать установщик по этой ссылке: - Рис. 37 - Ссылка на скачивание установщика пакетного менеджера Composer на официальном сайте пакетного менеджера. Скачайте установщик, после чего запустите его. После запуска установщика, вам будет предложено выбрать режим установки. Единственный доступный режим установки это режим разработчика: - Рис. 38 - Выбор режима установки пакетного менеджера в установщике Composer. PHP: Junior Kit 249 Выбираем этот режим установки и двигаемся дальше. После этого установщику надо будет проверить версию РНР которую мы используем на локальном сервере. И поэтому мы должны будем указать путь к приложению php.exe: - Рис. 39 - Указание пути приложения php.exe в установщике пакетного менеджера Composer. После проверки РНР версии, установщик начнёт установку пакетного менеджера. И после того как вы установили сам composer, то надо будет его протестировать. Самым простым способом это сделать будет ввести команду для проверки версии пакетного менеджера: composer -v После этого выведеться большая надпись Composer сделанная с разных символов, и после нее версия самого пакетного менджера. Ну и список с кучей разных команд которые можно использовать в Composer. Сразу хочу сказать что когда вы будете устанавливать в своё приложение какие-нибудь библиотеки, то composer будет создавать отдельную папку vendor внутри которой будут находиться все папки и файлы библиотек. Каждая установленная библиотека/фреймворк будет PHP: Junior Kit 250 иметь отдельную папку, в которой и будут размещаться файлы библиотеки/фреймворка. Кроме этого в корневой папке будет создан файл composer.json , внутри которого можно будет указать информацию об приложении. Также можно будет программным способом указать какие библиотеки должны будут установлены в приложении. Вот как выглядит приблизительно файл composer.json: { "name": "authorname/my_app", "description": "Here is description", "authors": [ { "name": "George Butaki", "email": “george123@example.com” } ], "require": { "monolog/monolog": "1.12.0" } } Сначала мы указали имя приложения к которому мы хотим установить нужные для нас библиотеки. Оцените то, как мы с вами указывали название, во-первых сначала мы указали никнейм автора приложения, после слэша мы указываем само название нашего приложения. Дальше мы указали описание приложения в поле description . А дальше после этого элемента идет элемент authors внутри которого записаны данные об авторе приложения. Здесь вы можете увидеть имя автора, а также его e-mail. Конечно же, можно указать какие-то дополнительные данные, как например веб-сайт автора, или какие-то страницы в соц. сетях которые принадлежат автору приложения. PHP: Junior Kit 251 В конце файла конфигурации вы можете увидеть массив require внутри которого записаны данные об тех библиотеках, которые должны быть подключены. В нашем случае здесь только одна библиотека и это monolog. В следующем подразделе речь пойдет о том, как правильно использовать данный пакетный менеджер. 16.2 Использование Как было сказано, то в данном подразделе речь пойдет именно об использовании пакетного менеджера composer. Хорошо, представим себе ситуацию что нам надо установить библиотеку, которая бы с легкостью расширило бы функционал посылания электронных писем через РНР. Одной из самых использующих библиотек является библиотека SwiftMailer. Давайте её установим с помощью такой команды: composer require swiftmailer/swiftmailer С помощью этой команды как раз и установиться данная библиотека. Создаться папка vendor внутри которой как раз и будут храниться данные об библиотеках. Но важным моментом является то, что если вы например используете Linux, то данная команда может у вас не сработать. И в таком случае вам придется установить файл composer’a - composer.phar. К которому вы можете обращаться чтобы установить какую - нибудь библиотеку. Обращаться к этому файлу вы будете через РНР, т.е. команда инсталяции swiftmailer в через такой способ будет выглядит вот так: php composer.phar require swiftmailer/swifmailer После этого, как я уже и говорил, будет создана папка с библиотекой, а также файлы с конфигурацией приложения. Хорошо, а что же дальше делать? Как например подключить данную библиотеку в РНР файл? PHP: Junior Kit 252 Все очень просто, надо просто подключить один файл autoload.php, который находиться в папке vendor: // ... ?> В результате вы подключите все доступные библиотеки которые есть в данной папке. Файл autoload.php отвечает за подключение всех библиотек, которые находятся в папке vendor. Хорошо, мы научились подключать библиотеки, а также устанавливать их с помощью пакетного менеджера. Если нам надо будет найти определенный пакет то можно воспользоваться веб-сайтом https://packagist.org, на котором можно найти много пакетов имеющих разный функционал. - Рис. 40 - Главная страница сайта пакетов для РНР - Packagist Кроме того что вы можете найти нужные для вас пакеты, вы можете также создать свой пакет и опубликовать его на данном сайте. PHP: Junior Kit 253 Конечно же для того чтобы создать свой пакет вам придется иметь очень много знаний в веб-разработке, но также вы должны иметь чётко определенную проблему которую будет решать данный пакет. Вот представим себе, что мы нашли пакет и нам надо его установить: - Рис. 41 - Пример вывода результатов поиска пакетов на сайте packagist. Давайте просто установим пакет под именем php-encryption для того чтобы повторить материал. Для этого давайте выполним команду: composer require defuse/php-encryption Что ж, на этом я хочу завершить данный подраздел. В следующем разделе мы будем говорить об том как можно посылать электронные письма с помощью РНР, а также использовав библиотеку swiftmailer. Заключение Использование пакетного менеджера в несколько раз облегчает разработку приложения. Сейчас нельзя себе представить разработку приложений без использования каких-то расширений и библиотек. Библиотеки и расширения позволяют сократить время на разработку, а также предоставляют полноценный каркас для создания своего приложения. Поэтому используйте библиотеки, поскольку это облегчит вам разработку. PHP: Junior Kit 254 Я завершаю этот раздел и мы переходим к следующему. Но перед этим я попрошу читателя ответить на вопросы которые ниже, а также выполнить упражнения которые также находятся ниже. Вопросы и упражнения для самоконтроля 1. В чем смысл использования библиотек? 2. Как можно установить пакеты? 3. Как подключить все библиотеки к одному РНР файлу? 4. Какие есть поля в файле composer.json? 5. Где можно найти нужные пакеты? PHP: Junior Kit 255 17 Отправка электронных писем РНР можно использовать не только для того чтобы создавать какие-то хорошие динамические приложения которые могли делать все что мы захотим. Также можно реализовать в своем приложении отправку электронных писем. Например это можно использовать для того чтобы сделать автоматическое отправление писем для рассылки своим клиентам. В общем можно много чего реализовать. Конечно же, мы не будем использовать РНР средства, которые предназначены для этого. Мы будем использовать библиотеку Swiftmailer которую мы устанавливали в предыдущем разделе. Если вы пропустили предыдущий раздел, то я очень и очень рекомендую читателю вернуться к этому разделу. Или если вы просто не установили данную библиотеку, то просто введите эту команду: composer require swiftmailer/swiftmailer Установите в папке отдельного проекта и переходите к следующему подразделу. 17.1 Основы Для начала нам надо будет подключить библиотеку. Но перед этим я немного расскажу вам об структуре папки. Во-первых, я создал отдельный проект, точнее папку для xampp как отдельный проект и внутри установил как раз swiftmailer. Дальше мы создадим файл index.php: ?> PHP: Junior Kit 256 А теперь мы должны подключиться к нашему e-mail серверу. Но перед этим немного расскажу на базовом уровне об том какие есть протоколы в сети. Когда мы хотим мы с вами например, загрузить на сервер файл то мы используем протокол FTP. К примеру, когда мы загружаем в своё приложение новый скрипт. Когда мы с вами загружаем какой-то файл через браузер, то здесь уже работает протокол HTTP. А если мы хотим послать какое-то сообщение, то уже здесь мы используем протокол SMTP. SMTP - как можно понять используется для того чтобы посылать электронные письма на сервер электронной почты. Поскольку мы с вами используем локальный сервер, то надо будет настроить РНР под локальный SMTP сервер. Но мы можем этого не делать! А все потому что с помощью swiftmailer можно с легкостью подключаться к любым другим сервисам. У нас уже есть все нужные средства. Мы будем с вами подключаться к e-mail сервису от компании Google, т.е. к Gmail. Поэтому давайте с вами сделаем подключение, сразу говорю что вам понадобиться ваша учётная запись Google а также почтовый ящик для теста. В примере я буду использовать аккаунт, которого не существует, вот код с примером использования Swiftmailer: $transporter = (new Swift_SmtpTransport("smtp.gmail.com", 465, "ssl")) ->setUsername("example@gmail.com") ->setPassword("my_password"); ?> Смотрите, мы создаём объект SMTP транспортера для того чтобы подключиться к сервису Gmail. Когда мы с вами создали новый объект, то мы указали три параметра. Первый параметр - это сервер, к которому мы хотим подключиться, второй это порт и третий это протокол который мы используем для подключения. Заметьте что мы потом указали логин и PHP: Junior Kit 257 пароль пользователя учетной записи сервиса gmail. Туда вы можете ввести данные своей учетной записи. Дальше мы можем с вами взять и попробовать отослать тестовое сообщение: $transporter = (new Swift_SmtpTransport("smtp.gmail.com", 465, "ssl")) ->setUsername("example@gmail.com") ->setPassword("my_password"); $mailer = new Swift_Mailer($transporter); // Создаем наш майлер для того чтобы отсылать сообщения $message = (new Swift_Message("Мое первое сообщнение")) ->setFrom(["example@gmail.com" => "Mike Jordan"]) ->setTo(["receiver@gmail.com" => "Name of receiver"]) ->setBody("Here is text of message"); $result = $mailer->send($message); ?> В этом коде мы уже создаем сообщение которое мы потом отсылаем с помощью нашего майлера. То что вы сейчас видите, это самый простой способ использования Swiftmailer. Переходим к следующему подразделу. PHP: Junior Kit 258 17.2 Загрузка файлов Хорошо, мы можем отсылать простые сообщения с текстом. Ну а как насчёт того чтобы сделать так чтобы можно было отсылать файл? Для этого нам понадобиться создать объект класса, который отвечает за файлы в Swifmailer: // … // Здесь мы как бы создаем наш транспортер // в переменной $transporter // … $mailer = new Swift_Mailer($transporter); $message = (new Swift_Message("Мое первое сообщнение")) ->setFrom(["example@gmail.com" => "Mike Jordan"]) ->setTo(["receiver@gmail.com" => "Name of receiver"]) ->setBody("Here is text of message"); $attachment = Swift_Attachment::formPath("path/to/my/file.pdf ", "application/pdf"); // Указываем какой файл мы хотим прикрепить к нашему письму $message->attach($attachment); // Прикрепляем сам файл к нашему письму $result = $mailer->send($message); PHP: Junior Kit 259 ?> Заметьте, что для того чтобы прикрепить к письму файл мы воспользовались функцией formPath, с помощью которой мы указали путь к файлу, а также его формат с помощью второго параметра указали формат для нашего файла. А дальше уже с помощью функции attach мы прикрепили сам файл к письму. Но если у вас случилась такая ситуация что вам надо поменять имя файла который вы хотите вложить, то просто воспользуйтесь функцией setFilename(): //… $attachment = Swift_Attachment::formPath("path/to/my/file.pdf", "application/pdf") ->setFilename("super-file.pdf"); // Изменяем имя файла //… ?> Конечно, есть и много других способов как можно прикрепить файлы к письму. Также хочу подметить, что в письме можно использовать какой-то HTML код: //… $message->setBody(" |