Этот шаблон упаковки неструктурированных данных в типы, чтобы мы могли использовать наши данные надежным способом, называется “объекты передачи данных” или DTO (Data Transfer Object). Этот шаблон я настоятельно рекомендую вам использовать в ваших проектах большего размера. Для средних и маленьких проектов данный шаблон будет избыточен.

Процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.

Dependency Injection – это программный шаблон, который реализует принцип объектно-ориентированного программирования "Инверсия управления (Inversion Of Control)". Реализация этого шаблона подразумевает снижения "связанности кода", соответственно, получается код, который легче использовать повторно и сопровождать, то есть, изменение компонент одной части приложения не вызывает ошибок в другой части или необходимости значительных каскадных изменений.

В php это можно представить как пример с двумя классами, которые взаимодействуют друг с другом. Так вот di тут будет представлять собой как передача инстанса второго класса как параметр в первый объект, а не как создание в первом классе постредством конструктора инстанса второго

Так не правильно:

class First
{
  protected $second;

  function __construct()
  {
    $this->second = new Second('123');
  }
}

Так правильно:

class First
{
  protected $second;

  function __construct(Second $second)
  {
    $this->second = $second;
  }
}

$second = new Second('123');
$first = new First($second);

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

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

Класс имплиментирует интерфейс, в то время класс наследует абстрактный класс либо его расширяет.

Класс может имплиментировать несколько интерфейсов но не может быть наследником нескольких класов, для множественного наследования используеться trait или магический метод __call

Паттерны проектирования, в основном по предназначению, деляться на 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 );
};