PHP: Статическое свойство Readonly в классе - PullRequest
7 голосов
/ 07 декабря 2011

Добрый день всем!

Моя проблема: мне нужно перегрузить стандартные get и set для статических переменных в классе ... но такая функциональность не предусмотрена в php ... она была задана в 2008 году и до сих пор не реализована ... То же самое относится и к readonly. ..

Мой вопрос: есть ли способ сделать статическое свойство доступным для чтения извне, но защищенным от модификации?

echo aaa::$qwe; //<--- echoes value of $qwe
aaa::$qwe = '666'; //<--- throws an error because variable is protected from modification

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

Может быть, есть какие-то обходные пути?

Да, я знаю, что могу сделать это как aaa :: Get ('qwe'), но это не хорошо ...

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Непосредственно отвечая на ваш вопрос: Нет, вы не можете пометить обычные свойства как только для чтения.Если вы хотите установить типы примитивов (кроме array), которые никогда не изменятся, вы должны использовать константы

const QWE = '666';

, которые не работают для объектов и массивов.Я вижу два (скажем так) «решения»

  1. Использование Getter

    private $qwe;
    public function getQwe() { return $this->qwe; }
    protected function setQwe($value) { $this->qwe = $value; }
    

    Мне они не очень нравятся («Свойства определяют состояние, а неповедение, как методы ").Вы всегда получаете вдвое больше дополнительных методов, чем свойств, и если у вас есть много свойств, это чрезвычайно подорвет ваш класс.Однако, насколько я понимаю, единственный способ реализовать то, чего вы хотите достичь.

  2. Доверяйте своим пользователям;) Комментируйте свою собственность и говорите что-то вроде «Если вы измените это значение, возможно, что-то сломается, и это твоя собственная вина ".

    /**
     * QWE
     *
     * This property should be treatened as "readonly". If you change this value
     * something scary will happen to you.
     *
     * @readonly
     * @var string
     */
    public $qwe = '666';
    

    Это не здорово, но, по крайней мере, ты можешь сказать:" Я сказал тебе ".

1 голос
/ 07 декабря 2011

Если значение никогда не меняется, вы можете использовать const.В противном случае, нет никакого способа, который удовлетворял бы вашим ограничениям (если не считать перехват вызовов функций в PHP через расширение, но даже в этом случае вам нужно было бы изменить доступ к статическим переменным на вызовы функций; в противном случае вам пришлось бы исправлять PHP).1002 *

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

0 голосов
/ 18 апреля 2013

Это немного проще:

class aaa{
private static $qwe='rty';
public static function qwe() { return self::$qwe; }
}

Оно не позволяет вносить изменения и по-прежнему легко доступно:

aaa::$qwe = 'something'; // fails
echo aaa::qwe(); // success

Я знаю, что это не идеально, но высделать замену всех

aaa::$qwe 

на

aaa::$qwe()
...