Каков наилучший способ хранения переменных класса в PHP? - PullRequest
9 голосов
/ 13 февраля 2009

В настоящее время мои переменные класса PHP настроены так:

class someThing {

    private $cat;
    private $dog;
    private $mouse;
    private $hamster;
    private $zebra;
    private $lion;

    //getters, setters and other methods
}

Но я также видел людей, использующих один массив для хранения всех переменных:

class someThing {

    private $data = array();

    //getters, setters and other methods
}

Что вы используете и почему? Каковы преимущества и недостатки каждого?

Ответы [ 5 ]

11 голосов
/ 13 февраля 2009

Как правило, первое лучше по причинам, о которых уже говорили другие люди.

Однако, если вам нужно хранить данные в классе в частном порядке, но след членов данных неизвестен, вы часто будете видеть ваш второй пример в сочетании с хуками __get () __set (), чтобы скрыть, что они хранятся в частном порядке.

class someThing {

    private $data = array();

    public function __get( $property )
    {
        if ( isset( $this->data[$property] ) )
        {
            return $this->data[$property];
        }
        return null;
    }

    public function __set( $property, $value )
    {
        $this->data[$property] = $value;
    }
}

Тогда объекты этого класса можно использовать как экземпляр stdClass, только на самом деле ни один из заданных вами членов не является публичным

$o = new someThing()
$o->cow = 'moo';
$o->dog = 'woof';
// etc

Этот метод имеет свои применения, но имейте в виду, что __get () и __set () примерно в 10-12 раз медленнее, чем непосредственная установка открытых свойств.

6 голосов
/ 13 февраля 2009

Если вы используете private $data;, у вас там просто непроницаемый блок данных ... Явное их утверждение значительно облегчит вашу жизнь, если вы поймете, как работает класс.

Другое соображение, если вы используете IDE с автозаполнением - это не будет работать со вторым методом.

1 голос
/ 13 февраля 2009
  • Используйте первый метод, когда вы знаете, что вам нужна эта переменная.
  • Используйте второй метод (массив переменных), когда вам нужны динамические переменные.

Вы можете объединить эти 2 метода, чтобы некоторые переменные были жестко закодированы в вашем классе, а другие - динамическими. Жестко закодированные переменные будут иметь преимущество по сравнению с магическими методами.

1 голос
/ 13 февраля 2009

Если код повторяется, массивы и (foreach) циклы очищают вещи. Вам необходимо решить, является ли концепция «животного» в вашем коде повторяющейся или нет, или же код должен вникнуть в уникальность каждого члена.

Если мне придется повторяться более одного раза, я повторяю петлю.

0 голосов
/ 13 февраля 2009

Я предпочитаю первый метод по нескольким причинам:

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

Кроме того, как примечание, я почти всегда выбираю защищенный, а не частный, если у меня нет особой причины сделать его личным.

Единственный раз, когда я, вероятно, воспользовался бы вторым методом, был, если бы я хранил коллекцию многих вещей одного вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...