Паттерны проектирования, в основном по предназначению, деляться на 3 крупные группы 

  • Структурные паттерны - отображают возможные способы связей между объектами.

  • Поведенческие паттерны - страраються создать максимально эффективный камуникации между объктами.

  • Порождающие паттерны - создание гибкой и простой системы генерации объктов без изменения всей программы

 Струкрутные патерны

  • Адаптер(Wrapper, Обёртка, Adapter) - это паттерн который позволяет связать два объекта которые имеют различные интерфейсы, например если данные в приложении получаются из api в формате csv, и внезапно появилась надобность получать данные еще из другого api который хранит данные в xml
  • Мост(Bridge) - разбиение огромного класса, который содержит различную функциональность на два класса абстракцию и реализацию, что позволяет лучше применять изменения в программе в общем. Т.к. если увеличивать функциональность прийдеться увеличивать количество подклассов.
  • Компоновщик(Дерево, Composite) - создает дерево объектов и работает с ним с единым объектом, что позволяет быстро получить данные, например рекурсивно подсчитать цену продукта, у которого есть подпродукты 
  • Декоратор(Wrapper, Обёртка, Decorator) - позводяет добавлять поведение объектам не изменяя их, размещая объекты в так называемые обертки. Это необходимо например при фильтрации каких либо текстов.
  • Фасад (Facade) - паттерн позволяющий упростить более сложные реализующие классы, например заказ через службу поддержки. Например покупка товара включает в себя выбор товара, упаковку товара, доставку и еще кучу нужных задач о которых покупателю не нужно знать, в данной ситуации менеджер являеться фасадом, он помогает реализовать хоть и не в полной мере но поверхностно все данные задачи.
  • Легковес (Flyweight)
  • Заместитель (Proxy)

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

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

list() это не функция, а языковая конструкция которая позволяет за одни ход сразу присвоить нескольким переменным значения. Для этого в параметрах передаются названия а через оператор "=" указываем массив со значениями этих переменных. Переменных в php5 присваиваться с право на лево, а в php7 с лево на право. list($a, $b, $c) = ['a', 'b', 'c'];

Данные функции как и лямбда функции(анонимные) являються инстансами класса Closure

Стандартный вид fn (argument_list) => expr.

Эти функции умеют все тоже что и анонимные, а переменные в которые находятся в родительском пространсве, неявно переносятся по имени в стрелочную функцию, тоесть становятся замыканием

В анонимных функциях пробрасывать переменные с родитеского пространства нужно использую ключевое слово use

В 7 версии существую такие типы данных

  • bool - false/true
  • int - целые числа
  • float - числа с точкой
  • String - обычные строки
  • Array - массивы
  • iterable - итерируемые
  • object - объекты
  • Resources - спец. ресурсы, такие как curl, ftp и тд.
  • NULL - Переменная без значения, существует только одно значение
  • callable - функции обратного вызова

Это константа которая отображает разделитель строки. Т.к. в Linux подобных системах и windows этот разделитель разный, / и \ соответственно, то играться с выбором правильно косой не комильфо). Ну вообще конечно WIndows может работать с обоими косыми, поэтому проблемы то и нет как таковой, но если мы хотим разбить строку данных на массив, например взяв магическую константу "__DIR__" лучше использовать DIRECTORY_SEPARATOR для функции explode

Просто указываем данную константу в скриптах и теперь наш движек может работать под разными ОС.

Http(HyperText Transfer Protocol) «протокол передачи гипертекста» - это основной сетевой протокол передачи данных в интернете, который использует клиент-серверную архитектуру. Взаимодействие между клиентом и сервером осуществляется с помощью обмена пакетами которые называются запрос (Request) и ответ (Response). Нынешняя версия 1.1 в спецификации RFC 2616.

Каждый пакет состоит из трех кусков: стартовая строка, заголовки и тело. Обязательной является только стартовая строка.

Стартовые строки разных пакетов имеют разный формат. Формат запроса "МетодЗапроса URI HTTP/Версия", формат ответа "HTTP/Версия КодСостояния Пояснение"

Некоторые методы мы используем в REST API

Representational state transfer - «передача состояния представления»

Это набор правил помогающие программисту правильно написать серверное приложение, которое взаимодействует с различными системами отображения, взаимодействия и масштабированием.

Например googleanalytics в браузере и, в приложении на телефоне.

Общение с сервером происходит через URL адреса, все происходите через протокол HTTP, поэтому обычно используются методы:

  • GET - получение данных,
  • POST - запись данных,
  • PUT - обновление данных,
  • DELETE - удаление данных,

Он может быть либо массивом, который можно перебрать, либо объектом реализующий интерфейс Traversable.

Обычно реализовывают интерфейсы Iterator или IteratorAggregate которые являются наследниками Traversable

Callable - это переменные, которые могут быть вызваны как функции. То есть их можно использовать в функциях которые принимают другие функции в параметрах, тогда они будут callback функциями.

Такой тип может быть у строки, если строка включает в себя название функции. Также такой тип может быть у объекта, который включает в себя метод __invoke. Также могут использоваться статические методы класса, но для их реализации потребуется использование call_user_func()

Более подробно можно посмотреть в callback

  • @throws - исключения используемые в методе
  • @var - описание переменных, внутри функций, так и свойств класса
  • @param - параметр метода либо функции
  • @author - автор кода
  • @copyright - копирайт кода
  • @version - версия скрипта
  • @phan-param - использование анализатора phan (Позволяет писать конструкции array{test:string,test2:string} $testVar )
  • @@psalm-param - использование анализатора psalm(расширяет возможности описания)
  • @return - возвращаемый результат
  • @deprecated - в следующей версии будет удален
  • @example - ссылка на пример использования кода
  • @ignore - игнорирование док блока
  • @license - тип лицензии
  • @method (класс) — служит для описания магических методов __call
  • @property (класс) — так же, как и @method, описывает свойства, доступ к которым будет через магические методы __get() и __set()
  • @todo (в любом месте) — напоминание доделать что-то, когда-то в каком-то участке кода
  • @category (файл, класс) — нужен для группирования пакетов.

В php используется неявное приведение типов, это означает что можно сложить две переменных оператором "+" даже если одна из них будет "int", а вторая "string". Php автоматически приведет тип второй переменной к int. Это конечно же являться и плюсом, и минусом. Т.к. может вызывать неожиданную реакцию приложения и потом сложно отследить где, что поломалось. Для решения данной проблемы нужно указывать типы данных явно, при этом хорошим тоном есть указание типов и в параметрах функций, и в возвращаемых данных методов. В общем лучше указывать тип данных везде где можно, при создании свойств в классах и т.п.

Сравнение с использование оператора "==", "!=" обычно работает также в связке с преобразованием типов, то есть если в двух переменных похожие данные например $int = 1 и $str = "1" , то при сравнении они будут идентичны, т.к. сработает неявное приведение. НО эти переменные разных типов и содержат разные данные по типу. Для исключения данной ошибки лучше использовать ВЕЗДЕ тождественные сравнения "===","!=="

... - обозначяет, что функция или метод принимает переменную длину аргументов.

  
public function setVar(int ...$intVar) {
    $this->var = $intVar;
  }

В php используются ссылки на переменные, которые позволяют обратиться к переменной через какую-то другую сущность. Например если мы в функцию отправим переменную A, по ссылке, содержащу например 2, назовем ее B. Потом приизведем действие декримета над B. И потом выведем A то увидим цифру 1

  • константы - SCREAMING_SNAKE_CASE
  • названия объектов - UpperCamelCase
  • названия переменных, методов, функций и т.д. - lowerCamelCase
  • таблички/поля в бд, json, yml - snake_case

Есть функции, такие как array_map() или usort(), принимают пользовательские callback-функции в качестве параметра.Они могут быть как простыми функциями, так и методами объектов, включая статические методы классов.

Если мы хотим использовать метод класса, то передается индексируемый массив, в котором 0 ключ будет имя класса, 1 ключ - название метода

userFunction(array('MyClass', 'myCallbackMethod'));
$numEven = array_map(function($a) {
    return $a * 2;
}, $numbers);

Это функции которые не имеют названия, обычно используются как callback параметры для других именованных функций.

Были внедрены в php 5.3, до этого использовалась функция create_function(). Она создавала псевдо-анонимные функции, так-как они все равно имели название.

echo preg_replace_callback('~-([a-z])~', function ($match) {
    return $match[1];
}, 'say-go');

Все лямбда функции являются инстансами класса "Closure".

При помощи ключевого слова "use" мы может передать в локальную область видимости функции, переменную из общей области видимости. Такие функции еще называются замыканиями. Т.к. функция не имеет названия используют ее через ссылку на переменную.

$var = 1;
$anonim = function () use ($var ) {
    var_dump($var );
};

Оператор управления ошибками: знак @. В случае, если он предшествует какому-либо выражению в PHP-коде, любые сообщения об ошибках, генерируемые этим выражением, будут проигнорированы.

