2011-07-15 6 views
80

Я много работаю в WordPress, и я заметил, что гораздо больше функций возвращают объекты, чем массивы. Результаты базы данных возвращаются как объекты, если вы специально не запрашиваете массив. Ошибки возвращаются как объекты. Вне WordPress большинство API-интерфейсов предоставляют вам объект вместо массива.Зачем возвращать объект вместо массива?

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

Я - программист на PHP. У меня степень либерального искусства. Так что простите меня, если я упустил фундаментальный аспект информатики. ;)

+5

Мне это интересно в отношении * недостатков * объектов, таких как невозможность использовать функции 'count()' или 'array _ *()' на них (по крайней мере, в отношении сохранения/возврата ключа => данные значения). Никто, кажется, не упоминает об этом, или я чего-то не хватает? –

+7

Объекты могут быть сделаны счетными и итерабельными, реализуя интерфейсы счетчика или итератора. Проверьте также http://www.php.net/manual/en/book.spl.php. – simshaun

+0

Если SPL установлен и вы реализуете интерфейс, счетный для вашего класса объектов, то вы можете вызвать 'count()' на объект. – Nobody

ответ

2

Как правило, это не связано с соображениями производительности. Как правило, объекты стоят больше, чем массивы.

Для многих API-интерфейсов это, вероятно, связано с объектами, предоставляющими другие функции, помимо механизма хранения. В противном случае это вопрос предпочтения, и нет никакой выгоды для возвращения объекта и массива.

+0

В PHP5 разница в производительности между массивами и объектами незначительна. –

4

Объекты гораздо мощнее, чем массивы. Каждый объект как экземпляр класса может иметь присоединенные функции. Если у вас есть данные, требующие обработки, вам нужна функция, которая выполняет обработку. С помощью массива вам придется вызывать эту функцию на этом массиве и, следовательно, связывать логику с данными. С объектом эта ассоциация уже выполнена, и вам больше не нужно ее заботиться.

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

+0

Wordpress возвращает объекты класса 'StdClass'. Эти объекты не имеют ничего общего с тем, что вы выделяете. У них нет функций, например, и у них нет наследования. А в случае Wordpress все переменные класса являются общедоступными. – hakre

+0

Да, это правда. Я думаю, что в этом случае это, как утверждают другие, просто зависит от того, что вы предпочитаете. Я не в Wordpress, но, вероятно, они инкапсулируют все вызовы базы данных и поэтому не могут предоставить какой-либо специализированный класс для возврата. Но мой ответ был в целом, и я думаю, что подобные соображения были сделаны создателями ... Или они просто бросили монету. – Nobody

+0

Они просто используют вспомогательный класс базы данных, который возвращает объекты 'stdClass' по умолчанию, так как ca. 8 лет. Если вы хотите получить массив, вам нужно установить необязательный параметр для его получения. – hakre

4
  1. код выглядит кулер таким образом
  2. объекты пройти по ссылке
  3. объектов являются более сильными типизированными затем массивами, следовательно, LEES Пронь к ошибкам (или дать вам осмысленное сообщение об ошибке при попытке использовать не- существующий элемент)
  4. всех ид сегодня имеет автозаполнение, поэтому при работе с определенными объектами, среда делает много для вас и ускоряет вещи
  5. Easilly инкапсулируют логику и данные в том же поле, где с массивов, вы храните данных в массиве, а затем использовать набор различных функций для его обработки.
  6. Наследование, если бы вы иметь подобный массив с почти, но не аналогичной функциональностью, вы должны дублировать больше кода, то, если вы хотите сделать это с объектами

Вероятно, некоторые больше причин, я думал о

+0

«# Объекты проходят по ссылке»: Это неправильно. Объекты не передаются в качестве ссылки на переменную PHP. Они никогда этого не делали. – hakre

+0

@hakre - вы на php4? или, пожалуйста, уточните, что вы имеете в виду. –

+0

Хорошо, что Wordpress не был PHP 4 до недавнего времени, но в PHP 4 или PHP 5 объекты не передавались в качестве ссылки: * «Один из ключевых моментов ООП PHP5, который часто упоминается, заключается в том, что« объекты передаются по ссылкам по умолчанию ".Это не совсем так. Этот раздел исправляет эту общую мысль с использованием некоторых примеров." * [Объекты и ссылки] (http://www.php.net/manual/en/language.oop5.references.php) – hakre

3

Есть несколько причин, чтобы вернуть объекты:

  1. Пишущие $myObject->property требует меньше «накладных» символов, чем $myArray['element']

  2. Объект может возвращать данные и функциональные возможности; массивы могут содержать только данные.

  3. Включение цепочки: $myobject->getData()->parseData()->toXML();

  4. Легче кодирования: IDE автодополнение может обеспечить метод и свойство подсказки для объекта.

С точки зрения производительности, массивы часто бывают быстрее объектов. В дополнение к производительности, есть несколько причин, чтобы использовать массивы:

  1. функциональные возможности, обеспечиваемые массива _ семейства *() функций может уменьшить объем кодирования необходимо в некоторых случаях.

  2. Операции, такие как count() и foreach(), могут выполняться на массивах. Объекты не предлагают этого (если они не реализуют Iterator или Countable).

1

Большинство объектов времени так же быстро, если не быстрее, чем массивы, в PHP нет заметной разницы. основная причина в том, что объекты более мощные, чем массивы. Программное обеспечение, ориентированное на объекты, позволяет создавать объекты и хранить не только данные, но и функциональность в них, например, в PHP. Класс MySQLi позволяет вам иметь объект базы данных, с которым вы можете манипулировать, используя множество встроенных функций, а не процедурный подход.

Таким образом, главная причина в том, что ООП - отличная парадигма. Я написал статью о том, почему использование ООП является хорошей идеей и объясняет концепцию, вы можете посмотреть здесь: http://tomsbigbox.com/an-introduction-to-oop/

В качестве второстепенного плюса вы также вводите меньше данных для получения данных из объекта - $ test-> data лучше, чем $ test ['data'].

2

Массив - это всего лишь индекс значений. В то время как объект содержит методы, которые могут генерировать результат для вас. Конечно, иногда вы можете напрямую обращаться к значениям объектов, но «правильный способ сделать это» - это доступ к методам объектов (функция, действующая на значения этого объекта).

$obj = new MyObject; 
$obj->getName(); // this calls a method (function), so it can decide what to return based on conditions or other criteria 

$array['name']; // this is just the string "name". there is no logic to it. 

Иногда вы обращаетесь к объектам переменных непосредственно, это, как правило, с неодобрением, но это случается довольно часто до сих пор.

$obj->name; // accessing the string "name" ... not really different from an array in this case. 

Однако, считают, что класс MyObject не имеет переменную с именем «имя», но вместо этого имеет first_name и last_name переменную.

$obj->getName(); // this would return first_name and last_name joined. 
$obj->name; // would fail... 
$obj->first_name; 
$obj->last_name; // would be accessing the variables of that object directly. 

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

58

Таковы причины, почему я предпочитаю объекты в целом:

  • Объекты содержат не только данные, но и функциональность.
  • Объекты имеют (в большинстве случаев) предопределенную структуру. Это очень полезно для проектирования API. Кроме того, вы можете устанавливать свойства как общедоступные, защищенные или частные.
  • объекты лучше подходят объектно-ориентированное развитие.
  • В большинстве случаев автообработка IDE работает только для объектов.

Вот что-то читать:

+4

+1, хорошая коллекция ссылок. – hakre

+1

первая ссылка, кажется, не годится? Я имею в виду, что он работает, но подходит к другому aritcle – Geo

5

Мой вопрос, почему они (Wordpress) использовать объекты вместо массивов?

Это действительно хороший вопрос и нелегкий ответ. Я могу только предположить, что в Wordpress часто используется объект stdClass, потому что они используют класс базы данных, который по умолчанию возвращает записи как объект stdClass. Они привыкли к этому (8 лет и более), и все. Я не думаю, что за простым фактом гораздо больше внимания.

синтаксический сахар для ассоциативных массивов - Зеев Сураскиabout the standard object начиная с PHP 3

  • stdClass объекты не являются на самом деле лучше, чем массивы. Они почти одинаковы. Это связано с некоторыми историческими причинами языка, а также с объектами stdClass, которые действительно ограничены и фактически являются всего лишь value objects в очень базовом смысле.
  • stdClass объекты хранят значения для своих членов, такие как массив для каждой записи. Вот и все.
  • Только PHP freaks могут создавать объекты stdClass с частными членами. Не так много пользы - если таковые имеются - делаю это.
  • stdClass объекты не имеют никаких методов/функций. Так что не используйте это в Wordpress.
  • По сравнению с array, есть гораздо менее полезные функции для обработки списка или полуструктурированных данных.

Однако, если вы привыкли к массивам, просто отбрасывать:

$array = (array) $object; 

И вы можете получить доступ к данным, ранее будучи объектом, как массив. Или вам это нравится наоборот:

$object = (object) $array; 

Это приведет к потере недействительных имен участников, например номеров. Поэтому немного позаботьтесь.Но я думаю, вы получите большую картину: нет большой разницы, если речь идет о массивах и объектах stdClass.

Связанный:

10

Мой вопрос, почему они используют объекты вместо массивов?

Вероятно, по двум причинам:

  • WordPress является довольно старым
  • массивов быстрее и занимают меньше памяти в большинстве случаев
  • легче сериализировать

Есть причина использования для использования объекта?

Нет, но много хороших других причин, например:

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

OOP! = AOP :)

(например, в Ruby, все является объектом. PHP ранее был языком процедур/сценариев.)

22

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

Давайте рассмотрим несколько примеров.

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

Подумайте о методе API, который возвращает список сообщений WordPress. У этих должностей есть авторы, авторы имеют имена, адрес электронной почты, возможно, даже профили с их биографиями.

Если вы возвращаете все должности в массиве, то придется либо ограничить себя возвращающую массив идентификаторов сообщения:

[233, 41, 204, 111]

или возвращая массивный массив, который выглядит примерно так :

[ title: 'somePost', body: 'blah blah', 'author': ['name': 'billy', 'email': '[email protected]', 'profile': ['interests': ['interest1', 'interest2', ...], 'bio': 'info...']] ] 
[id: '2', .....]] 

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

Второй случай доставит больше информации, чем вам понадобится 90% времени, и будет делать больше работы (особенно если любое из этих полей очень сложно построить).

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

  • Массивы разоблачить больше данных и возможностей, чем планировалось

Вернитесь к примеру массивного массива возвращается. Теперь кто-то, вероятно, может создать приложение, которое выполняет итерацию по каждому значению внутри массива post и печатает его. Если API обновлен, чтобы добавить только один дополнительный элемент в этот пост-массив, тогда код приложения собирается сломаться, так как он будет печатать новое поле, которое, вероятно, не должно. Если порядок элементов в массиве сообщений, возвращаемых API, изменится, это также нарушит код приложения. Поэтому возвращение массива создает всевозможные зависимости, которые объект не создавал.

  • Функциональность

Объект может содержать информацию внутри него, что позволит ему обеспечить полезную функциональность для вас. Например, объект post может быть достаточно умным, чтобы возвращать предыдущие или следующие сообщения. Массив не мог сделать это для вас.

  • Гибкость

Все преимущества объектов, упомянутых выше, помогают создать более гибкую систему.

7

WordPress (и значительное количество других приложений PHP) использует объекты, а не массивы, для концептуальных, а не технических причин.

