Mysql приводит к PHP-массивам или объектам?

Некоторое время я использовал PHP / MySQL , и мне интересно, есть ли какие-либо конкретные преимущества (производительность или нет) для использования mysql_fetch_object() vs mysql_fetch_assoc() / mysql_fetch_array() .

По производительности не имеет значения, что вы используете. Разница в том, что mysql_fetch_object возвращает объект:

 while ($row = mysql_fetch_object($result)) { echo $row->user_id; echo $row->fullname; } 

mysql_fetch_assoc () возвращает ассоциативный массив:

 while ($row = mysql_fetch_assoc($result)) { echo $row["userid"]; echo $row["fullname"]; } 

и mysql_fetch_array () возвращает массив:

 while ($row = mysql_fetch_array($result)) { echo $row[0]; echo $row[1] ; } 

mysql_fetch_array делает ваш код трудным для чтения = кошмар. Вы не можете сразу увидеть, с какими данными связан ваш объект. Это немного быстрее, но если это важно для вас, вы обрабатываете так много данных, что PHP, вероятно, не самый правильный путь.

mysql_fetch_object имеет некоторые недостатки, особенно если вы основываете на нем слой db.

  • Имена столбцов могут быть недействительными идентификаторами PHP, например tax-allowance или user.id если ваш драйвер базы данных дает вам имя столбца, указанное в запросе. Затем вы должны начать использовать {} повсюду.

  • Если вы хотите получить столбец на основе его имени, в какой-то переменной вам нужно будет начать использовать свойства переменной $row->{$column_name} , а синтаксис массива $row[$column_name]

  • Конструкторы не вызываются, если вы можете ожидать, если вы укажете имя класса.

  • Если вы не укажете имя класса, вы получите stdClass , который вряд ли лучше, чем массив.

mysql_fetch_assoc – самый простой из трех, с которым нужно работать, и мне нравится различие, которое это дает в коде между объектами и строками результатов базы данных …

 $object->property=$row['column1']; $object->property=$row[$column_name]; foreach($row as $column_name=>$column_value){...} 

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

Что-то нужно иметь в виду: массивы могут быть легко добавлены в кеш памяти (eaccelerator, XCache, ..), в то время как объекты не могут (они должны быть сериализованы при хранении и неэтериализации при каждом извлечении!).

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

Получение массива с помощью mysql_fetch_array() позволяет выполнить цикл через набор результатов через цикл foreach или цикл for. mysql_fetch_object() не может пройти через цикл for.

Не уверен, что это даже имеет значение, просто подумал, что я бы сказал об этом.

Кроме того, если вы в конечном итоге захотите применить Memcaching к вашим результатам MySQL, вы можете захотеть выбрать массивы. Кажется, безопаснее хранить типы массивов, а не результаты типа объекта.

 while ($Row = mysql_fetch_object($rs)) { // ...do stuff... } 

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

Я думаю, что разница между всеми этими функциями невелика, особенно по сравнению с читаемостью кода.

Если вас беспокоит такая оптимизация, используйте mysql_fetch_row() . Это самый быстрый из-за того, что он не использует ассоциативные массивы (например, $ row [2]), но проще всего сломать его код.

Скоростной, mysql_fetch_object() идентичен mysql_fetch_array() и почти так же быстро, как mysql_fetch_row() .

Кроме того, с помощью mysql_fetch_object() вы сможете получить доступ к данным поля только с соответствующими именами полей.

Я голосую против mysql_fetch_array()

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

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

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