E_ERROR (integer) Фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается.

E_WARNING (integer) Предупреждения времени выполнения (не фатальные ошибки). Выполнение скрипта в таком случае не прекращается.

E_PARSE (integer) Ошибки на этапе компиляции. Должны генерироваться только парсером.

E_NOTICE (integer) Уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы.

E_CORE_ERROR (integer) Фатальные ошибки, которые происходят во время запуска РНР. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются ядром PHP.

E_CORE_WARNING (integer) Предупреждения (не фатальные ошибки), которые происходят во время начального запуска РНР. Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются ядром PHP.

E_COMPILE_ERROR (integer) Фатальные ошибки на этапе компиляции. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются скриптовым движком Zend.

E_COMPILE_WARNING (integer) Предупреждения на этапе компиляции (не фатальные ошибки). Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются скриптовым движком Zend.

E_USER_ERROR (integer) Сообщения об ошибках, сгенерированные пользователем. Такие ошибки схожи с E_ERROR, за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error().

E_USER_WARNING (integer) Предупреждения, сгенерированные пользователем. Такие предупреждения схожи с E_WARNING, за исключением того, что они генерируются в коде скрипта средствами функции PHP trigger_error().

E_USER_NOTICE (integer) Уведомления, сгенерированные пользователем. Такие уведомления схожи с E_NOTICE, за исключением того, что они генерируются в коде скрипта, средствами функции PHP trigger_error().

E_STRICT (integer) Включаются для того, чтобы PHP предлагал изменения в коде, которые обеспечат лучшее взаимодействие и совместимость кода.

E_RECOVERABLE_ERROR (integer) Фатальные ошибки с возможностью обработки. Такие ошибки указывают, что, вероятно, возникла опасная ситуация, но при этом, скриптовый движок остается в стабильном состоянии. Если такая ошибка не обрабатывается функцией, определенной пользователем для обработки ошибок (см. set_error_handler()), выполнение приложения прерывается, как происходит при ошибках E_ERROR.

E_DEPRECATED (integer) Уведомления времени выполнения об использовании устаревших конструкций. Включаются для того, чтобы получать предупреждения о коде, который не будет работать в следующих версиях PHP.

E_USER_DEPRECATED (integer) Уведомления времени выполнения об использовании устаревших конструкций, сгенерированные пользователем. Такие уведомления схожи с E_DEPRECATED за исключением того, что они генерируются в коде скрипта, с помощью функции PHP trigger_error().

E_ALL (integer) Все поддерживаемые ошибки и предупреждения, за исключением ошибок E_STRICT до PHP 5.4.0.

Исключение – это объект, который является экземпляром класса Exception. Этот объект создаётся для хранения информации о произошедшей ошибке и для формирования сообщений о ней. Основные методы которые имплементированы с интерфейса "Throwable":

  • getMessage ( void ) : string - сообщение об ошибке
  • getPrevious ( void ) : Throwable - возвращает исключение которое идет перед
  • getCode ( void ) : mixed - код исключения
  • getFile ( void ) : string - файл в котором произошло исключение
  • getLine ( void ) : int - строка кода в котором выброшено исключение
  • getTrace ( void ) : array - трассировка стека
  • getTraceAsString( void ) : string - трассировка стека в виде строки
  • __toString ( void ) : string - Можно переопределить т.к. он public

В php можно отлавливать ошибки с помощью исключений. Выбросить исключение можно при помощи ключевого слова "throw", дальше ключевое слово "new" и потом название объекта исключения обычно Exception

Можно создать свой объект исключений отнаследовав класс Exception

Код генерирующий исключение, должен быть окружен блоком "try", для того, чтобы можно было перехватить исключение. Каждый блок try должен иметь как минимум один соответствующий ему блок catch или finally.

Блок finally можно использовать после или вместо блока catch. Код в блоке finally всегда будет выполняться после кода в блоках try и catch, независимо от того, было ли выброшено исключение, перед тем как продолжится нормальное выполнение кода.

Использование данного слово очень просто, его нужно разместить перед объявлениями методов класса. Оно позволяет предотвратить их переопределение в дочерних классах.

Если же сам класс определяется с этим ключевым словом, то он не сможет быть унаследован.

При наследовании объектов, потомок с унаследованными методами имеет доступ к статическим константам, методам и свойствам своего класса в этих унаследованных методах, а не только родительского класса.

Обращение к константам, методам и свойствам своего класса организовано через слово static:: которое должно быть прописано в методе родителя, вместо обычного обращения через self::