Абстрактные классы и дополнения ООП

Введение

Последняя глава этой серии.

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

Я рад, что вы прошли все разделы, и в этой части вы закончите то, что начали.

Фактически,

теперь вы узнаете, как использовать абстрактные классы и некоторые другие менее распространенные функции PHP, такие как API отражения и шаблон проектирования singleton.

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

Следите за серией…

Этот пост в блоге является шестой частью «Полное руководство по объектно-ориентированному программированию:

Пройдите путь от процедурного программирования до ООП-эксперта в PHP».

Если вы еще не читали другие части

Вы можете проверить другие сообщения в блоге по ссылкам ниже
Введение в объектно-ориентированное программирование,
Наследование и интерфейсы в PHP,
Дополнительные интерфейсы и полиморфизм,
Видимость и статическое ключевое слово,
Конструктор и магические методы а также
Абстрактные классы и дополнительные биты

Содержание
Абстрактные классы
Цепочка методов
Автозагрузка
Анонимные классы
API отражения
Синглтон

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

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

Определение довольно простое, в основном абстрактный класс — это класс, который содержит абстрактные методы,

Абстрактные методы — это методы, которые были объявлены, но не реализованы в коде.

Такого рода классы не могут быть построены как объект, на самом деле их необходимо расширять.

«Нормальный» класс, который расширяет абстрактный, должен реализовывать все методы, которые находятся внутри родителя.

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

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

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

abstract class Building {
    abstract protected function getWindowsCount();
    public function __construct()
    {
        echo “Building cannot be constructed”;
    }
}
class Office extends Building {
    public function getWindowsCount()
    {
        return 12;
    }
}
$myOffice = new Office;
// This command will return “Building cannot be constructed”
$myOffice->getWindowsCount();
// This command will return 12

Я определил класс Office, который расширяет абстрактный класс Building.

Я реализовал getWindowsCount() и изменил его видимость с защищенного на общедоступный.

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

Я добавил конструктор внутри абстрактного класса, чтобы вы знали, что конструктор родителя вызывается при создании экземпляра объекта.

В чем разница между интерфейсом и абстрактным классом?

Подводить итоги,

Рассматривайте интерфейс как пустую оболочку.

Он имеет только сигнатуры методов, то есть у методов нет тела.

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

С другой стороны, абстрактные классы — это правильные классы.

Несмотря на то, что они выглядят как интерфейсы, они имеют некоторые специфические характеристики.

Вы можете указать их использование по тому, что они делают, по заданному имени метода.

Вот пример, который подчеркивает различия между ними:

interface Building
{
     public function build();
     public function getWindowsCount();
}
class Office implements Building
{
    public $windows;
    public function build()
    {
        echo “Office built”;
    }
    public function getWindowsCount()
    {
        return $this->windows;
    }
}

Здесь мы говорим, что все здание должно выглядеть так, а не класс Office, чтобы изменить функциональность.

abstract class Building
{
    public $windows;
    public function getWindowsCount()
    {
         return $this->windows;
    }
    abstract public function build();
}
class Office extends Building
{
    public function build()
    {
        echo “Office built”;
    } 
}

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

Затем мы говорим, что метод build() может быть другим, поэтому мы обязываем класс Office предоставить реализацию в соответствии с его потребностями.

Мы почти закончили введение в объектно-ориентированное программирование на PHP.

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

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

Цепочка методов

Цепочка методов — это метод ООП, который позволяет программисту последовательно выполнять несколько разных, но связанных действий.

Давайте разберем это предложение,
Выполнять различные действия“ означает вызов различных методов или функций;
метод-chaining.jpg

Выполнение связанных действий” можно перевести в действия, относящиеся к тому же объекту или экземпляру класса;

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

Вот пример, поясняющий концепцию:

class Building
{
    public $message;
    function __construct()
    {
        $this->message = "Foundation poured - ";
    }
    function stepOne()
    {
        $this->message .= "framing, plumbing, electrical and HVAC completed -";
        return $this;
    }
    function stepTwo()
    {
        $this->message .= "interior and exterior completed";
        return $this;
    }
    function getMessage()
    {
        return $this->message;
    }
}
$myHome = new Building();
echo $myHome->stepOne()->stepTwo()->getMessage();

Ну вот,

Все методы класса Building имеют одну общую черту, все они возвращают сам объект с помощью ключевого слова $this,

Если вам нужно освежить память, я объяснил, что делает ключевое слово $this, во введении в объектно-ориентированное программирование.

Последняя команда связывает все методы класса, необходимые для построения нашего предложения.

Результат последней команды будет выглядеть так:

«Фундамент залит — каркас, сантехника, электрика и ОВиК завершены — завершены внутренние и наружные работы».

Это настолько просто, что вы можете сразу реализовать это в своем коде без каких-либо проблем, просто будьте осторожны, возвращая объект.

Автозагрузка

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

забыть сделать это приведет к ошибке.

