Конспект о ООП в php

06 авг. 2016 г., 14:57:31 admin

Оглавление

  1. Наследование
  2. Области видимости
  3. Статические методы
  4. Постоянные свойства (константы)
  5. Абстрактные классы
  6. Абстрактные методы
  7. Интерфейс
  8. Трейты
  9. Позднее статическое связывание
  10. Обработка ошибок (исключения)
  11. Завершенные классы и методы
  12. Методы перехватчики (перегрузка)
  13. Конструктор, деструктор

Наследование

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

Производные классы могут расширять и изменять функциональность родительских классов.

Каждый класс наследует свойства родительского класса.

Наследование поддерживается ТОЛЬКО от одного родителя.

// class One наследует class Two
class One extends Two {}

Области видимости

public (публичный) доступ отовсюду.

protected (защищенный) доступ наследуемым и родительским классам.

private (закрытый) доступ ТОЛЬКО классу в котором объявлен элемент.

Статические методы

Функции используемые в контексте класса. Доступ к статическому элементу осуществляется через класс, а не через экземпляр объекта.

public static function Name() {}

Постоянные свойства (константы)

Постоянные свойства могут содержать значения относящиеся только к элементарному типу.

Постоянному свойству нельзя присвоить объект. Доступ к постоянному свойству осуществляется через класс.

Абстрактные классы

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

Экземпляр абстрактного класса нельзя создать.

abstract class Name
{
    // какой-то код        
}

Абстрактные методы

Абстрактный метод не может иметь реализацию в абстрактном классе. Абстрактный метод необходимо реализовывать в дочерних классах.

abstract function Name();

Интерфейс

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

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

interface Name
{
    // какие-то методы
}
// class One реализует interface Name
class One implements Name 
{
    // реализация методов объявленных в интерфейсе Name
}

Наследование (extends) предшествует реализации (implements). Класс может реализовывать несколько интерфейсов.

// class One наследует class Two реализует interface Name и интерфейс Three
class One extends Two implements Name, Three
{
    // реализация interface Name and Three
}

Трейты

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

Трейт изменяет структуру класса в который включен, но не меняет его тип.

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

Методам трейта можно изменять права доступа (область видимости) в классе который использует трейт при помощи as.

insteadof для указания какой метод использовать если в трейтах есть методы с одинаковыми именами.

as для назначения псевдонимов, области видимости.

trait TraitOne {
    // какой-то код
}
trait TraitTwo {
    // какой-то код
}
class NameClass
{
    use TraitOne, TraitTwo {
        // использовать method трейта TraitOne вместо method TraitTwo
        TraitOne::method insteadof TraitTwo;
        // as для назначения псевдонима
        // method из TraitTwo будет под псевдонимом methodTwo
        TraitTwo::method as methodTwo;
        // as для изменения права доступа
        TraitOne::method as private;
    }
}

Позднее статическое связывание

self::method();

Ссылка на статический method в содержащем его классе.

parent::method();

Ссылка на method в родительском классе.

static::method();

Ссылка на вызываемый, а не содержащий класс, может ссылаться только на статические поля класса.

Обработка ошибок

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

Конструктору Exception передается два необязательных аргумента:

  1. Строка сообщения
  2. Код ошибки

Когда функция генерирующая (выбрасывающая) исключение используется внутри try и выбрасывается исключение его обрабатывает оператор catch. Операторов catch может быть несколько.

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

Если не обработать исключение, произойдет Fatal Error. Исключение должно генерироватся когда метод обнаруживает ошибку, но метод не должен знать что делать с ошибкой.

Блок кода содержащийся в операторе finally выполняется всегда, не смотря на то было выброшено исключение или нет. Код содержащийся в finally запустится если в catch будет повторно выброшено исключение или будет выполнен return. Если в try или catch будет вызов die() или exit() код finally не запустится.

class ClassName
{
    function name() {
        throw new Exception("Text", 1);
    }
}

try {
    $a = new ClassName;
    $a->name();
} catch (Exception $e) {
    echo $e->getMessage();
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    echo $e->getMessage();
}

Завершенные классы и методы

Ключевое слово final запрещает наследование, переопределение.

final class Name
{
    final function FunctionName()
    {
        # code...
    }
}

Методы перехватчики (перегрузка)

Делегирование - когда один объект может вызвать метод другого объекта.

Рефлексия - исследование состава класса во время выполнения программы.

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

Методы __get() и __set() можно использовать для поддержки составных свойств.

$property = имя свойства/метода

__get($property) — вызов при обращении к неопределенному свойству.

__set($property, $value) — вызов при присваивании значения неопределенному методу.

__isset($property) — вызов когда функция isset() вызывается для неопределенного свойства.

__unset($property) — вызов когда функция unset() вызывается для неопределенного свойства.

__call($method, $arg_array) — вызов при обращении к неопределенному нестатическому методу.

__callStatic($method, $arg_array) — вызов при обращении к неопределенному статическому методу.

Конструктор, деструктор

__construct() — вызов при создании нового объекта.

__destructor() — вызов при завершении всех ссылок на объект.

Конструкторы и деструкторы объявленные в родительском классе не будут вызваны автоматически.

Обращение к родительскому конструктору: parent::__construct(); к деструктору обращение такое-же.