Intereting Posts
TXT-файл или база данных? Как щелчок кнопки может изменить содержимое раскрывающегося меню? Как получить данные из списка выпадающего списка в таблицу? я хочу остаться в том же модальном диалоговом окне после того, как я нажму «Отправить» Загрузка файла Laravel – расширение php_fileinfo не включено Как остановить выполнение JavaScript, когда Ajax загружает новый контент? Заполнить флажок из массива Исключение Symfony2 при попытке вставить коллекцию форм WordPress htaccess позволяет, отказывать в работе Сравните два массива и список общих записей Как отформатировать электронную почту, с которой Hotmail / Outlook доволен? Как обнаружить повторяющиеся значения в массиве PHP? Javascript, чтобы получить ширину экрана в переменной PHP Как загрузить файл вида из другого представления с помощью Codeigniter БЕЗ необходимости проходить через контроллер? Как ассоциации определяются, когда код испечен в CakePHP

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

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

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

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

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

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

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

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

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

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

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

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

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

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