Как передать данные объектно-ориентированным способом в PHP?

11

Я обнаружил, что даже при работе с инфраструктурой MVC (например, CodeIgniter) я регулярно прибегаю к передаче вложенных массивов, а не объектов.

Это не следует моему пониманию объектно-ориентированного подхода. Например, если бы я перенес код на Java, я бы не стал мечтать о том, чтобы передавать массивы (или Векторы, или что-то еще) таким образом.

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

Мэтью
источник

Ответы:

8

Не путайте OO Java с PHP. Java является единым языком парадигмы, что означает, что он выполняет только ОО. С другой стороны, PHP - это мультипарадигмальный язык, вы можете либо заниматься функциональным программированием, либо ОО, либо и тем, и другим.

Сейчас нет такой вещи, как «плохая» реализация ОО. ОО Java не является окончательной реализацией, которой должен или должен следовать каждый другой язык. Существуют определенные понятия, и оба языка полностью реализуют их по-своему (Java с самого начала, PHP с 5-й версии).

Итак, чтобы ответить на ваш вопрос: что CI делает и что вы делаете с ним, это правильно в мире PHP. Массивы PHP являются одной из самых гибких и полезных структур, и на самом деле полезно использовать массивы над объектами, когда ваши данные являются просто информацией (не несите с собой логику). Полностью OO-код - это не то же самое, что «только OO-код».

Если вы начинаете с PHP, используйте Java как справочник для хороших ООП, но не ограничивайте свое понимание PHP из-за того, что «Java делает это иначе». Вы можете по-настоящему облажаться, и парадигма не спасет вас, если вы не поймете концепции.

Если в любом случае вам больше нравится Java (в качестве личного предпочтения), загляните в Ruby для веб-разработки, они немного более тесно связаны.

Яннис
источник
Почему мы не должны путать Java OO с PHP OO? Они практически одинаковы, за исключением того, что у PHP есть собственный тип данных массива / хеша.
Мартин Уикман
Реализации очень похожи. Я имел в виду, как они используются на обоих языках.
Яннис
У меня есть проблема в ООП. Я хочу создать дизайн ООП для приложения (база PHP), где один объект будет зависеть от других объектов. Как мне справиться с этим в PHP? Пожалуйста, помогите мне ...
Имран Хан
Пример сценария: Объект Hotel имеет объект Room, где объект Room должен иметь объекты Date ..., а объект Date имеет цены для типов лиц. Теперь, как обработать этот тип сценария в PHP с помощью ООП-базы (потому что есть большие данные, которые требуют обработки на каждом уровне).
Имран Хан
@ Вальтер, я жду твоего ответа ... Пожалуйста, помогите мне.
Имран Хан
2

Использование объектов вместо массивов только потому, что это объекты - не парадигма ОО, это просто личные предпочтения :)

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

Если вы хотите использовать объекты вместо массива, потому что видите какие-то преимущества - используйте их, но если вы хотите использовать их только потому, что это объекты - не тратьте свое время на этот рефакторинг :)

OZ_
источник
« Объекты использования так же , как массивы будут занимать больше памяти и процессора. » Это не (всегда) верно. Объект, содержащий такое же количество данных в массиве, будет занимать почти столько же памяти.
Яннис
@ Яннис Ризос, да, объекты даже могут использовать меньше памяти, отредактировано.
OZ_
Дело не только в том, что они могут использовать меньше памяти, но и в том, что их использование памяти не имеет значения, потому что это тривиально по сравнению с другими аспектами производительности памяти системы и преимуществами использования объектов. Если бы мы так заботились об использовании памяти, мы бы никогда не использовали объекты. Мы заботимся о том, чтобы объекты давали нам лучшие инструменты для размышлений и построения систем.
Рейн Хенрикс
@ Рейн Хенрикс, я знаю это, спасибо. Вот почему все слова о «памяти» были удалены из моего ответа. Я не пытаюсь делать глупую оптимизацию, но я уверен, что objects just because they are objectsэто не повод для рефакторинга :) Читайте мой ответ, а не только комментарии.
OZ_
достаточно справедливо, я прокомментировал перед правками.
Рейн Хенрикс
1

Вы действительно не передаете данные в ОО-системе - вы передаете объекты . Разница в том, что объекты содержат как поведение, так и данные. Вот почему они называют это объектно-ориентированным, а не ориентированным на данные.

Если вам не нужно поведение с вашими данными, то старые массивы php так же хороши (или плохи, в зависимости от вашей точки зрения), как объекты-значения.

Мартин Викман
источник
0

Я думаю, что это просто вопрос настройки - в программировании существует множество реализаций «объектов» - Python и Javascript имеют поразительно разные свойства. PHP OO, возможно, является хаком - PHP массивы не являются «объектами» в традиционном смысле - но они служат очевидной цели. Если вы не хотите, чтобы данные имели пользовательское поведение, зачем использовать объект?

РЕДАКТИРОВАТЬ:

Re: неизменяемые значения объектов

http://bradley-holt.com/2010/09/immutable-value-objects-in-php/

sunwukung
источник
Чтобы дать данные надежную структуру. Да, я могу создать функцию, которая выводит определенный формат / вложенность массива, но кто скажет, что я не пишу другую функцию, которая слегка ее изменяет, а затем передает ее дальше.
Мэтью
1
конечно - тогда вам нужен объект для защиты доступа к переменным - поскольку, к примеру, нет PHP-эквивалентов кортежей Python. Но вот и все - вы определили проблему, вам просто нужно использовать конструкции, доступные для языка ... или просто научиться жить с его "причудами". Я добавил ссылку на свой первый пост, в котором интересно обсудить проблему.
Sunwukung