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

  
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
Принцип инверсии зависимостей
Все приложение должно быть создано по принципу абстракций “сверху вниз”: не абстракции нужно создавать на основе деталей, а детали должны создаваться на основе абстракций.

Делайте вещи проще (keep it short and simple - KISS)
Не стоит перегружать интерфейс теми опциями, которые не будут нужны большинству пользователей, гораздо проще предусмотреть для них отдельный «расширенный» интерфейс.

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

 

 

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

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

Область видимости свойства, метода или константы (начиная c PHP 7.1.0) - это возможность инкапсулировать данные.

Доступ к свойствам и методам класса, объявленным как public (общедоступный), разрешен отовсюду.

Модификатор protected (защищенный) разрешает доступ самому классу, наследующим его классам и родительским классам.

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

Выражение include включает и выполняет указанный файл.

require аналогично include, за исключением того, что при ошибке он также выдаст фатальную ошибку уровня E_COMPILE_ERROR. Другими словами, он остановит выполнение скрипта, тогда как include только выдал бы предупреждение E_WARNING, которое позволило бы скрипту продолжить выполнение.

Выражение include_once,require_once аналогично include,require за исключением того, что PHP проверит, включался ли уже данный файл, и если да, не будет включать его еще раз.