Что лучше использовать ассоциативные массивы или объекты?

Discussion in 'PHP' started by Gar|k, 21 Nov 2012.

  1. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Пишу сейчас код для REST API. В одном из примеров реализации увидtл такую штуку...
    Code:
    $retJson=json_decode("{}"); 
    $retJson->msg='lol'; 
    exit(json_encode($retJson));
    - вопрос закономерный... ЧТО лучше ассоциативные массивы или объекты??? Я привык к массивам можно там сделать что-то типа is_array array_key_exist... а с объектами так разве сделаешь?...

    В общем в замешательстве... может я осталый )
     
    _________________________
  2. mironich

    mironich Elder - Старейшина

    Joined:
    27 Feb 2011
    Messages:
    733
    Likes Received:
    73
    Reputations:
    19
    Да проверить соответствие нужного свойства можно, но зачем.. Можно только тип обьект проверить...
     
  3. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Объекты обычно делаются там, где все значения строго определены и не меняются, например в конфигах и т.п., а если хранятся данные, в ассоциативном массиве например, то они так и остаются.

    Пример для 1-го:
    PHP:
    $obj = (object)array('mysql' => json_decode($mysql));
    var_dump($obj->mysql->pass);
    Пример для 2-го:
    PHP:
    $obj = (object)array('UserAgent'  => json_decode($UA));
    var_dump($obj->UserAgent['firefox'][mt_rand(0, (count($obj->UserAgent['firefox'])-1))]);
    PHP:
    $obj json_decode("{}");//Так делать как-то криво
     
    #3 randman, 21 Nov 2012
    Last edited: 21 Nov 2012
  4. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    $obj = json_decode("{}"); // реально криво...
    $obj = new stdClass(); // нормально
     
    _________________________
  5. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    Только массивы, только хардкор.
    Какой смысл создавать объекты, если хватает массивов? Т.е. неужели вам нужны все прелести ООП, полиморфизм, инкапсуляцию для хранения конфигов? Вы уверены?
    Т.е. смысл выделять кучу памяти под объекты, если вы хотите всего лишь хранить сроковые данные? ))))
    Я, конечно, параноик. Но это правда избыточно )
     
    _________________________
  6. Expl0ited

    Expl0ited Members of Antichat

    Joined:
    16 Jul 2010
    Messages:
    1,035
    Likes Received:
    534
    Reputations:
    935
    Я думаю это выбор автора кода, кому как удобней, сподручней.
     
    _________________________
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Знакомый гуру, говорит что порой array_key_exists работает быстрей чем isset.
    Ну и конечно же call_user_func_array быстрей чем $obj->$method (это если вы собрались делать какие либо фабрики...)

    Лично я еще с 3 PHP пользовался массивами... привык.
    Было бы не плохо посмотреть исходники PHP на предмет функций isset, empty. array_key_exist. Надеюсь что ассоциативные массивы это годные хеш таблицы...

    2 XAMEHA, не мог бы написать, что там выводит var_dump ?
     
    _________________________
  8. kolia

    kolia Elder - Старейшина

    Joined:
    11 Oct 2012
    Messages:
    291
    Likes Received:
    399
    Reputations:
    16
    Вы все верно господа подметили, хорошо, что есть такие товарищи как вы. Начинающие хотябы на этом этапе не запутаются в выборе ориентации программирования.
     
  9. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    140
    Reputations:
    4
    думаю что решает технология и проект. drupal юзает массив и процедурное . zend или symfony строго ооп. смотря что ты делашь . зависит от проекта и архитектуры. есть патеры которые оборачивают процедурное в ооп программирование. ты же не скажешь что я буду переписывать весь проект потому что ооп не знаю. или не люблю. так же не скажешь что не буду работать с массивами. говорить что массивы решают имхо бред. есть куча вещей которые в ооп просто решают. магические методы и всякие там патерны проектирования и всякие пре диспатчеры у фрейворков, тот же ORM.к тому же повышается читаемость кода. не думаю что кому то проще читать портянку кода в 1000 строк . а вопросы производительности. лично я считаю что лучше купить еще 1 серв за 2000$ чем потратить 200 000$ но оптимизацию кода который станет работать на 2о% быстрей. но это не я сам придумал. мне это объяснил 10ток людей имеющих опыт в высоконагрузочном программировании . а тебе раз ты начинаешь не надо думать еще о таких вопросах. лет через 5 если не забросишь будешь возвращаться. пока учи все и массивы и ооп.
    А вообще как пишет Макконел в "Совершенный код" надо писать не на языке . а с использованием языка. твои is_array хороший пример программирования на языке. прочти эту книгу и у тебя сразу отпадут вопросы про ооп.
     
    #9 barnaki, 20 Jan 2013
    Last edited: 26 Jan 2013
    1 person likes this.
  10. khvdaiver

    khvdaiver New Member

    Joined:
    29 Oct 2012
    Messages:
    79
    Likes Received:
    2
    Reputations:
    0
    ясно дело, что всё сэйвится виде "длинюющей строки". только строка особого формата, чтоб можно было распарсить в то-то или в то-то. ведь надо как-то с ней потом работать. JSON / XML очень спасают =) в нашем примере юзается JSON. его очень удобно парсить в объект, например (ну, для жаваскрипта это мегаудобно, ибо получаешь готовую коллекцию =))) , либо в массив. как душе пожелается)