PHP: сеттеры-геттеры и магия, best practices.
Предположим, есть некоторый класс, который выполняет роль простой структуры:
class ProcessStatus
{
protected $command;
protected $pid;
protected $running;
protected $signaled;
...
}
Его дальнейшая судьба неизвестна, может, завтра нужно будет впихнуть кучу логики в геттеры, может, ему вообще нужны были бы публичные свойства, а не геттеры и сеттеры, но в данный момент решено все делать через protected-свойства. Остается вопрос с обеспечением доступа к данным, и тут есть три варианта:
а) Code -> Generate -> Getters & Setters: создать необходимые геттеры и сеттеры простыми методами getX()
/ setX()
. Плюсы: автокомплит в IDE любой убогости, скорость. Минусы: невозможно разом переписать несколько геттеров/сеттеров.
б) написать автоматические геттеры и сеттеры через __call()
и прописать их в @method
в phpdoc-шапке. Плюсы: выглядит, как настоящие геттеры и сеттеры, проще поддерживать, описываются единым списком в шапке. Минусы: возможно, скорость, гибкость меньше, чем при отдельных геттерах и сеттерах, легко забыть описать нужный метод, или, наоборот, описать несуществующий, чтобы по-человечески совместить getMixed()
и isBool()
, надо солидно покорячиться.
в) написать прямой доступ к полям через __set()
или __get()
, прописать аналогично через @property
. Плюсы: как в предыдущем + легко интерполировать в строках. Минусы: опять же, как в предыдущем, выглядит не очень интуитивно - если IDE видит свойство, то почему я не могу присвоить ему значение?
Все три варианта на самом деле отвратительны, но по ряду параноидальных причин мне не импонируют открытые свойства, поэтому приходится выбирать. Мне больше всего импонирует второй с __call()
, но все равно есть чувство отвратного.
Есть ли какие-нибудь гайдлайны по этому вопросу?