Protected php что это
PHP область видимости
В этой части учебника, вы наконец узнаете что такое в PHP private, protected и public, пожалуй, это одна из важнейших тем в ООП, особенно она пригодится когда будем изучать наследование.
Что такое область видимости:
Область видимости, это значения для обозначения доступа свойств или методов другим классам или что можно вызвать и использовать вне родного класса.
Нужны они для безопасности и чтобы не ломать класс изменениями важных компонентов.
Тип видимости пишется в начали перед каждым свойством и методов.
public:
Это пожалуй самое простое и понятное тип области видимости, оно даёт полный доступ к свойству и методы, из любой точки программы, собственно говоря, мы его везде писали то бы иметь доступ к свойствам из любой точки программы.
Так как, мы его везде писали, я больше нечего про него не буду писать, потому что, на мой взгляд и так с ним всё понятно.
private:
Вот этот тип уже не много по интереснее, он просто запрещает везде использование свойства или метода, кроме как внутри класса и объекта.
В этой программе я сделал имя публичным, а фамилию приватным, вот что получилось.
Как видите, всё нормально и конструктор тоже нормально выводится.
Обычно так и делается, свойства приватные ( private ), а методы публичные и если надо получить свойство вне класса, то используется для этого метод, который возвращает свойство.
protected:
Это пожалуй самый интересный тип, так как он приватный, но более точный, то есть, он как приватный нельзя использовать вне своего класса выводит ошибку и в наследованном классе тоже, тогда как обычный приватный не выводит ошибку.
Пока что, про protected особо нечего сказать, про него вы подробно узнаете в следующей части, там будет рассказываться про наследование.
Вывод:
Как видите в PHP private, protected и public, это область видимости свойства или метода, эта была не большая часть, так как, практически не чего сказать про это, но в следующей части ещё раз затроним эту тему.
Модификаторы доступа PHP
До этого момента мы явно объявляли все свойства как public (общедоступные). И такой тип доступа задан по умолчанию для всех методов. В этом уроке мы узнаем, как ограничить внутренний доступ к нашим классам с помощью модификаторов доступа private, protected и public.
Модификаторы доступа в PHP
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
Пример
Результат выполнения кода:
Как получить доступ к свойству private?
Мы увидели, что у нас нет доступа к private (приватным) свойствам извне класса, но нам все равно нужно каким-то образом установить и получить значения свойств. Для взаимодействия с приватными свойствами мы используем публичные (public) методы, потому что они могут взаимодействовать как с кодом за пределами области действия класса, так и с кодом внутри класса. Публичные методы, которые могут взаимодействовать таким образом, обычно делятся на два типа:
Пример
Результат выполнения кода:
Зачем нужны модификаторы доступа?
Нам нужны модификаторы доступа, чтобы ограничить возможность вносить изменения в методы и свойства извне классов. Как только мы определяем свойство или метод как приватные, только методы, находящиеся внутри класса, смогут приближаться к ним. Итак, чтобы взаимодействовать с приватными методами и свойствами, нам необходимо предоставить публичные методы. Внутри этих методов мы можем составить такую логику, которая сможет проверять и ограничивать данные, поступающие извне класса.
Пример
Результат выполнения кода:
Заключение
Модификатор protected подробнее рассмотрим в следуюих уроках.
PHP наследование
В этой части учебника мы разберём PHP наследование классов, пожалуй самую важную тему в ООП, да и вообще в программирование в целом, также здесь расскажу как наследовать из нескольких классов.
Что такое наследование в ООП:
Уже по названию можно понять что это концепция ООП, которая означает возможность наследовать свойства и методы одного класса, другим.
Этот принцип очень часто используется в программирование, поэтому, его обязательно стоит изучить и научится с ним работать.
Для чего нужно наследование:
Они используются в паттерном проектирование, если грубо говоря, это когда есть шаблон класс, в котором есть какие-то базовые компоненты для работы программы, вы можете его наследовать и модифицировать как вам надо, такой подход используют все WEB фреймворки.
Если вы не знаете что такое фреймворк, то прочитайте эту статью:
«Зачем нужен фреймворк и что это вообще такое»
Наследование в PHP:
Как видите всё работает, но давайте разберём код подробнее, в начале идёт класс User, мы его разбирали в прошлых частях.
Больше, нечего нового в этой программе нет, думаю всё понятно, если же нет, то пишите комментарии.
Область видимости:
В прошлой части мы уже изучали область видимости, теперь пришло время показать как это работает с наследованием.
Приватные классы. Сокрытие в php
В php как и в большинстве других ООП языков существуют модификаторы видимости. Это ключевые слова public, protected и private. Но они применимы исключительно к свойствам, методам или константам. Данные модификаторы тесно связаны с возможностью инкапсуляции данных. Стоит заметить, что в таких языках как java, C#, go (https://golang.org/doc/go1.4#internalpackages), ruby (https://habr.com/post/419969/), crystal (https://crystal-lang.org/reference/syntax_and_semantics/visibility.html) есть возможность ограничивать область видимость пакетов (packages) или классов\типов. В php нет возможности ограничивать область видимости для классов — любой подключенный класс доступен из любого другого класса. Однако можно эмулировать данную возможность с применением нескольких трюков.
Для чего вообще может понадобиться сокрытие на уровне классов:
Отдельно можно выделить разбиение «больших» классов на мелкие объекты. Хорошей практикой считается ограничивать сложность (и количество строк) как отдельных методов так и классов. Количество строк тут идёт как один из маркеров, что метод класса или сам класс берёт на себя лишнию ответственность. При рефакторинге public метода мы выносим его части в private\protected методы. Но когда по тем или иным причинам класс разрастается и мы выделяем из него отдельную сущность, эти самые private\protected классы переносятся в отдельный класс, тем самым мы косвенно открываем доступ к методам, которые ранее были ограничены областью видимости одного класса.
Теперь собственно сами способы эмуляции сокрытия.
На уровне соглашения оформления кода
Используя PHPDoc комментарии можно отметить класс, трэйт или интерфейс как internal (http://docs.phpdoc.org/references/phpdoc/tags/internal.html). При этом некоторые IDE (например PhpStorm) могут понимать такие метки.
Использовать runtime информацию
Во время исполнения кода можно проверить откуда был вызван конструктор класса. Например через метод debug_backtrace (http://php.net/manual/ru/function.debug-backtrace.php) или использовать аналогичный функционал Xdebug для контроля кода в dev\test окружении. Пример оформленного решения есть тут (https://coderwall.com/p/ixvnga/how-emulates-private-class-concept-in-php).
Использовать анонимные классы
Относительно новый функционал в php — анонимные классы (http://php.net/manual/ru/language.oop5.anonymous.php). Описав анонимный класс внутри защищенного метода мы добиваемся его сокрытия. Что бы не городить портянку определения класса внутри функции, можно описать «приватный» класс в отдельном файле как абстрактный, и уже расширять его в определении анонимного класса. Хороший пример использования данного метода есть по этой ссылке (https://markbakeruk.net/2018/06/25/using-php-anonymous-classes-as-package-private-classes/).
Исходя из найденного материала видно, что функционал сокрытия классов в какой то мере востребован (и существует во многих языках), однако практика его использования очень ограничена, возможно отсутствием описанием примеров в различных «best practices», сборников шаблонов и подобных источниках. Что на мой взгляд является довольно странным, что есть акцентирование на сокрытие внутренних методов и свойств объектов, но почти никто не обращает внимание, что более крупные логические куски кода в виде служебных классов библиотек или доменной области остаются в глобальном пространстве видимости.
Когда использовать protected, private, public и static методы?
Есть такая штука в ООП как инкапсуляция. С этого стоит начать и в принципе можно было бы закончить, если бы не static и не protected.
Давайте введем понятие «клиентский код». Это тот код который будет использовать ваш код, ваши объекты. Что он должен знать о реализации ваших классов? Да ничего он знать не должен. Он должен знать только как им пользоваться. Это как раз таки интерфейс и регламентирует. Мол «этот объект позволяет вам брать/сохранять/удалять данные в/из кэша. Клиентский код не знает где кэш находится, есть ли он вообще. да и ему и не нужно.
private
Внутренние методы классов. Те которые не входят в интерфейс но нужны, скажем, для уменьшения дублирования реализации.
protected
Иногда у вас появляется необходимость вынести общую реализацию внутренних методов в базовый какой-то абстрактный класс. Например у вас есть несколько реализаций кеша для одного и того же хранилища или что-либо такое. Тогда вы заводите абстрактный класс, выносите туда всю общую реализацию в protected методах ну и т.д. Придумывать пример лень. Придумайте сами. Суть в том что protected методы желательно использовать только в абстрактных классах (но не как абстрактные методы, хотя всякое может быть) или если вы планируете дать возможность расширять ваш класс (но если честно, это крайне редко бывает).
static
Статические методы, это всяческие методы хелперы. Например в языках типа Java есть такое понятие как именованные конструкторы. Мол когда для конструирования объектов нужно много данных переделать или что-то еще, для удобства заводят статический метод какой а в нем уже реализуют какую-то логику. Желательно вообще что бы статический метод не содержал много логики, но. всякое бывает. Вообще тут стоит еще поподробнее почитать о том как себя ведут статические методы и свойства, в чем их особенность и т.д. Попробуйте тот же сингелтон сделать к примеру.
Вот. Возможно человеки вроде FanatPHP разгромят мой ответ, или дополнят его.
Так же если вам хочется научиться правильно составлять интерфейсы классов, следует почитать про low coupling и high cohesion. Эти два принципа должны заставить вас соблюдать баланс и держать в интерфейсе класса только то, что там должно быть. Так же к вопросу о наследовании можно подключить принцип подстановки Барбары Лисков. Даже на той же википедии почитайте. А там если станет интересно в принципе можно поискать интересные материалы по GRASP и SOLID.