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