Объект (даже если это только экземпляр stdClass) является представлением одной вещи. В WordPress это может быть сообщение, комментарий или пользователь. Массив, с другой стороны, представляет собой набор вещей. (Например, список сообщений.)

Исторически сложилось так, что PHP не обладал большой поддержкой объектов, поэтому массивы стали довольно мощными на раннем этапе. (Например, возможность иметь произвольные ключи, а не просто индексироваться с нулевой отметкой.) С поддержкой объектов, доступной в PHP   5, разработчики теперь имеют выбор между использованием массивов или объектов в качестве хранилищ для ключей. Лично я предпочитаю подход WordPress, поскольку мне нравится синтаксическая разница между «сущностями» и «коллекциями», которые предоставляют объекты и массивы.

1

Я не знаком с прессой. Многие ответы здесь показывают, что в силе объектов есть возможность содержать функциональный код. При возврате объекта из вызова функции/API он не должен содержать служебных функций. Просто свойства.

Сила в возвращаемых объектах заключается в том, что все, что находится за API, может измениться без нарушения кода.

Пример: вы получаете массив данных с парами ключ/значение, представляющий столбец базы данных. Если столбец DB будет переименован, ваш код сломается.

0

Он следует принципам бокса и распаковки ООП. Хотя языки, такие как Java и C#, поддерживают это изначально, PHP нет. Однако это может быть достигнуто, в некоторой степени, в PHP, просто не красноречиво, поскольку сам язык не имеет конструкций для его поддержки. Наличие типов полей в PHP может помочь в цепочке, сохраняя все объектно-ориентированное и позволяя вводить тип в сигнатурах метода. Недостаток - это накладные расходы и тот факт, что теперь у вас есть дополнительная проверка, использующая конструкцию. Наличие системы типов также является плюсом при использовании инструментов разработки, которые имеют intellisense или код, например PDT. Вместо того, чтобы использовать метод google/bing/yahoo для этого метода, он существует на объекте, и вы можете использовать этот инструмент, чтобы обеспечить раскрывающийся список.

1

Im работает следующий тест в PHP 5.3.10 (Windows):

for ($i = 0; $i < 1000000; $i++) { 
    $x = array(); 
    $x['a'] = 'a'; 
    $x['b'] = 'b'; 
} 

и

for ($i = 0; $i < 1000000; $i++) { 
    $x = new stdClass; 
    $x->a = 'a'; 
    $x->b = 'b'; 
} 

скопированные из http://atomized.org/2009/02/really-damn-slow-a-look-at-php-objects/comment-page-1/#comment-186961

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

  • Массивы: 100%
  • Объект: 214% - 216% (в 2 раза медленнее).

AKA, объект все еще болезненный медленный. ООП сохраняет порядок вещей, однако его следует использовать осторожно.

Какой Wordpress применяется ?. Ну, оба решения, использует объекты, массивы и объекты & массивы, класс wpdb использует позже (и это сердце Wordpress).

+0

Вы должны увидеть сравнение на PHP 5.4. Производительность объектов выдающаяся, а иногда даже быстрее, чем массивы. –

0

Хотя точки, относящиеся к объектам, больше, чем просто данные, являются действительными, поскольку они обычно являются данными и поведением, существует, по меньшей мере, один шаблон, упомянутый в Martin Fowler's "Patterns of Enterprise Application Architecture", который применяется к этому типу cenario, в котором вы переносите данные из одной системы (приложение за API) и другое (ваше приложение).

Его Data Transfer Object - Объект, который переносит данные между процессами, чтобы уменьшить количество вызовов методов.

Так что если вопрос заключается в том, должны ли API-интерфейсы возвращать DTO или массив, я бы сказал, что если стоимость производительности незначительна, тогда вы должны выбрать опцию, которая является более ремонтопригодной, о которой я бы сказал, является опцией DTO ... но конечно, вы также должны учитывать навыки и культуру команды, которая разрабатывает вашу систему и язык или поддержку IDE для каждого из вариантов.

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