Làm cách nào để truyền dữ liệu theo cách hướng đối tượng trong PHP?


11

Tôi thấy rằng ngay cả khi làm việc với khung MVC (ví dụ CodeIgniter), tôi vẫn thường xuyên sử dụng các mảng lồng nhau thay vì các đối tượng.

Điều này không tuân theo sự hiểu biết của tôi về hướng đối tượng tốt. Ví dụ, nếu tôi chuyển mã sang Java thì tôi sẽ không mơ đến việc chuyển các mảng (hoặc vectơ hoặc bất cứ thứ gì) xung quanh như thế.

Tôi đã tự hỏi nếu đây là cách thích hợp để xử lý dữ liệu. Có một lý do tại sao các mảng được truyền xung quanh như thế này trong PHP hoặc tại sao các đối tượng không được sử dụng? Cách tốt nhất để truyền dữ liệu xung quanh là gì?

Câu trả lời:


8

Đừng nhầm lẫn OO của Java với PHP. Java là một ngôn ngữ mô hình duy nhất có nghĩa là nó chỉ thực hiện OO. Mặt khác, PHP là một ngôn ngữ đa mô hình, bạn có thể thực hiện lập trình chức năng hoặc OO hoặc cả hai.

Bây giờ không có việc triển khai OO "xấu". OO của Java không phải là một triển khai dứt khoát mà mọi ngôn ngữ khác nên hoặc phải tuân theo. Có một số khái niệm dứt khoát và cả hai ngôn ngữ đều thực hiện chúng theo cách riêng của chúng (Java từ đầu, PHP kể từ phiên bản 5).

Vì vậy, để trả lời câu hỏi của bạn: CI làm gì và bạn đang làm gì với nó là đúng trong thế giới PHP. Các mảng của PHP là một trong những cấu trúc linh hoạt và hữu ích nhất của nó và thực sự là một điều tốt khi sử dụng các mảng trên các đối tượng khi dữ liệu của bạn chỉ là thông tin (không mang theo logic với chúng). Mã OO đầy đủ không giống với "mã OO".

Nếu bạn đang bắt đầu với PHP, hãy sử dụng Java làm tài liệu tham khảo cho các thực tiễn OO tốt nhưng không giới hạn hiểu biết của bạn về PHP vì điều "Java làm khác đi". Bạn thực sự có thể làm hỏng cả hai, mô hình sẽ không cứu bạn nếu bạn không có được các khái niệm.

Nếu trong bất kỳ trường hợp nào bạn thấy Java nhiều hơn theo ý thích của bạn (như một sở thích cá nhân), hãy kiểm tra Ruby để phát triển web, chúng có liên quan chặt chẽ hơn một chút.


Tại sao chúng ta không nên nhầm lẫn Java OO với PHP OO? Chúng khá giống nhau, ngoại trừ việc PHP có kiểu dữ liệu băm / mảng riêng.
Martin Wickman

Việc thực hiện khá giống nhau. Tôi đã đề cập đến cách chúng được sử dụng trong cả hai ngôn ngữ.
yannis

Tôi có một vấn đề trong OOP. Tôi muốn tạo thiết kế OOP cho một ứng dụng (cơ sở PHP), trong đó một đối tượng sẽ phụ thuộc vào các đối tượng khác. Làm thế nào để tôi xử lý điều này trong PHP? Xin hãy giúp tôi ...
Imran Khan

Ví dụ Kịch bản: Đối tượng khách sạn có đối tượng Phòng, trong đó đối tượng phòng phải có Đối tượng ngày ... và đối tượng Ngày có giá cho loại người. Bây giờ làm thế nào để xử lý loại kịch bản này trong PHP bằng cơ sở OOP (vì có dữ liệu lớn cần xử lý ở mỗi cấp).
Imran Khan

@Walter tôi đang chờ phản hồi của bạn .... Xin hãy giúp tôi.
Imran Khan

2

Sử dụng các đối tượng thay vì mảng chỉ vì các đối tượng không phải là mô hình OO, đó chỉ là sở thích cá nhân :)

