Программирование

Xhprof - это специальное расширение для PHP, которое собирает для вас различные статистические данные вашего приложения: количество вызовов функции, время выполнения, последовательность выполнения, использование процессорного времени, использование памяти и т.д. Удобно использовать в высоконагруженных приложениях, чтобы отследить бреши в производительности и впоследствии устранить их. Далее ваш покорный слуга расскажет захватывающую историю установки xhprof под LEMP.

Атрибуты defer и async у тэга script

Когда мы подключаем внешний javascript файл с использованием тэга script, мы используем следующий синтаксис:

<script src="path/to/script.js"></script>

Как многим известно, если мы подключаем внешний файл до основного HTML контента, скрипт будет подгружаться синхронно. Это означет, что мы не увидим основное содержимое страницы до полной загрузки скрипта. Иногда это может существенно повлиять на скорость отображения содержимого. В этой связи хорошей практикой считается подгружать внешниие скрипты непосредственно перед закрывающим тэгом </body>.

<body>
  <p>Основное содержимое</p>
  <script src="path/to/script.js"></script>
</body>

Атрибуты defer и async позволяют подгружать скрипты асинхронно, вне зависимости от того, в какой части страницы мы их расположим:

<script async src="path/to/big-script.js"></script>
<p>Привет, мир!!</p>

Код сверху выведет на экран строку "Привет, мир!!" даже в том случае, если скрипт из файла "path/to/big-script.js" не будет загружен. Скрипт отработает как только полностью загрузится.

Атрибуты defer и async работают примерно одинаково, но есть 2 существенных отличия:

  1. Порядок подключения скриптов с defer будет сохранён.
  2. Скрипт с defer будет выполнен только после того, как весь HTML будет загружен. 
    Скрипт с атрибутом async отработает как только загрузится, даже в том случае, если HTML ещё не полностью загружен. Скрипт с атрибутом defer будет ожидать полной загрузки HTML кода страницы.

Директива "use strict"

Директива "use strict" включает строгий режим, который накладывает определённые ограничения на javascript. Данные ограничения сделаны для того, чтобы отгородить программиста от старых особенностей языка, которые потенциально могут привести к ошибкам.

Директива "use strict" должна быть указана до кода (в самом начале файла), или в самом начале функции

Чтобы включить строгий режим, необходимо в начале скрипта (или функции) указать строку "use strict":

"use strict";

var helloWorld = "Hello, world!";

или

(function(){
  "use strict";
  
  var helloWorld = "Hello, world!";
});

В PHP 5 и более ранних версиях, обработать фатальную ошибку и продолжить работу программы было невозможно. При возникновении ошибки, программа просто прекращала свою работу без возможности что-либо сделать. Появление PHP 7 дало возможность программистам перехватывать фатальные ошибки, и обрабатывать их как обычные исключения (Exceptions).

Как это работает?

При возникновении фатальной ошибки (E_ERROR) или ошибки с возможностью обработки (E_RECOVERABLE_ERROR) будет выброшено специальное исключение типа Error которое в свою очередь реализует интерфейс (Throwable). 

interface Throwable {
  /* Methods */
  abstract public string getMessage ( void )
  abstract public int getCode ( void )
  abstract public string getFile ( void )
  abstract public int getLine ( void )
  abstract public array getTrace ( void )
  abstract public string getTraceAsString ( void )
  abstract public Throwable getPrevious ( void )
  abstract public string __toString ( void )
}

Из этого следует, что оба класса (Exception и Error) теперь реализуют один и тот же интерфейс Throwable.

Класс Error не является наследником класса Exception.

Это сделано для того, чтобы не сломать обратную совместимость после перехода на PHP 7. Таким образом, исключение типа Error не будет случайно обработано в проекте, написанном на PHP 5.*.

Примеры и разъяснения в продолжении статьи ...

Что нам понадобится?

Для комфортной работы с изображениями в PHP, нам понадобится библиотека GD. Возможно, ваша версия PHP уже имеет библиотеку GD. Проверить её наличие можно запустив следующий код:

// true - библиотека уже установлена
// false - библиотеки нет, её нужно установить
var_dump(function_exists('imagetypes'));

Если по какой-то причине у вас не установлена GD, вот руководство как это сделать - http://php.net/manual/ru/image.installation.php.

Что можно делать с помощью GD?

Библиотека предоставляет широкие возможности для работы с изображением:

  • получение информации об изображении (размер, расширение, MIME тип)
  • создание нового изображения
  • рисование различных фигур (эллипсы, прямоугольники, многоугольники, линии, точки и т.д.)
  • заливка цветом
  • загрузка шрифтов и работа с текстом на изображении
  • конвертирование изображения в другой формат

Это далеко не весь список функций. Подробнее с функциями можно ознакомиться на официальном сайте PHP - http://php.net/manual/ru/book.image.php

Примеры в продолжении статьи.

В продолжении серии статей по книге Стива Макконнелла "Совершенный код", я хотел бы рассказать о ключевых моментах 2-ой части книги. Вторая часть посвящена непосредственно коду приложения и его качеству, поэтому она так и называется: "Высококачественный код". 

Далее Вы можете ознакомиться с ключевыми мыслями из книги, которые я для себя вынес.

"Совершенный Код" Стива Макконнелла, является одной из самых популярных книг среди программистов со всего мира. А так как во мне ещё не умерла надежда создать 2-ой Фейсбук, я не мог обойти данную литературу стороной. В этой записи я расскажу о ключевых моментах из первой части книги:

  • Из чего состоит процесс разработки ПО
  • Чем конструирование ПО отличается от разработки
  • Предварительные требования разработки

 Далее обо всём по порядку ...

В предыдущей статье о паттернах проектирования, я описывал шаблон Фасад, который помогает определить более простой интерфейс доступа к какому-либо функционалу. Данную же статью я посвящаю другой небезызвестной фигуре в кругах архитекторов ПО - декоратору!

Определение

Декоратор - это структурный шаблон проектирования, который предназначен для расширения функционала объекта, без применения наследования.

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

Пример далее ...