2009-02-13 4 views
8

я в настоящее время у меня есть переменные класса PHP настроить так:Каков наилучший способ хранения переменных класса в 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 
} 

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

ответ

11

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

Однако, если вам нужно хранить данные в классе конфиденциально, но размер элементов данных неизвестен, вы часто увидите свой второй пример в сочетании с крючками __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

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

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

1

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

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

0

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

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

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

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

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

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

Смежные вопросы