2010-01-23 32 views
17

Có nhiều cuộc tranh luận về việc liệu lập trình hướng đối tượng có tốt hay không. Nhưng, sử dụng OOP trong Php thì chậm hơn. Nó sẽ là một thương mại tốt để sử dụng lập trình thủ tục và tốc độ nhanh hơn và OOP với tốc độ chậm hơn (kể từ khi các lớp học phải được bắt đầu mỗi khi một trang tải và các trang web lớn sẽ bắt đầu trở nên chậm).Giá trị OOP có được sử dụng trong PHP không?

Quan trọng hơn, nó sẽ là tốt để bọc các công cụ bên trong một lớp và sử dụng các hàm tĩnh hoặc tốt hơn là chỉ có nhiều hàm nằm với tiền tố cũ: wp_function().

+20

là micro giây xử lý giá trị các tế bào não? mở nguồn của một cái gì đó như CakePHP hoặc CodeIgniter, sau đó so sánh với nguồn của wordpress, sau đó nói với tôi sau này không khuyến khích bạn đập khuôn mặt của bạn vào bàn phím. – seanmonstar

+5

Bạn nói đúng. Cuộc sống quá ngắn để thử và tối ưu hóa cho rằng 50 mili giây tối ưu hóa cho mỗi yêu cầu. – ambiguousmouse

+0

@seanmonstar: Ý bạn là Wordpress không phải là OO ?! ** o_O '** –

Trả lời

10

Có, gần như luôn là ý tưởng hay khi sử dụng OOP. Điều này là do OOP là một kiểu mã hóa, và các kiểu mã hóa cho hầu hết các phần có thể dễ dàng được chuyển tải qua các ngôn ngữ.

Mọi người không sử dụng kiểu mã hóa vì họ sử dụng một ngôn ngữ nhất định. Mọi người sử dụng các kiểu mã hóa vì kiểu mã hóa cung cấp các phương thức tốt để làm những điều mà họ cảm thấy là mong muốn. Vì vậy, miễn là các yếu tố cơ bản có (thừa kế, thuộc tính lớp, vv), nó sẽ luôn luôn được khả thi để viết trong phong cách mã hóa đó.

Không, việc sử dụng các chức năng thủ tục để truy cập chúng có lẽ không phải là một ý tưởng hay. Điều này là bởi vì, bạn có thể sẽ phải làm một cái gì đó như thế này để duy trì trạng thái.

function myFunc() 
{ 
    global $class; 
    $class->doMethod(); 
} 

function myFunc2() 
{ 
    global $class; 
    $class->doMethod2(); 
} 

Đây là một ý tưởng tồi khi tạo ra hàng tấn trạng thái toàn cầu.

+0

Luôn sử dụng toàn cầu trong các chức năng là một ý tưởng tồi bởi vì nó chiếm rất nhiều không gian. Nhưng, sẽ tốt khi sử dụng $ GLOBALS ['class']? Nó có thể dài hơn để viết nhưng nó sẽ là tốt để sử dụng nếu bạn chỉ sử dụng lớp một lần. – ambiguousmouse

+3

'$ GLOBALS' về cơ bản là giống nhau. Bạn đang tạo một biến toàn cục. –

+0

Vì vậy, tôi chỉ có thể sử dụng $ GLOBALS ['class']. Sau đó, trên một dòng khác chỉ sử dụng lớp $? – ambiguousmouse

12

Nếu lý do bạn lo lắng về việc sử dụng OO với PHP là tốc độ, đừng sợ: PHP là một ngôn ngữ chậm xung quanh. Nếu bạn đang làm một cái gì đó đủ bộ xử lý đủ để giảm tốc độ từ việc sử dụng các đối tượng thành vật chất, bạn không nên sử dụng PHP chút nào.

Liên quan đến các chức năng tĩnh, đây là một lựa chọn thiết kế, nhưng tôi sẽ sai về mặt tránh các lớp được tạo thành hoàn toàn các hàm tĩnh. Có thực sự không có lợi thế cho nó trên tiền tố, và sử dụng một cấu trúc chỉ vì nó không có một ý tưởng tốt.