Các đối tượng cung cấp hoàn thành mã tiện dụng trong IDE, giao diện (gợi ý kiểu) và kế thừa có thể được sử dụng.

Nếu bạn muốn sử dụng các đối tượng thay vì mảng vì bạn thấy bất kỳ lợi ích nào - hãy sử dụng chúng, nhưng nếu bạn muốn sử dụng chúng chỉ vì đó là các đối tượng - đừng lãng phí thời gian của bạn để tái cấu trúc này :)


"Các đối tượng sử dụng giống như các mảng sẽ chiếm nhiều bộ nhớ và CPU hơn. " Điều này không (luôn luôn) đúng. Một đối tượng chứa cùng một lượng dữ liệu với một mảng sẽ chiếm gần như chính xác cùng một lượng bộ nhớ.
yannis

@Yannis Rizos, vâng, các đối tượng thậm chí có thể sử dụng ít bộ nhớ hơn, được chỉnh sửa.
OZ_

Không chỉ là họ có thể sử dụng ít bộ nhớ hơn, mà việc sử dụng bộ nhớ của họ là không liên quan vì nó không đáng kể so với các khía cạnh hiệu suất bộ nhớ khác của hệ thống và lợi ích của việc sử dụng các đối tượng. Nếu chúng ta quan tâm đến việc sử dụng bộ nhớ rất nhiều, chúng ta sẽ không bao giờ sử dụng các đối tượng. Điều chúng tôi quan tâm là các đối tượng cung cấp cho chúng tôi các công cụ tốt hơn để lý giải và xây dựng các hệ thống.
Rein Henrichs

@Rein Henrichs, tôi biết điều đó, cảm ơn. Đó là lý do tại sao tất cả các từ về 'bộ nhớ' đã bị xóa khỏi câu trả lời của tôi. Tôi không cố thực hiện tối ưu hóa ngớ ngẩn, nhưng tôi chắc chắn objects just because they are objectskhông phải là lý do để tái cấu trúc :) Đọc câu trả lời của tôi, không chỉ bình luận.
OZ_

đủ công bằng, tôi nhận xét trước khi chỉnh sửa.
Rein Henrichs

1

Bạn không thực sự truyền dữ liệu xung quanh trong một hệ thống OO - bạn truyền các đối tượng xung quanh. Sự khác biệt là các đối tượng chứa hành vi cũng như dữ liệu. Đó là lý do tại sao họ gọi nó là hướng đối tượng và không hướng dữ liệu.

Miễn là bạn không cần hành vi với dữ liệu của mình, thì các mảng php cũ đơn giản cũng tốt (hoặc xấu, tùy thuộc vào quan điểm của bạn) như các đối tượng giá trị.


0

Tôi nghĩ rằng đây chỉ là một câu hỏi về điều chỉnh - có nhiều triển khai "đối tượng" trong lập trình - Python và Javascript có các thuộc tính rất khác nhau. PHP OO được cho là một bản hack - mảng PHP không phải là "đối tượng" theo nghĩa truyền thống - nhưng chúng phục vụ một mục đích rõ ràng. Trừ khi bạn muốn dữ liệu có BEHAVIOR tùy chỉnh thì tại sao lại sử dụng một đối tượng?

BIÊN TẬP:

re: đối tượng giá trị bất biến

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


Để cung cấp cho dữ liệu một cấu trúc đáng tin cậy. Đúng, tôi có thể xây dựng một hàm tạo ra một định dạng / lồng nhau cụ thể của mảng nhưng ai nói tôi không viết một hàm khác sửa đổi nó một chút và sau đó chuyển nó vào.
Matthew

1
chắc chắn - sau đó bạn sẽ cần một đối tượng để bảo vệ quyền truy cập biến - vì không có tương đương PHP của các bộ dữ liệu Python chẳng hạn. Nhưng bạn đã đến đó - bạn đã xác định được vấn đề, bạn chỉ cần sử dụng các cấu trúc có sẵn cho ngôn ngữ ... hoặc chỉ cần học cách sống với "những điều kỳ quặc". Tôi đã thêm một liên kết đến bài viết ban đầu của tôi có một cuộc thảo luận thú vị về vấn đề này.
sunwukung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.