Автозагрузка вместе со стандартами PSR-4 позволяет вам определять их, когда требуется класс.

Я уверен, что мне не нужно говорить, что это невероятно важная функция.

В PHP автозагрузка выполняется функцией spl_autoload_register(), которая принимает функцию в качестве параметра,

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

поэтому я просто приведу вам понятный пример:

Учитывая, что класс, который вы хотите автоматически загрузить, находится в пути «classes/»,

вот что бы вы сделали.

Это более или менее то, что происходит за кулисами большинства PHP-фреймворков.

function myAutoloader($className) {
    include 'classes/' . $className . '.php';
}
spl_autoload_register(myAutoloader);

spl_autoload_register имеет еще два параметра,

второй является логическим и определяет, должен ли spl_autoload_register создавать исключения, когда autoload_function не может быть зарегистрирован,

третий параметр также является логическим, и если он равен true, он добавит автозагрузчик, а не прикрепит его.

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

Анонимные классы

Было бы здорово, если бы PHP позволял веб-разработчику создавать и создавать объекты на лету?

Релиз PHP 7 включил этот подарок в список своих возможностей.

$myAnonymousBuilding = new class(“Main Street”)
{
    public function __construct(string $address)
    {
        echo “a new class has been constructed in ” . $address;
    }
}

Круто, правда?

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

Код в примере выведет строку «новый класс был построен на главной улице».

Основное использование анонимного класса — это случай, когда вам нужно расширить именованный класс.

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

API отражения

Отражение — очень полезная функция, которая была представлена ​​в версии PHP 5.0 и позже стала стандартной в версии 5.3.

Этот API позволяет вам проверять элементы PHP и получать информацию о них во время выполнения.

Для меня,

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

Например, при тестировании значений частного свойства в классах вы можете ввести свойства через API, а затем сделать утверждение в соответствии с тестом.

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

Вот некоторые классы:

Класс отражения
ОтражениеОбъект
ОтражениеМетод
ОтражениеФункция
ОтражениеСвойство
Ниже приведен краткий пример того, как используется ReflectionClass:

$ReflectionObject = new ReflectionClass(“Building”);
print_r($ReflectionObject->getMethods());

В этом примере выводится массив всех методов, доступных в классе Building.

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

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

Синглтон

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

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

99% фреймворков PHP используют их для повышения производительности и качества кода.

Если вы никогда не слышали слово «шаблон дизайна», то это ваш шанс.

Хочу представить вам самый простой из всех.

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

А мэрия? мэру необходимо следить за всеми этими классами, экземплярами, методами и свойствами.

В городе есть только один мэр, и он работает только в одном здании мэрии.

В городе не может быть больше одной ратуши.

Что ж…

Как добавить это правило в программирование?

Синглтон

class cityHall
{
    private static $instance = null;
    private function __construct()
    {
        ...
    }
    public static function getInstance()
    {
        if (self::$instance == null){
            self::$instance = new Singleton();
        }
        return self::$instance;
    }
}

Вот,

это реализация шаблона проектирования Singleton.

Как это работает на самом деле?

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

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

Он проверяет, был ли экземпляр уже создан, если нет, он создает новый экземпляр с помощью команды

self::$instance = new Singleton();

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

В результате в этом случае у вас всегда будет только одна ратуша во всей вашей программе.

Где использовать шаблон проектирования Singleton в реальном случае?

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

и это должно быть одно в действительно долгосрочной перспективе.

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

Это идеальное применение для него.

Вывод

037-6x9-Tablet-Coffee-Wood-Table-COVERVAULT.jpg

Полная версия «Полного руководства по объектно-ориентированному программированию» в универсальном издании доступна в формате Kindle на Amazon..

Если вы следили за всей частью этой статьи, это было настоящее путешествие.

Вы поняли, что объектно-ориентированное программирование или ООП менее сложно, чем может показаться со стороны.

Реальность такова, что мы, веб-разработчики, любим использовать жаргон.

Свойства, параметры, интерфейсы, абстрактные классы, внедрение зависимостей.

Эти слова могут вызвать головную боль очень быстро.

Однако,

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

Какой следующий шаг?

Если вы поняли основную концепцию этой статьи, вы готовы узнать о PHP-фреймворках,

Их очень много, и выбрать одну из них может быть непросто.
блог-пост-часть-2.jpg

Ниже есть действительно глубокое сравнение, которое я написал, что сравните 24 из них, вы больше нигде не найдете ничего похожего.
Руководство по PHP-фреймворкам.

Если вам нравится этот контент, и вы жаждете большего, присоединяйтесь к сообществу Facebook, в котором мы делимся информацией и новостями, как это!


3944-517995.png

Научитесь программировать, приобретите новый навык, устройтесь на новую работу
Какой бы ни была ваша цель — Treehouse поможет вам достичь ее

В настоящее время они делают бесплатное 4-месячное предложение (стоимостью 100 долларов).

Посмотри на это!
(партнерские ссылки)

подписка-Medium.jpg

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *