Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Big-Shark
Last active November 7, 2016 22:57
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Big-Shark/9051af654ddd5fa3364e to your computer and use it in GitHub Desktop.
Save Big-Shark/9051af654ddd5fa3364e to your computer and use it in GitHub Desktop.
Как надо и как не надо использовать массивы в php в примерах

Как надо и как не надо использовать массивы в php в примерах

Давайте начнем с вопроса, а что же такое массивы в php, и зачем они нужны

Массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хэш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стэк, очередь и, возможно, что-то еще. Так как значением массива может быть другой массив PHP, можно также создавать деревья и многомерные массивы.

Источник: http://www.php.net/manual/ru/language.types.array.php

Вот какой большой список возможностей, а давайте посмотрим что по этом поводу говорит Википедия

Массив — набор однотипных компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам).

В ряде языков программирования, например, Лисп, JavaScript, PHP, Ruby применяются также ассоциативные массивы (или хэш-массивы), в которых элементы не обязательно являются однотипными, а доступ к ним не обязательно осуществляется по индексу.

Источник: http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

Вот это уже интересно, получается у нас в PHP представлено 2 совершенно разных типа массивов, первое это обычный массив с однотипными элементами, и второе этот тот массив что используется в php, его я буду называть ассоциативные

А теперь давайте приступим к тому, почему массивы это хорошо, а ассоциативные массивы не очень хорошо в большинстве случаев.

Плюсы массивов

  • Легкость, только индексы, только хардкор
  • Мы всегда знаем что там за объект ( по факту в пхп это не так, это могло бы быть так, но слишком много проголосовала против arrayof на rfc https://wiki.php.net/rfc/arrayof)

Плюсы ассоциативных массивов

  • Кажущаяся легкость

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

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

Исключение это функции для обработки значений пришедших из вне, $_GET, $_POST и т.д.

  1. Возврат результата в виде ассоциативного массива Мы не знаем что именно получим, у нас нет подсказок в IDE, и нам нужны постоянные проверки на присутствия ключа в массиве.

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

Основные проблемы

  1. Постоянное отсутствие ключей

  2. Сложно искать ошибки

Пример из жизни

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

Если бы мы использовали классы, мы бы узнали об ошибки еще на этапе установки параметров данного класса.

Как можно заменить ассоциативные массивы

Рассмотрим пример из фреймверка codeigniter

Изначальный код

$config['base_url'] = 'http://example.com/index.php/test/page/';
$config['total_rows'] = 200;
$config['per_page'] = 20;

$this->pagination->initialize($config); 

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

Как можно заменить.

$config = new PaginationConfig();
$config->setBaseUrl('http://example.com/index.php/test/page/');
$config->totalRows(200);
$config->perPage(20);

$this->pagination->initialize($config); 

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment