Я много работаю в WordPress и заметил, что гораздо больше функций возвращают объекты, чем массивы. Результаты базы данных возвращаются как объекты, если вы специально не запрашиваете массив. Ошибки возвращаются как объекты. За пределами WordPress большинство API предоставляют объект вместо массива.
У меня вопрос, почему они используют объекты вместо массивов? По большей части это не имеет большого значения, но в некоторых случаях мне сложнее не только обработать объекты, но и осмыслить их. Есть ли причина производительности для использования объекта?
Я программист-самоучка на PHP. У меня есть степень гуманитарных наук. Так что простите меня, если я упускаю фундаментальный аспект информатики. ;)
count()
илиarray_*()
функций на них (по крайней мере, в отношении хранения / возврата данных ключа => значения). Кажется, никто об этом не упоминает, или я что-то упускаю?count()
объект.stdClass
). Я не уверен, что у этого вопроса есть ответ, кроме «Потому что программисты, которые работают в основном с ООП, предпочитают семантику использования объектов»Ответы:
Вот причины, по которым я предпочитаю объекты в целом:
Здесь есть что почитать:
источник
Вероятно, вы не сможете глубоко понять это, пока не проработаете несколько лет над большим программным проектом. Многие новички в области компьютерных наук дадут вам ответ, используя все нужные слова (инкапсуляция, функциональность с данными и ремонтопригодность), но немногие действительно поймут, почему все это хорошо иметь.
Давайте рассмотрим несколько примеров.
Подумайте о методе API, который возвращает список сообщений WordPress. У всех этих сообщений есть авторы, у авторов есть имена, адрес электронной почты, возможно, даже профили с их биографиями.
Если вы возвращаете все сообщения в массиве, вам либо придется ограничиться возвратом массива идентификаторов сообщений:
[233, 41, 204, 111]
или возвращая массивный массив, который выглядит примерно так:
[ title: 'somePost', body: 'blah blah', 'author': ['name': 'billy', 'email': 'bill@bill.com', 'profile': ['interests': ['interest1', 'interest2', ...], 'bio': 'info...']] ] [id: '2', .....]]
Первый случай возврата списка идентификаторов не очень полезен для вас, потому что тогда вам нужно сделать вызов API для каждого идентификатора, чтобы получить некоторую информацию об этом сообщении.
Во втором случае потребуется гораздо больше информации, чем нужно в 90% случаев, и будет выполняться гораздо больше работы (особенно, если какое-либо из этих полей очень сложно создать).
С другой стороны, объект может предоставить вам доступ ко всей необходимой информации, но на самом деле еще не получил эту информацию. Определение значений полей может выполняться лениво (то есть когда значение необходимо, а не заранее) при использовании объекта.
Вернитесь к примеру с возвращаемым массивным массивом. Теперь кто-то, вероятно, может создать приложение, которое перебирает каждое значение внутри массива сообщений и печатает его. Если API обновлен, чтобы добавить только один дополнительный элемент к этому массиву сообщений, тогда код приложения сломается, поскольку он будет печатать какое-то новое поле, которого, вероятно, не должно быть. Если порядок элементов в массиве сообщений, возвращаемых API, изменится, это также нарушит код приложения. Таким образом, возврат массива создает всевозможные зависимости, которые объект не может создать.
Внутри объекта может храниться информация, которая позволяет ему предоставлять вам полезные функции. Например, объект сообщения может быть достаточно умным, чтобы возвращать предыдущие или следующие сообщения. Массив никогда не сможет сделать этого за вас.
Все преимущества упомянутых выше объектов помогают создать более гибкую систему.
источник
Наверное, две причины:
Нет. Но есть много других причин, например:
ООП ! = АОП :)
(Например, в Ruby все является объектом. PHP ранее был процедурным языком / языком сценариев.)
источник
WordPress (и множество других приложений PHP) используют объекты, а не массивы, по концептуальным, а не техническим причинам.
Объект (даже если это всего лишь экземпляр stdClass) является представлением одной вещи. В WordPress это может быть запись, комментарий или пользователь. С другой стороны, массив - это набор вещей. (Например, список сообщений.)
Исторически сложилось так, что PHP не имел хорошей поддержки объектов, поэтому массивы стали довольно мощными на раннем этапе. (Например, возможность иметь произвольные ключи, а не просто нулевая индексация.) Благодаря поддержке объектов, доступной в PHP 5, разработчики теперь могут выбирать между использованием массивов или объектов в качестве хранилищ значений ключей. Лично я предпочитаю подход WordPress, поскольку мне нравится синтаксическая разница между «сущностями» и «коллекциями», которые предоставляют объекты и массивы.
источник
Это действительно хороший вопрос, на который нелегко ответить. Я могу только предположить, что в Wordpress часто используются
stdClass
объекты, потому что они используют класс базы данных, который по умолчанию возвращает записи какstdClass
объект. Привыкли (8 лет и больше) и все. Я не думаю, что за этим простым фактом стоит что-то еще.stdClass
объекты на самом деле не лучше массивов. Они почти такие же. Это по некоторым историческим причинам языка, так какstdClass
объекты действительно ограничены и на самом деле являются лишь своего рода ценными объектами в очень простом смысле.stdClass
объекты хранят значения для своих членов, как массив для каждой записи. Вот и все.stdClass
объекты с закрытыми членами. От этого не будет особой пользы - если таковая вообще есть.stdClass
у объектов нет методов / функций. Так что никакого использования этого в Wordpress.array
, есть гораздо менее полезные функции для работы со списком или полуструктурированными данными.Однако, если вы привыкли к массивам, просто приведите:
$array = (array) $object;
И вы можете получить доступ к данным, ранее являвшимся объектом, в виде массива. Или вам нравится наоборот:
$object = (object) $array;
Что приведет к удалению только недопустимых имен членов, например чисел. Так что будьте осторожны. Но я думаю, вы понимаете общую картину: особой разницы нет, если речь идет о массивах и объектах
stdClass
.Связанный:
источник
Возможно, еще одна причина, о которой я подумал
источник
Объекты намного мощнее, чем могут быть массивы. К каждому объекту как экземпляру класса могут быть прикреплены функции. Если у вас есть данные, которые нужно обработать, вам нужна функция, выполняющая обработку. С массивом вам нужно будет вызвать эту функцию в этом массиве и, следовательно, самостоятельно связать логику с данными. С объектом эта ассоциация уже создана, и вам больше не нужно о ней заботиться.
Также следует учитывать объектно-ориентированный принцип сокрытия информации. Не все, что возвращается или попадает в базу данных, должно быть доступно напрямую.
источник
StdClass
. Эти объекты не имеют ничего общего с тем, что вы выделяете. Например, у них нет функций и нет наследования. А в случае Wordpress все переменные класса общедоступны.stdClass
по умолчанию возвращает объекты, начиная с ок. 8 лет. Если вы хотите получить массив, вам нужно установить необязательный параметр для его получения.Есть несколько причин для возврата объектов:
Написание
$myObject->property
требует меньшего количества "служебных" символов, чем$myArray['element']
Объект может возвращать данные и функциональность; массивы могут содержать только данные.
Включить цепочку:
$myobject->getData()->parseData()->toXML();
Более простое кодирование: автозаполнение IDE может предоставлять подсказки по методам и свойствам для объекта.
С точки зрения производительности массивы часто быстрее, чем объекты. Помимо производительности, есть несколько причин использовать массивы:
Функциональные возможности, предоставляемые семейством функций array _ * (), могут в некоторых случаях сократить объем необходимого кодирования.
Такие операции, как count () и foreach (), могут выполняться с массивами. Объекты этого не предлагают (если они не реализуют Iterator или Countable ).
источник
Обычно этого не происходит из-за соображений производительности. Обычно объекты стоят больше, чем массивы.
Для многих API это, вероятно, связано с объектами, обеспечивающими другие функции, помимо механизма хранения. В противном случае это вопрос предпочтений, и на самом деле нет никакой пользы от возврата объекта по сравнению с массивом.
источник
Массив - это просто индекс значений. В то время как объект содержит методы, которые могут генерировать результат за вас. Конечно, иногда вы можете получить доступ к значениям объектов напрямую, но «правильный способ сделать это» - обратиться к методам объектов (функция, работающая со значениями этого объекта).
$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 не имеет переменной с именем 'name', но вместо этого имеет переменные 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.
Это очень простой пример, но вы можете видеть, к чему все идет. Класс предоставляет набор переменных и функций, которые могут работать с этими переменными, и все это внутри автономного логического объекта. Экземпляр этой сущности называется объектом, и он вводит логику и динамические результаты, которых у массива просто нет.
источник
В большинстве случаев объекты работают так же быстро, если не быстрее, чем массивы, в PHP нет заметной разницы. Основная причина в том, что объекты мощнее массивов. Объектно-ориентированное программирование позволяет вам создавать объекты и хранить в них не только данные, но и функциональные возможности, например, в PHP класс MySQLi позволяет вам иметь объект базы данных, которым вы можете манипулировать, используя множество встроенных функций, а не процедурный подход.
Итак, главная причина в том, что ООП - отличная парадигма. Я написал статью о том, почему использование ООП - хорошая идея, и объясняя эту концепцию, вы можете посмотреть здесь: http://tomsbigbox.com/an-introduction-to-oop/
В качестве незначительного плюса вы также вводите меньше, чтобы получить данные от объекта - $ test-> data лучше, чем $ test ['data'].
источник
Я не знаком с прессой слов. Многие ответы здесь предполагают, что сильная сторона объектов - это способность содержать функциональный код. При возврате объекта из вызова функции / API он не должен содержать служебных функций. Просто свойства.
Сила возврата объектов заключается в том, что все, что стоит за API, может измениться без нарушения кода.
Пример: вы получаете массив данных с парами ключ / значение, ключ представляет столбец БД. Если столбец БД будет переименован, ваш код сломается.
источник
Я запускаю следующий тест на 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 раз (для получения среднего значения), затем
AKA, объект все равно мучительно медленный. ООП сохраняет порядок, однако его следует использовать осторожно.
Что Wordpress применяет ?. Что ж, оба решения используют объекты, массивы и объекты и массивы, Class wpdb использует более позднее (и это сердце Wordpress).
источник
Он следует принципу упаковки и распаковки ООП. Хотя такие языки, как Java и C #, поддерживают это изначально, PHP - нет. Однако это может быть реализовано в некоторой степени в PHP, но не очень красноречиво, поскольку сам язык не имеет конструкций для его поддержки. Наличие типов боксов в PHP может помочь в создании цепочек, сохранении всего объектно-ориентированного подхода и позволяет использовать подсказки типов в сигнатурах методов. Обратной стороной являются накладные расходы и тот факт, что теперь у вас есть дополнительная проверка с помощью конструкции «instanceof ». Наличие системы типов также является плюсом при использовании инструментов разработки с поддержкой intellisense или кода, таких как PDT. Вместо того, чтобы искать метод в google / bing / yahoo, он существует для объекта, и вы можете использовать этот инструмент для создания раскрывающегося списка.
источник
Хотя утверждения о том, что объекты являются чем-то большим, чем просто данные, действительны, поскольку они обычно являются данными и поведением, есть по крайней мере один шаблон, упомянутый в «Шаблонах архитектуры корпоративных приложений» Мартина Фаулера, который применим к этому типу cenario, в котором вы переносите данные из одной системы (приложение, стоящее за API) и другой (вашего приложения).
Это объект передачи данных - объект, который переносит данные между процессами, чтобы уменьшить количество вызовов методов.
Итак, если возникает вопрос, должны ли API возвращать DTO или массив, я бы сказал, что если стоимость производительности незначительна, вы должны выбрать вариант, который более удобен в обслуживании, который, я бы сказал, является вариантом DTO ... но, конечно, вы также необходимо учитывать навыки и культуру команды, которая разрабатывает вашу систему, а также поддержку языка или среды IDE для каждого из вариантов.
источник