Это константа которая отображает разделитель строки. Т.к. в 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::

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

В php используется одиночное наследование, это значить что нельзя быть сразу наследником двух классов. Для решения данной проблемы есть trait и магический метод __call.

Наследование осуществляется при помощи ключевого слова extend

Инкапсуляция - это способность объектов инкапсулировать в себе свойства и методы.

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

Также для инкапсуляции используются модификаторы доступа для данных структур, а с php 7.1 еще и для констант.

  • Инкапсулируйте все, что может изменяться. Доступ только для
  • Уделяйте больше внимания интерфейсам, а не их реализациям;
  • Класс должен иметь только одно назначение и выполнять его максимально быстро и хорошо
  • Абстракция — отделение концепции от ее экземпляра;
  • Полиморфизм — реализация задач одной и той же идеи разными способами;
  • Наследование — способность объекта или класса базироваться на другом объекте или классе. Это главный механизм для повторного использования кода. Наследственное отношение классов четко определяет их иерархию;
  • Инкапсуляция — размещение одного объекта или класса внутри другого для разграничения доступа к ним.

Не повторяйся (Don’t repeat yourself — DRY)
Нужно не писать одинаковый код, лучше выделить часто используемые действия и данные в абстракции. Любой код в приложении должен повторяться только единожды.

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

SOLID
Принцип открытости/закрытости
Любые объекты должны быть открыты для расширения, но закрыты для внесение в них изменений.

SOLID
Принцип подстановки Барбары Лисков LSP
Методы, которые получают в параметрах объект с неким типом, должны иметь возможность работать с объектами наследующими данные тип.Наследующий класс должен дополнять, а не изменять базовый

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

SOLID
Принцип инверсии зависимостей
Все приложение должно быть создано по принципу абстракций “сверху вниз”: не абстракции нужно создавать на основе деталей, а детали должны создаваться на основе абстракций.

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

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