PHP hướng đối tượng như thế nào? [đóng cửa]


13

Tôi đã có cơ hội có một cuộc trò chuyện thú vị với các đồng nghiệp của mình. Hầu hết trong số họ là kịch bản hành động flash hoặc nhà phát triển Java.

Chúng tôi đã nói về việc php xử lý OOP tốt như thế nào. Tôi đã nói rằng PHP có thể xử lý hầu hết mọi thứ OOP kể từ PHP 5.2 hoặc 5.3. Tôi có lầm không? Tôi không cố gắng để có câu trả lời có / không, nhưng tôi muốn nghe thêm ý kiến ​​từ các nhà phát triển.


Tôi đã trả lời điều đó ở đây
Martin Wickman

12
ngôn ngữ không tệ, lập trình viên là

@Jarrod Roberson: Ngôn ngữ là bẩm sinh, làm sao vậy? Nếu vậy, xin vui lòng tham khảo nghiên cứu hỗ trợ cho tuyên bố này, vì tôi rất thích đọc nó.
sai lầm ngớ ngẩn

4
@Jarrod, có một số ngôn ngữ xấu hợp pháp, đặc biệt khi chúng ở phiên bản đầu tiên. Các phiên bản ban đầu của Actioncript, Javascript, Java và PHP xuất hiện trong tâm trí.
Jordan

2
@JarrodRoberson, vì vậy các lập trình viên đã thiết kế PHP ...
dan_waterworth

Câu trả lời:


34

PHP 5.3 thực sự có hỗ trợ khá tốt cho OOP.

Vấn đề với PHP liên quan đến OOP là, OOP thực sự chỉ được sử dụng ngôn ngữ, trong khi trong các ngôn ngữ như Java và ActionScript, nó là một phần của khái niệm cốt lõi, mặc dù tôi coi cả hai ngôn ngữ OOP xấu là do ngữ nghĩa đối tượng kém của chúng.

Mặc dù ngày nay PHP phần lớn phù hợp với OOP, nhưng vấn đề là:

  1. phần lớn các cơ sở mã ngoài đó (thư viện, khung, mã tùy chỉnh) không được viết trong PHP 5.3
  2. phần lớn API là thủ tục. arrayvẫn là loại quan trọng nhất và được sử dụng nhiều nhất và nó không phải là một đối tượng.
  3. đại đa số các lập trình viên PHP sẽ chỉ gắn bó với phong cách thủ tục trong tương lai gần. PHP không quảng bá OOP, trái ngược với Objective-C, ví dụ: Objective-C có C là một tập hợp con đầy đủ và do đó cho phép lập trình thủ tục theo một trong các hình thức thuần túy nhất của nó, nhưng rõ ràng ủng hộ việc sử dụng OOP.

PHP không thể đơn giản là loại bỏ tất cả những thứ cũ. Nếu một PHP 6 được phát hành, nó sẽ ném phần lớn nó ra, có lẽ nó sẽ không được sử dụng. Nó sẽ đánh bại mục đích của nó.
Và PHP đã thất bại trong một tốc độ đủ để dần dần mất giá. Vì vậy, sẽ mất một thời gian cho đến khi nó đạt được sự rõ ràng cần thiết và tính nhất quán mà một ngôn ngữ tốt nên có.

Cá nhân, tôi thực sự không thích PHP, đơn giản vì tất cả hành lý đó, API và mọi thứ.
Tuy nhiên, các khung như Flow3, Symfony, CakePHP và Codeigniter cung cấp một cơ sở vững chắc cho OOP và các mô hình mạnh mẽ khác. Do tính hạn chế của ActionScript và Java, với nỗ lực vừa đủ (một lớp trừu tượng trên các lỗ hổng PHP), PHP có thể ngang bằng hoặc thậm chí vượt trội chúng.

Tóm lại: Không có gì đặc biệt sai với các cơ sở OOP của PHP. Do đó, bạn có thể nói đó không phải là một ngôn ngữ OO tồi . Tuy nhiên, có rất nhiều điều đặc biệt sai với PHP, chẳng hạn như các cơ sở OOP không thực sự được tích hợp , mà chỉ bao gồm , do đó bạn có thể cho rằng đó là ngôn ngữ OO tồi .


4
Vì tò mò, bạn có thể giải thích lý do tại sao bạn nghĩ Java là một OOP xấu không?
dkuntz2

2
Ahem .. Tôi có thể cập nhật câu trả lời của bạn để cụ thể cho Actioncript 3 . Trước đó, Actioncript không được thiết kế thành OO (dựa trên ECMA) và thậm chí Actioncript 2 chỉ đơn giản là một trình bao bọc cho AS1.
Demian Brecht

1
Tôi cũng tò mò tại sao bạn nghĩ Java là ngôn ngữ OOP tồi
starcorn

2
@Dppy Brecht: Douglas Crockford dường như JavaScript tương đối thuyết phục (bất kỳ tập lệnh ECMA nào) là OO: javascript.crockford.com/javascript.html
back2dos

2
Phân biệt cái nào tổng hợp tốt: PHP là đối tượng có khả năng , không hướng đối tượng.
vartec

11

Bạn sẽ thấy rằng " có thể xử lý " không giống như " hỗ trợ ". Ý tôi là, tại nitty-gritties, thậm chí C " có thể xử lý " OOP nếu bạn cấu trúc mã của mình đúng cách. Câu hỏi đặt ra là liệu ngôn ngữ có vượt ra ngoài việc chỉ cho phép OOP khuyến khích nó hay không bằng cách biến OOP thành cách lập trình tự nhiên nhất.

Theo kinh nghiệm (hạn chế) của tôi, các phương ngữ PHP 5.n không làm điều này. Thật quá dễ dàng để thoát khỏi OOP và vào khá nhiều mã thủ tục đơn thuần. (Lưu ý rằng tôi không nghĩ PHP là ngôn ngữ xấu vì lý do này. Có nhiều lý do khiến tôi nghĩ PHP là ngôn ngữ xấu, nhưng hỗ trợ OOP không phải là một trong số đó.))


12
Man, tôi có thể tiếp tục lâu về điều đó, Moon. Đây là một đoạn mã bị lỗi : $e = function_that_returns_an_array()[0];. Đây là những gì bạn phải làm để khắc phục nó : $a = function_that_returns_an_array(); $e = $a[0];. Các ngôn ngữ có cú pháp sẽ không cho phép bạn trực tiếp sử dụng kết quả của một hàm gọi đánh dấu tôi. Ngoài ra, hãy cho tôi biết số nào sau đây là số thập phân : 0246875. (Gợi ý: bạn sẽ không thể tìm ra một cách ngu ngốc để thực hiện từ vựng đó!) PHP chỉ là một sự ngu ngốc của loại ngu ngốc này.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI

6
@Moon Đây là một số bài đọc cho bạn: softwarebashing.org/blog/2009/09/php-the-ultimate-sucktommorris.org/wiki/PHP%20Sucks Có một số vấn đề nghiêm trọng, nhưng rất nhiều trong số đó chỉ là nit hái. Điều tôi thực sự ghét về PHP là văn hóa, đơn giản là nó không chuyên nghiệp hay hàn lâm như các lựa chọn thay thế, cụ thể là ruby ​​và python. Các lựa chọn thay thế đẹp hơn và chúng thu hút các lập trình viên tốt nhất. Ví dụ, cả ruby ​​và python đều có vỏ tương tác, các tính năng chức năng hợp lý và cú pháp rõ ràng. Họ là rất nhiều niềm vui để sử dụng. Bên cạnh thị phần trong chia sẻ lưu trữ web tại sao sử dụng php?
Keyo

8
"Chỉ có hai loại ngôn ngữ: những ngôn ngữ mà mọi người phàn nàn và những ngôn ngữ không ai sử dụng." Bjarne Stroustrup. Suy nghĩ.
Sylverdrag


5
Stroustrup chỉ bực mình vì C ++ là một trong những ngôn ngữ mà mọi người chê bai.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI đúng

8

Thực sự có hai định nghĩa về hướng đối tượng của ngôn ngữ: cách hướng đối tượng được xây dựng theo cú pháp và thư viện chuẩn của chính nó và ảnh hưởng của nó đối với các lập trình viên phần mềm viết cho nó.

Theo định nghĩa đầu tiên, PHP dường như nằm ở cuối danh sách. Mọi người thường trích dẫn các chuỗi và mảng không đối tượng là bằng chứng về điều này. Theo tôi, định nghĩa này không thực sự quan trọng. Bạn luôn có thể bọc nó trong một đối tượng nếu bạn thực sự cần nó, nhưng mọi người không vì họ không. Thông thường, sự khác biệt duy nhất mà nó sẽ làm cho mã là thay đổi function(var)thành var.function(). Cú pháp một mình không thay đổi một cái gì đó từ không OOP sang OOP.

Đối với định nghĩa thứ hai, mọi người quản lý để viết mã hướng đối tượng kém ngay cả trong các ngôn ngữ thực thi mạnh mẽ các cấu trúc đó và những người viết mã hướng đối tượng tốt hầu như không bị ảnh hưởng bởi ngôn ngữ, ngoại trừ bị làm phiền bởi các quirks cú pháp. Nói cách khác, theo kinh nghiệm của tôi, không có ngôn ngữ hướng đối tượng xấu, chỉ có các lập trình viên hướng đối tượng xấu . PHP cũng tốt như bất kỳ ngôn ngữ nào khác trong vấn đề đó.

Có thể một số ngôn ngữ phù hợp hơn cho việc học lập trình hướng đối tượng, nhưng tôi nghĩ điều đó sẽ khác với nhà phát triển. Đối với tôi, nó đã không nhấp cho đến khi tôi đọc cuốn sách lạc đà của Larry Wall về cách perl làm (đã làm?) OOP. Việc phải ban phước rõ ràng cho các tài liệu tham khảo là thuộc về một lớp thực sự khiến tôi chú ý đến việc một thể hiện của một đối tượng thực sự là gì so với các lớp là gì. Một số người ủng hộ cách tiếp cận mọi đối tượng mọi lúc của Java cho việc học. Vì OOP là mối quan tâm nhiều hơn về kiến ​​trúc, nên bạn sẽ dễ dàng tìm hiểu hơn sau khi bạn biết các biến cơ bản, biểu thức, trình tự, lựa chọn và lặp lại, do đó, bất kỳ ngôn ngữ nào không gây ra OOP cho bạn ngay lập tức đều có lợi thế giáo dục.

Khi vợ tôi giới thiệu lớp học lập trình với java, cô ấy đã liên tục thất vọng vì public static void mainvà đặt mọi thứ vào một lớp học, điều mà cô ấy không có nền tảng để hiểu, nhưng được giáo viên của cô ấy nói chỉ để tin rằng cô ấy cần nó. Tôi đã cố gắng giải thích nó, nhưng thật khó để giải thích cho một người chỉ mới biết về các biến tại sao nó lại hữu ích để ngăn các phần khác của mã truy cập vào chúng và cách quyết định cách tách nó ra. Bạn có thể lập luận rằng việc học lập trình theo thủ tục trước tiên khắc sâu những thói quen xấu, nhưng còn thói quen sao chép và dán mã bạn không hiểu thì sao?


Có vẻ như các thuật ngữ "đối tượng", "ngôn ngữ", "định hướng" và "lập trình" chưa được thống nhất và không rõ ràng và tương đối nên không thể có câu trả lời trắng đen. Nhưng một lần nữa "đen" và "trắng" không được thống nhất và ý nghĩa của chúng là khó nắm bắt, v.v ... vv
Tulains Córdova

5

PHP không tệ cho lập trình hướng đối tượng. Tuy nhiên, bản chất của PHP khuyến khích các bản hack và sửa lỗi nhanh so với phát triển phần mềm hướng đối tượng phù hợp và nhiều sách và hướng dẫn bỏ qua hoàn toàn các khái niệm OOP. Nó có thể hỗ trợ các khái niệm OOP tốt, nhưng đó là trách nhiệm của nhà phát triển để biết áp dụng chúng. Bạn có thể làm hầu hết mọi thứ trong PHP mà bạn có thể làm bằng ngôn ngữ OOP "thật" như Java hoặc C #, nhưng những ngôn ngữ đó có nhiều thực thi kỹ thuật OOP hơn PHP, có thể được sử dụng theo kiểu thủ tục nếu bạn chọn.

Tôi không thể nhớ trích dẫn chính xác nhưng đó là từ một người so sánh PHP thô với việc sử dụng Ruby on Rails mới và sau đó đã làm một cái gì đó như thế này: Rails giúp viết mã tốt dễ dàng và viết mã xấu khó. PHP làm cho việc viết mã xấu trở nên dễ dàng và làm cho việc viết mã tốt trở nên khó khăn. Dòng về PHP khá nhiều tổng hợp nó trên OOP; nó hoàn toàn có khả năng trở thành một ngôn ngữ OO tốt, nhưng nó làm cho nó trở nên khó khăn hơn một chút.


4

Phân loại PHP

PHP chỉ là một ngôn ngữ keo giống như BASH hoặc Perl. Đó là tốt ở đó, nhưng không tốt ở bất cứ điều gì khác, để lại một số công việc nghiêm trọng. Ngôn ngữ không được thiết kế. Nó chỉ được phát triển bằng cách hack nhiều mã khác nhau theo một cách khó hiểu (mã và sửa lỗi).

Ngôn ngữ biên dịch

Trái ngược với PHP, Java là một ngôn ngữ được biên dịch đã được thiết kế đúng. Có các JSR xác định ngôn ngữ, nhiều khung và khái niệm cấp doanh nghiệp như EJB, JMS, ESB, Spring, Struts, Hibernate và các ngôn ngữ khác.

Phần mềm doanh nghiệp

Về mặt hệ thống doanh nghiệp, Java EE là một giải pháp phù hợp với mục đích (Phiên bản doanh nghiệp) trong khi PHP được sử dụng trong các công ty đang cố gắng giảm chi phí bằng cách thuê một lao động giá rẻ với trình độ kém hơn.

Đã có một nỗ lực đáng kể để kéo PHP vào phân khúc Doanh nghiệp bằng nhiều khung công tác khác nhau. Đáng chú ý nhất là Zend Framework 2 . Vấn đề cơ bản ở đây không phải là định hướng đối tượng của PHP, mà là thiếu thiết kế, thiếu gõ mạnh, giải pháp không chuẩn cho các vấn đề tiêu chuẩn (loại hack cho mọi thứ) và thiếu hoàn toàn bất kỳ kiến ​​trúc theo quy định nào.

Thiết kế phần mềm (Kiến trúc đã thảo luận)

Với PHP, gánh nặng của kiến ​​trúc phần mềm vẫn hoàn toàn phụ thuộc vào các nhà phát triển, những người đã làm một công việc rất kém, tức là thường không có bất kỳ kiến ​​trúc nào, chỉ cần mã và sửa lỗi ngẫu nhiên. Bảo mật và giao dịch bị thiếu và cần được các nhà phát triển đánh bóng. Trong Java, một giải pháp được chú thích EJB. Cũng xem xét thực tế rằng, trong PHP, không có gì xảy ra nếu bạn bỏ qua việc bắt ngoại lệ hoặc mắc các lỗi khác nhau. Đó là cho đến thời gian chạy. Với Java, bạn sẽ nhận được cảnh báo và lỗi trực tiếp tại thời điểm thiết kế. Điều đó được gọi là mạnh mẽ, nhưng với PHP bạn chỉ có thể tiếp tục mơ ước.

Đa luồng

PHP không hỗ trợ đa luồng. Mã luôn luôn là một chủ đề duy nhất. Điều này cản trở hiệu suất của nó đối với các vấn đề không tầm thường dưới tải nặng hơn. Với Java EE, đa luồng được hỗ trợ đầy đủ, ví dụ như thông qua giao diện Runnable.

Hỗ trợ và Tiêu chuẩn

Cũng xem xét việc triển khai, Dịch vụ web và các tiêu chuẩn khác. Trong khi ở Java, có các công ty lớn như Oracle, IBM, RedHat, Apache và nhiều công ty khác, PHP chỉ có Zend.

Phần kết luận

Để kết luận, PHP là một ngôn ngữ hướng đối tượng rất xấu. Nói một cách chính xác, nó thậm chí không hướng đối tượng, nhưng lai không tốt từ các phiên bản> 5 vì OOP được trộn lẫn với lập trình thủ tục. Tôi chỉ muốn giới thiệu PHP như một chất keo như BASH, nhưng đối với công việc nghiêm túc tôi sẽ sử dụng Java EE.

Những suy nghĩ liên quan

Thỏa thuận chính với Zend Framework 2 mới nhất là nó đang cố gắng giống như Java EE, nhưng hoàn toàn không cung cấp ít nhất một bộ các gói, tính năng, công cụ, tự động hóa, kiểm tra lỗi, kiến ​​trúc, thiết kế và mọi điều.

