Developers/Object oriented programming in PHP/Methods/ru

Видимость методов

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


 * protected
 * protected методы могут быть доступны со стороны только лишь методов собственного класса и его субклассов. Они относятся к внутренним интерфейсам класса, и их изменение также ведёт к несовместимости (за исключением добавления параметров). Большинство методов, используемых внутри, должны быть объявлены как protected, если их содержимое относительно стабильно. Это отличная возможность разбиения больших методов на кусочки и возможность переназначения только этих кусочков в субклассах и относящейся к ним функциональности.


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

Замечание: помните о стандартах кодирования при именовании методов private и protected (с префиксом подчёркивания).

Смотрите также:


 * http://php.net/manual/en/language.oop5.visibility.php

Статичные методы
Объявленные как static</tt> методы не связаны с конкретным объектом класса, и могут быть выполнены только с использование оператора разрешения контекста ::</tt>. self</tt> (self::myMethod</tt>), parent</tt> (parent::myMethod</tt>) или названия доступного класса (MyClass::myMethod</tt>) также работает с оператором. Статичные методы не могут использовать $this</tt> в своих определениях, так как они не входят в объекты, на которые должно указывать $this</tt>. Они не могут работать с обычными свойствами объектов, но они могут (что обычно и делают) работать со статичными методами.

static</tt> методы по большему счёту используются в шаблоне проектирования фабрики. Класс TestHelper</tt> в lib/mshoplib/tests/</tt> демонстрирует, как это работает. static метод getContext</tt> возвращает объект context, хранимый в static свойстве, помимо того, если объект context еще не существует, то метод создаёт новый:

Метод getContext</tt> используется в модульных тестах для создания нового объекта context для менеджеров тестов. Метод исполняется при помощи оператора разрешения области ::</tt> с префиксом в виде названия класса:

Смотрите также:


 * http://php.net/manual/en/language.oop5.static.php

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

Для параметров можно определить следующие типы: classes, interfaces, array</tt>. Невозможно указать скалярные типы параметров, вроде <tt>int</tt> или <tt>string</tt>.

Все объекты, реализующие <tt>MShop_Context_Item_Interface</tt> воспринимаются конструктором как параметр. <tt>MShop_Context_Item_Default</tt> является одной из таких реализаций, поэтому все объекты этого класса принимаются.

То же самое справедливо для метода <tt>saveItem</tt>, требующего объект типа <tt>MShop_Common_Item_Interface</tt>. Так все реализации этого интерфейса будут восприняты методом. Но этот интерфейс реализуется всеми классами item всех доменов, и, как следствие, все item пройдут тест подсказки типа. Причина, по которой этот общий интерфейс выбран в качестве типа, в том, что методы, общие для всех менеджеров должны иметь идентичные параметры в подписи, так как всеми менеджерами дополняется тот же абстрактный класс и те же интерфейсы реализуются, тем самым они легко контролируются. Чтобы избежать обработки элементов из других доменов, используется простое условие if на принадлежность item (элемента) к нужному типу, в данном случае к <tt>MShop_Product_Item_Interface</tt>.

Смотрите также:


 * http://php.net/manual/en/language.types.php
 * http://php.net/manual/en/language.oop5.typehinting.php

<< Назад: свойства | Далее: объекты >>