PHP - уровни доступа функций класса или как сделать закрытую функцию открытой
- Категория: Код
- – Автор: Игорь (Администратор)
В рамках данной статьи, я хотел бы рассказать о том как можно сделать закрытую функцию открытой в PHP за счет хитрости с уровнями доступа функций класса при наследовании.
Один из неприятных моментов в использовании чужих библиотек и классов является то, что периодически можно столкнуться с тем, что некоторые методы закрытые (например, protected), из-за чего приходится в своих классах писать дополнительные обертки с корявыми названиями или попросту копировать код, чтобы сделать возможным их вызов вне класса (то есть аналог public). Например, такое очень полезно при тестировании, когда необходимо выдать отладочную информацию. Или еще пример - это просто полезные функции, такие как очистка строки от символов и прочее (функции, которые не зависят от контекста и могут пригодится и не только внутри класса).
Проблема тут так же заключается и в том, что частенько вы не можете менять исходные коды, так как при выходе следующей версии библиотеки все ваши "труды" улетят "коту под хвост".
Однако, с этой проблемой можно легко справиться из-за хитрости с уровнями доступа функций при наследовании класса. Чтобы понять, о чем я говорю, попробуем рассмотреть следующий код:
Примечание: В коде представлены и описаны различные вариации с тем, к чему будет приводить тот или иной код, если его раскомментировать.
Открыв страничку с этим кодом мы получим следующий результат вывода:
Как видите, в классе "A" есть функция "someFunc", но она помечена "protected". То есть если создать объект класса "A", то вызвать эту функции извне нельзя. Однако, если определить класс "B", который наследуется от класса "A", и в нем сделать функцию с точно таким же именем "someFunc" (и набором параметров), но пометить ее "public" (то есть открытой), то вызвать такую функцию становится возможным.
При этом важно понимать, что вы по-прежнему можете вызвать исходную функцию "someFunc" через конструкцию "parent", что демонстрируется в вызове функции "testParentAndSelf".
И еще один важный момент. Как вы понимаете, при переопределении функции в момент наследования, все функции класса "A", которые вызывали функцию "someFunc" через "$this" начнут вызывать функцию класса "B". Это видно при вызове функции "testExecSomeFunc". Так вот, чтобы этого избежать достаточно в классе "B" в функции "someFunc" только раскомментировать код "parent::someFunc();" и закомментировать "echo".
Если так сделать, то результат выполнения этого кода станет следующим:
Как видите, после такой вот хитрости, теперь и код самой функции остается не тронутым, и никаких костелей не требуется, и функцию можно без проблем использовать вне класса. То есть если вам нужны какие закрытые функции сделать открытыми, то достаточно написать класс, где будут перечислены эти функции и будет использоваться вызов закрытых функций через "parent".
Что-то вроде:
Если вы знаете еще какие-то хитрости, то смело делитесь ими в комментариях
☕ Понравился обзор? Поделитесь с друзьями!
- PHP - именованные константы (define) плюсы и минусы
- SQL-запросы. Как определить необходимые индексы (для новичков)?
Комментарии / отзывы