Theo kinh nghiệm của tôi, việc sử dụng PHP cho các dự án phức tạp sẽ tốn kém hơn so với Java.

Ngoài ra còn có một số tin đồn như PHP là viết tắt của Lập trình khá khủng khiếp . Tôi có thể xác nhận những điều này.


3

Làm thế nào tốt một ngôn ngữ xử lý OOP? Tôi muốn hỏi làm thế nào tôi có thể viết một chương trình theo cách OO. Tôi có thể ngoáy mũi ở tư thế mọi thứ nên được Java thực hiện bằng cách khiến mọi thứ trở nên tĩnh .
PHP hỗ trợ OOP; nó không buộc tôi chỉ viết theo cách OO. Nó xử lý tốt như thế nào tùy thuộc vào mức độ tôi hiểu và viết chương trình theo cách hướng đối tượng.


2

PHP hỗ trợ Đặc điểm! (bắt đầu 5,4) . Bất kỳ ngôn ngữ nào có thể xử lý việc tái sử dụng theo chiều ngang là ngôn ngữ OO đủ tốt trong cuốn sách của tôi.


1

Vâng, chúng ta phải nghĩ về những gì làm cho một ngôn ngữ trở nên OO hơn và những lý do nào đã khiến nó trở nên như vậy.

JavaScript là một triển khai của ECMAScript có nghĩa là chạy trong môi trường trình duyệt như một ngôn ngữ được giải thích . Thực tế là nó được cho là ngôn ngữ diễn giải có ảnh hưởng rất lớn đến thiết kế cú pháp / hành vi của nó.

Ví dụ, nó không tuân theo OOP. Nhưng ngoài ra có rất nhiều sự thật như, lập trình viên OO có thể thấy một số hành vi của nó như chức năng nâng lên rất khó hiểu.

Một lần nữa, có nhiều thứ đi kèm với các ngôn ngữ OO như C ++, Java, C # để làm cho chúng có trình biên dịch hiệu quả như gõ mạnh . Tuy nhiên, vì JS chạy trong môi trường được giải thích nên nó không tuân theo kiểu gõ mạnh thay vào đó là ngôn ngữ được gõ lỏng lẻo .

Ngoài những khác biệt về hành vi ở trên, còn có nhiều khác biệt về cú pháp như JS có ký hiệu Đối tượng có thể gây nhầm lẫn cho các lập trình viên C #. Tuy nhiên, C # cũng có cú pháp giống như đối tượng, mặc dù nó là ngôn ngữ được biên dịch và cú pháp như vậy hiếm khi được sử dụng vì nó không phải là kiểu mã OO theo truyền thống.

Bây giờ có một điểm nữa quyết định liệu ngôn ngữ này có tốt OO hay không: nó có được phát triển từ C ++ hay không. Khi Java, C # được phát triển từ C ++ và tuân theo hành vi và cú pháp tương tự, một cộng đồng lớn nhận thức hành vi và cú pháp đó là điều OO duy nhất và nghĩ rằng bất kỳ ngôn ngữ nào không ức chế sự tương đồng như vậy chỉ đơn giản không phải là OO.

Tuy nhiên, chúng ta đừng quên rằng OO là một khái niệm rất trừu tượng, nó không bị ràng buộc với bất kỳ kiểu cú pháp nào và thậm chí không có bất kỳ thuộc tính cụ thể nào.

Và PHP rất tốt OO. Đơn giản là không nhìn và cảm thấy như Java, C ++, C # không làm cho ngôn ngữ OO kém. À tôi học C ++ rồi Java rồi C #.

Vì vậy, cho đến bây giờ đầu của tôi rất tốt OO. Sau đó, tôi đã học được JS từ một cuốn sách rất hay "Classicalx Pro", và nó chỉ làm tôi thất vọng. Tôi chỉ thích hành vi và sự khác biệt cú pháp của JS. Sau đó, tôi nhận ra rằng cú pháp giống như đối tượng đã có trong C #. Và bây giờ trong khi học PHP tôi cảm thấy như thể nó mang lại nhiều thứ từ cả hai thế giới.

Tất cả những gì chúng ta thực sự phải làm là học cú pháp và sự tinh tế trong ngôn ngữ trong khi thực hiện OO. Khi chúng tôi thành thạo chúng, chúng tôi có thể bắt đầu nghĩ rằng đây là cách thực hiện OO tốt hơn.

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.