Jak przekazać dane w sposób zorientowany obiektowo w PHP?

11

Uważam, że nawet podczas pracy ze strukturą MVC (np. CodeIgniter) regularnie uciekam się do przekazywania zagnieżdżonych tablic zamiast obiektów.

To nie podąża za moim rozumieniem zorientowanego obiektowo. Na przykład, jeśli miałbym przenieść kod do Javy, nie marzyłbym o przekazywaniu tablic (lub wektorów lub cokolwiek) w ten sposób.

Zastanawiałem się, czy jest to odpowiedni sposób obsługi danych. Czy istnieje powód, dla którego tablice są przekazywane w PHP w ten sposób lub dlaczego obiekty nie są używane? Jaki jest najlepszy sposób przekazywania danych?

Mateusz
źródło

Odpowiedzi:

8

Nie myl OO Javy z PHP. Java jest jednym językiem paradygmatu, co oznacza, że ​​obsługuje tylko OO. Z drugiej strony PHP jest językiem o wielu paradygmatach, możesz albo programować funkcjonalnie, albo OO, albo jedno i drugie.

Teraz nie ma czegoś takiego jak „zła” implementacja OO. OO Javy nie jest ostateczną implementacją, której powinien przestrzegać każdy inny język. Istnieją pewne definitywne koncepcje, a oba języki w pełni implementują je na swój sposób (Java od samego początku, PHP od wersji 5).

Tak więc, aby odpowiedzieć na twoje pytanie: co robi CI i co z tym robisz, jest właściwe w świecie PHP. Macierze PHP są jedną z najbardziej elastycznych i użytecznych struktur i właściwie dobrze jest używać tablic nad obiektami, gdy dane są tylko informacją (nie loguj się nimi). W pełni kod OO to nie to samo, co „tylko kod OO”.

Jeśli zaczynasz od PHP, używaj Javy jako odniesienia do dobrych praktyk OO, ale nie ograniczaj swojego rozumienia PHP z powodu „Java robi to inaczej”. Możesz naprawdę zepsuć oba, paradygmat cię nie uratuje, jeśli nie zrozumiesz pojęć.

Jeśli w każdym razie uważasz, że Java bardziej Ci się podoba (jako osobistą preferencję), sprawdź Ruby w celu tworzenia stron internetowych, są one nieco bliżej powiązane.

Yannis
źródło
Dlaczego nie powinniśmy mylić Java OO z PHP OO? Są prawie takie same, z tym wyjątkiem, że PHP ma rodzimy typ danych typu tablica / skrót.
Martin Wickman
Wdrożenia są dość podobne. Mówiłem o tym, jak są one używane w obu językach.
yannis
Mam problem w OOP. Chcę stworzyć projekt OOP dla aplikacji (baza PHP), w której jeden obiekt będzie zależał od innych obiektów. Jak sobie z tym poradzić w PHP? proszę pomóż mi ...
Imran Khan
Przykładowy scenariusz: Obiekt hotelu ma obiekt pokoju, w którym obiekt pokoju musi mieć obiekty Data ... a obiekt Data ma ceny dla typów osób. Teraz, jak poradzić sobie z tego typu scenariuszem w PHP według bazy OOP (ponieważ istnieją duże dane, które wymagają przetworzenia na każdym poziomie).
Imran Khan
@ Walter Czekam na twoją odpowiedź .... proszę pomóż mi.
Imran Khan
2

Wykorzystuje obiekty zamiast tablic tylko dlatego, że obiekty nie są paradygmatem OO, to tylko osobiste preferencje :)

Obiekty umożliwiają wygodne uzupełnianie kodu w IDE, można używać interfejsów (podpowiedzi typu) i dziedziczenia.

Jeśli chcesz używać obiektów zamiast tablicy, ponieważ widzisz jakieś korzyści - używaj ich, ale jeśli chcesz ich używać tylko dlatego, że są obiektami - nie marnuj czasu na refaktoryzację :)

OZ_
źródło
obiekty użycia, podobnie jak tablice, zajmują więcej pamięci i procesora. ” Nie jest to (zawsze) prawda. Obiekt przechowujący taką samą ilość danych w tablicy zajmuje prawie dokładnie taką samą ilość pamięci.
yannis
@ Yannis Rizos, tak, edytowane obiekty mogą nawet zużywać mniej pamięci.
OZ_
Nie chodzi tylko o to, że mogą zużywać mniej pamięci, ale o to, że ich użycie pamięci jest nieistotne, ponieważ jest banalne w porównaniu z innymi aspektami wydajności pamięci systemu i korzyściami wynikającymi z używania obiektów. Gdybyśmy tak bardzo dbali o wykorzystanie pamięci, nigdy nie używalibyśmy obiektów. Dbamy o to, aby obiekty dawały nam lepsze narzędzia do rozumowania i konstruowania systemów.
Rein Henrichs
@ Rein Henrichs, wiem o tym, dzięki. Dlatego wszystkie słowa o „pamięci” zostały usunięte z mojej odpowiedzi. Nie próbuję robić głupich optymalizacji, ale jestem pewien, że objects just because they are objectsnie jest to powód do refaktoryzacji :) Przeczytaj moją odpowiedź, nie tylko komentarze.
OZ_
uczciwie, skomentowałem przed edycjami.
Rein Henrichs
1

Tak naprawdę nie przekazujesz danych w systemie OO - przekazujesz obiekty . Różnica polega na tym, że obiekty zawierają zarówno zachowanie, jak i dane. Dlatego nazywają to zorientowaniem obiektowym, a nie zorientowanym na dane.

Tak długo, jak nie potrzebujesz zachowania z danymi, zwykłe stare tablice php są tak samo dobre (lub złe, w zależności od twojego punktu widzenia), jak obiekty wartości.

Martin Wickman
źródło
0

Myślę, że to tylko kwestia dostosowania - w programowaniu jest wiele implementacji „obiektów” - Python i JavaScript mają uderzająco różne właściwości. PHP OO jest prawdopodobnie włamaniem - tablice PHP nie są „obiektami” w tradycyjnym znaczeniu - ale służą oczywistemu celowi. Jeśli nie chcesz, aby dane miały niestandardowe ZACHOWANIE, to po co używać obiektu?

EDYTOWAĆ:

re: niezmienne obiekty wartości

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

sunwukung
źródło
Aby zapewnić wiarygodną strukturę danych. Tak, mogę zbudować funkcję, która generuje określony format / zagnieżdżenie tablicy, ale kto powiedziałby, że nie piszę innej funkcji, która nieznacznie ją modyfikuje, a następnie przekazuje.
Matthew
1
jasne - wtedy potrzebujesz obiektu do ochrony dostępu do zmiennych - ponieważ nie ma na przykład odpowiedników krotek Pythona w PHP. Ale proszę bardzo - zdefiniowałeś problem, musisz po prostu użyć dostępnych w języku konstrukcji… lub po prostu nauczyć się żyć z jego „dziwactwami”. Dodałem link do mojego początkowego postu, który zawiera interesującą dyskusję na temat problemu.
sunwukung