2

Có khi ứng dụng của bạn phát triển .. (và nó sẽ) nó sẽ giúp bạn tiết kiệm nhiều giờ thất vọng. Và lặp lại chính bạn (sao chép dán mã trên toàn bộ địa điểm) .. :)

+0

Huh. tại sao không sử dụng OOP ngụ ý copy + paste-coding? –

+0

lập trình thủ tục không thể sử dụng lại được. mặc dù bạn có thể mắc lỗi này trong OOP quá :) – Chris

+0

Tại sao không thể tái sử dụng? Bạn có thể viết rất, rất chung chung, mã thủ tục. Xem thư viện chuẩn C++ (ví dụ: 'std :: sort'), xem thư viện chuẩn C (nổi bật nhất là' qsort'). Mã thủ tục không được tái sử dụng sẽ hoàn toàn ngụ ý rằng bạn có thể sử dụng mọi chức năng một lần và một lần duy nhất, mà tất nhiên là một chút không tốt. –

5

Theo ý kiến ​​khiêm tốn của tôi, nhà phát triển PHP không nên cố gắng chỉ một hướng. (thủ tục vs đối tượng theo định hướng) Trong một số trường hợp, tất cả những gì bạn cần là một vài hàm toàn cầu, những lúc khác nó có ích hơn khi sử dụng các đối tượng. Đừng cố ép buộc mọi thứ theo cách này hay cách khác, linh hoạt và sử dụng những gì hiệu quả nhất cho từng tình huống.

5

Tôi rất không đồng ý với câu trả lời của Chacha102.

Câu trả lời đúng cho câu hỏi này sẽ điền một số sách - đừng bận tâm đến bài đăng 20 dòng ở đây.

Cả hai cách tiếp cận đều có lợi ích và hạn chế của chúng. Tôi muốn giới thiệu cho những ai muốn tự xem mình là một lập trình viên giỏi để có kinh nghiệm quan trọng trong lập trình thủ tục, phi thủ tục và hướng đối tượng. Cũng như kinh nghiệm với các phương pháp khác nhau như SCRUM, cascade và RAD.

Về sự phù hợp của PHP đối với OO so với mã hóa thủ tục, chắc chắn nguồn gốc của ngôn ngữ nằm trong ngôn ngữ thứ hai (nhưng lưu ý rằng cả Java và ASP là lai thay vì ngôn ngữ OO thực).

Về mặt ngữ pháp, tôi có xu hướng viết mã thủ tục khi tôi cần sản xuất nội dung nào đó rất đơn giản hoặc phải có hành vi của nó để được xác định rõ ràng và có thể dự đoán được. Tuy nhiên khi viết mã phức tạp mà hành vi sẽ thay đổi rất nhiều vào thời gian chạy, tôi thấy OO hiệu quả hơn nhiều về thời gian của nhà phát triển - mặc dù thiết kế dựa trên một tập hợp các trường hợp sử dụng hữu hạn.

Để cho rằng bạn nên luôn luôn viết mã thủ tục bởi vì nó sẽ chạy nhanh hơn so với mã OO:

1) không nhất thiết phải đúng 2) hoàn toàn bỏ qua các chi phí tương đối của thời gian phát triển vs chi phí phần cứng

nó sẽ là tốt để quấn thứ bên trong một lớp và sử dụng các chức năng tĩnh

cho rằng không gian tên đang có sẵn trong PHP, đây là một cách thực sự lộn xộn để tránh namespace col lisions và không phải cái gì tôi muốn giới thiệu.

C.

5

Cùng một đối số về hiệu suất đã được thực hiện về mục tiêu C và C++ trong ngày. Và câu trả lời cho vấn đề đó là tận dụng bộ nhớ có sẵn và sức mạnh xử lý liên tục ngày càng lớn hơn, tốt hơn và nhanh hơn.

Có, OO yêu cầu nhiều tài nguyên hơn để chạy. Nhưng lợi ích của việc sử dụng OO lớn hơn chi phí phần cứng $$ (có khả năng là không đáng kể) trong việc hỗ trợ các ứng dụng OO.

Tuy nhiên, điều tốt là phải quan tâm đến hiệu suất phần mềm. Tuy nhiên nhìn dưới mui xe của thủ tục so với oo như là một nơi để bắt đầu là một chút sai lầm. Bạn cần phải tập trung vào viết mã hiệu quả để bắt đầu, cho dù là thủ tục hay OO (và cả hai đều có liên quan).

Hãy nhớ rằng mặc dù PHP có thể không phải là nền tảng nhanh nhất hiện có (Java, ví dụ, đá mông của nó) PHP được sử dụng để cung cấp năng lượng cho một số trang web có lưu lượng truy cập lớn nhất trên Internet: cụ thể là Facebook.

Nếu bạn có bất kỳ nghi ngờ nào khác về PHP và OO, chỉ cần nhìn vào Zend và Magento (dựa trên Zend). Magento là nền tảng tài nguyên chuyên sâu VERY, sử dụng bộ nhớ có thể lên tới 36MB mỗi trường hợp. Tuy nhiên, nền tảng chính nó có khả năng xử lý hàng triệu lượt truy cập. Điều này là do một môi trường máy chủ được cấu hình đúng cách với một sự phục vụ lành mạnh của các tài nguyên phần cứng làm cho tất cả các lợi ích của việc sử dụng OO vượt xa chi phí của chính máy chủ. Nhưng trong một thế giới máy tính nhóm, KHÔNG sử dụng sức mạnh xử lý và bộ nhớ (có trách nhiệm) có sẵn cho bạn là - IMHO - chứng điên cuồng lâm sàng.

3

Thực sự không có câu trả lời hoàn hảo vì nó phụ thuộc vào rất nhiều biến không xác định, và sau đó nó không phải là tất cả hoặc không có gì.

Ví dụ: nếu bạn chia ứng dụng của mình thành mô hình MVC, bạn có thể có Mô hình là OO nhưng giữ cho Trình điều khiển đơn giản hơn theo thủ tục.

Bạn có thể sử dụng các lớp làm phương tiện để chỉ nhóm các hàm tĩnh phổ biến hoặc bạn có thể lấy nó xa hơn rất nhiều vào mẫu bản ghi đang hoạt động.

Nếu bạn đang xây dựng một biểu mẫu web nhỏ một trang để tắt POST trong email, bạn thực sự không cần OO - vì sợ rằng bạn có thể bao gồm một lớp thư hiện có để tận dụng.

Không ai có thể cung cấp cho bạn lời khuyên thích hợp mà không hiểu dự án bạn đang thực hiện.

Điều đó nói rằng, nếu mối quan tâm duy nhất của bạn là tốc độ thì OO sẽ hơi chậm hơn. Và có rất nhiều thứ lén lút bạn có thể làm ngay cả trong PHP thủ tục để bắt chước một số lợi ích của OO. Nhưng trừ khi bạn đang tham gia vào một dự án lớn, chi phí bổ sung sẽ không bao giờ lên tới nhiều. Và vào thời điểm bạn có một dự án lớn, những ưu điểm của OO có thể vượt trội so với những điểm yếu của nó.

2

Tôi đã tò mò về điều này bản thân mình. Thật không may sau khi tôi thay đổi mã của tôi từ thủ tục để oop tôi chạy một số điểm chuẩn và không phải trước.

Đây là mã điểm chuẩn.

class game{ 
    function maxp($val){ 
    return max(0,pow($val,0.5));   
    } 
} 

$game = new game; 

for($i=0;$i<100000;$i++){ 
    $game->maxp(100); 
    //game::maxp(100); 
} 

Kết quả OOP dao động trong khoảng từ 0,13 đến 0,2 giây;

Kết quả thủ tục nằm trong khoảng từ 0,08 đến 0,1 giây.

Kết quả vẫn nhất quán trong một khoảng thời gian dài.

Tôi khuyến khích bạn chạy thử nghiệm của riêng bạn.

php 5.4.3

Các vấn đề liên quan