Bagaimana berorientasi objek adalah PHP? [Tutup]

13

Saya memiliki kesempatan untuk melakukan percakapan yang menarik dengan rekan kerja saya. Kebanyakan dari mereka adalah skrip tindakan flash atau pengembang Java.

Kami berbicara tentang seberapa baik php menangani OOP. Saya mengatakan bahwa PHP dapat menangani hampir setiap hal OOP pada PHP 5.2 atau 5.3. Apakah aku salah? Saya tidak mencoba mendapatkan jawaban ya / tidak, tetapi saya ingin mendengar lebih banyak pendapat dari pengembang.

user23583
sumber
Saya sudah menjawabnya di sini
Martin Wickman
12
bahasa tidak buruk, programmer
@Jarrod Roberson: Bahasa bawaan, bagaimana? Jika demikian, harap rujuk penelitian yang mendukung klaim ini, karena saya sangat tertarik membacanya.
kesalahan
4
@Jarrod, ada beberapa bahasa yang secara sah buruk, terutama ketika mereka masih dalam versi awal. Versi awal Actionscript, Javascript, Java, dan PHP muncul di pikiran.
Jordan
2
@JarrodRoberson, jadi programmer yang mendesain PHP ...
dan_waterworth

Jawaban:

34

PHP 5.3 sebenarnya memiliki dukungan yang cukup baik untuk OOP.

Masalah dengan PHP sehubungan dengan OOP adalah, bahwa OOP benar-benar hanya melesat ke bahasa, sedangkan dalam bahasa-bahasa seperti Java dan ActionScript itu adalah bagian dari konsep inti, meskipun saya menganggap kedua bahasa OOP buruk karena semantik objek mereka yang buruk.

Meskipun PHP saat ini sebagian besar cocok untuk OOP, masalahnya adalah bahwa:

  1. sebagian besar basis kode di luar sana (perpustakaan, kerangka kerja, kode kustom) tidak ditulis dalam PHP 5.3
  2. sebagian besar API bersifat prosedural. arraymasih merupakan tipe yang paling penting dan paling banyak digunakan dan itu bukan objek.
  3. sebagian besar programmer PHP hanya akan tetap dengan gaya prosedural di masa mendatang. PHP tidak mempromosikan OOP, sebagai kebalikan dari Objective-C misalnya: Objective-C memiliki C sebagai subset penuh dan dengan demikian memungkinkan pemrograman prosedural dalam salah satu bentuk yang paling murni, tetapi jelas mendukung penggunaan OOP.

PHP tidak bisa begitu saja menyingkirkan semua barang warisan. Jika PHP 6 dirilis, itu membuang sebagian besar, mungkin tidak akan digunakan. Itu akan mengalahkan tujuannya.
Dan PHP gagal mengambil langkah yang cukup dari hal-hal yang secara bertahap mencela. Jadi itu akan memakan waktu sampai mendapatkan kejelasan dan konsistensi yang diperlukan bahasa yang baik.

Secara pribadi, saya benar-benar tidak menyukai PHP, hanya karena semua barang bawaan itu, API dan semuanya.
Namun kerangka kerja seperti Flow3, Symfony, CakePHP dan Codeigniter memberikan dasar yang kuat untuk OOP dan paradigma kuat lainnya. Karena keterbatasan ActionScript dan Java, dengan upaya yang cukup (lapisan abstraksi di atas kekurangan PHP), PHP dapat setara atau bahkan mengungguli mereka.

Untuk meringkas: Tidak ada yang salah dengan fasilitas OOP PHP. Karena itu Anda bisa mengatakan itu bukan bahasa OO yang buruk . Namun ada banyak hal yang salah dengan PHP, seperti fasilitas OOP tidak benar-benar terintegrasi , tetapi hanya dimasukkan , oleh karena itu Anda bisa berpendapat itu adalah bahasa OO yang buruk .

back2dos
sumber
4
Karena penasaran, dapatkah Anda menjelaskan mengapa menurut Anda Jawa adalah OOP yang buruk?
dkuntz2
2
Ahem .. Saya mungkin memperbarui jawaban Anda untuk spesifik ke Actionscript 3 . Sebelum itu, Actionscript tidak dirancang untuk menjadi OO (berbasis ECMA) dan bahkan Actionscript 2 hanyalah pembungkus untuk AS1.
Demian Brecht
1
Saya juga ingin tahu mengapa Anda berpikir Java adalah bahasa OOP yang buruk
starcorn
2
@Demian Brecht: Douglas Crockford tampaknya relatif yakin JavaScript (skrip apa pun ECMA) adalah OO: javascript.crockford.com/javascript.html
back2dos
2
Perbedaan yang meringkas dengan baik: PHP adalah objek-mampu , bukan berorientasi objek.
vartec
11

Anda akan menemukan bahwa " dapat menangani " tidak sama dengan " mendukung ". Maksudku, turun di seluk-beluk, bahkan C " dapat menangani " OOP jika Anda menyusun kode Anda dengan benar. Pertanyaannya adalah apakah bahasa melampaui atau tidak hanya memungkinkan OOP mendorongnya dengan menjadikan OOP cara paling alami untuk memprogram.

Dalam pengalaman saya (memang terbatas), dialek PHP 5.n tidak melakukan ini. Terlalu mudah untuk keluar dari OOP dan masuk ke dalam kode prosedural murni. (Perhatikan bahwa saya tidak berpikir PHP adalah bahasa yang buruk untuk alasan ini. Ada banyak alasan mengapa saya pikir PHP adalah bahasa yang buruk, tetapi dukungan OOP bukan salah satunya.;))

HANYA PENDAPAT SAYA yang benar
sumber
12
Sobat, aku bisa terus berabad-abad tentang itu, Moon. Berikut adalah potongan kode yang gagal: $e = function_that_returns_an_array()[0];. Inilah yang harus Anda lakukan untuk memperbaikinya: $a = function_that_returns_an_array(); $e = $a[0];. Bahasa yang sintaksisnya tidak akan membiarkan Anda langsung menggunakan hasil dari panggilan fungsi, centang saya. Juga, ceritakan apa yang nomor berikut adalah dalam desimal: 0246875. (Petunjuk: Anda tidak akan dapat menemukan cara bodoh untuk mengimplementasikan lexer itu!) PHP penuh dengan kebodohan semacam ini.
HANYA SAYA PENDAPAT benar
6
@Moon Berikut ini beberapa bacaan untuk Anda: softwarebashing.org/blog/2009/09/php-the-ultimate-suck dan tommorris.org/wiki/PHP%20Sucks Ada beberapa masalah serius, tetapi kebanyakan hanya nit. pemetikan. Yang benar-benar saya benci tentang PHP adalah budaya, hanya saja tidak profesional atau akademis sebagai alternatif, yaitu ruby ​​dan python. Alternatif lebih bagus dan mereka menarik programmer terbaik. Misalnya ruby ​​dan python keduanya memiliki cangkang interaktif, fitur fungsional yang layak dan sintaksis bersih. Mereka jauh lebih menyenangkan untuk digunakan. Selain pangsa pasar di shared hosting web mengapa menggunakan php?
Keyo
8
"Hanya ada dua jenis bahasa: yang dikeluhkan orang dan yang tidak digunakan siapa pun." Bjarne Stroustrup. Merenungkan.
Sylverdrag
4
@ JUST, untungnya mereka telah memperbaiki masalah array dereferencing di 5.4 .
Charles
5
Stroustrup hanya kesal karena C ++ adalah salah satu bahasa yang dikuasai orang.
HANYA SAYA PENDAPAT benar
8

Sebenarnya ada dua definisi orientasi objek bahasa: bagaimana berorientasi objek dibangun sendiri dalam sintaks dan pustaka standar, dan apa pengaruh yang dimilikinya terhadap perangkat lunak yang ditulis oleh pemrogram untuk itu.

Menurut definisi pertama, PHP tampaknya berada di bagian bawah daftar. Orang sering mengutip string dan array non-objek sebagai bukti dari ini. Menurut pendapat saya, definisi ini tidak terlalu penting. Anda selalu dapat membungkusnya dalam suatu objek jika Anda benar - benar membutuhkannya , tetapi orang tidak melakukannya karena mereka tidak memerlukannya . Biasanya satu-satunya perbedaan itu akan membuat kode berubah function(var)menjadi var.function(). Sintaksis saja tidak mengubah sesuatu dari non-OOP ke OOP.

Adapun definisi kedua, orang berhasil menulis kode berorientasi objek yang buruk bahkan dalam bahasa yang sangat menegakkan konstruksi seperti itu, dan orang yang menulis kode berorientasi objek yang baik hampir tidak terpengaruh oleh bahasa sama sekali, kecuali karena terganggu oleh kebiasaan sintaksis. Dengan kata lain, dalam pengalaman saya, tidak ada bahasa berorientasi objek yang buruk, hanya programmer berorientasi objek yang buruk . PHP sama bagusnya dengan bahasa lain dalam hal itu.

Mungkin beberapa bahasa lebih cocok untuk belajar pemrograman berorientasi objek, tapi saya pikir itu akan berbeda oleh pengembang. Bagi saya, itu tidak mengklik sampai saya membaca buku unta Larry Wall tentang bagaimana perl (O?) Lakukan. Harus secara eksplisit memberkati referensi sebagai milik kelas benar-benar mengantar saya ke titik tentang apa contoh objek sebenarnya versus apa kelas itu. Beberapa orang menyukai pendekatan Java all-object-all-the-time untuk belajar. Karena OOP lebih merupakan masalah arsitektural, lebih mudah untuk belajar setelah Anda mengetahui variabel dasar, ekspresi, urutan, pemilihan, dan iterasi, sehingga bahasa apa pun yang tidak memberikan OOP pada Anda segera memiliki keunggulan pendidikan menurut saya.

Ketika istri saya mengambil intro ke kelas pemrograman dengan java, ia terus-menerus frustrasi oleh public static void maindan meletakkan segala sesuatu di kelas, yang ia belum memiliki latar belakang untuk mengerti, tetapi diberitahu oleh gurunya hanya untuk percaya bahwa ia membutuhkannya. Saya mencoba menjelaskannya, tetapi sangat sulit untuk menjelaskan kepada seseorang yang baru saja belajar tentang variabel mengapa akan berguna untuk mencegah bagian lain dari kode mengaksesnya, dan bagaimana memutuskan bagaimana memecahnya. Anda mungkin berpendapat bahwa mempelajari pemrograman prosedural pertama kali menanamkan kebiasaan buruk, tetapi bagaimana dengan kebiasaan menyalin dan menempel kode yang tidak Anda mengerti?

Karl Bielefeldt
sumber
Tampaknya istilah "objek", "bahasa", "berorientasi" dan "pemrograman" belum disepakati dan bersifat ambigu dan relatif sehingga tidak mungkin ada jawaban hitam atau putih yang mungkin. Tetapi sekali lagi "hitam" dan "putih" tidak disetujui dan maknanya sulit dipahami, dll. Dll.
Tulains Córdova
5

PHP tidak buruk untuk pemrograman berorientasi objek. Namun, sifat PHP mendorong peretasan dan perbaikan cepat versus pengembangan perangkat lunak berorientasi objek yang tepat, dan banyak buku dan tutorial mengabaikan konsep OOP sepenuhnya. Ini dapat mendukung konsep OOP dengan baik, tetapi merupakan tanggung jawab pengembang untuk mengetahui untuk menerapkannya. Anda dapat melakukan hampir semua hal dalam PHP yang dapat Anda lakukan dalam bahasa OOP "benar" seperti Java atau C #, tetapi bahasa-bahasa tersebut memiliki lebih banyak penegakan teknik OOP daripada PHP, yang dapat digunakan dengan gaya prosedural jika Anda mau.

Saya tidak dapat mengingat kutipan yang tepat, tetapi itu berasal dari seseorang yang membandingkan PHP mentah dengan menggunakan Ruby on Rails yang baru, dan melakukan sesuatu seperti ini: Rails memudahkan penulisan kode yang baik, dan penulisan kode yang buruk menjadi sulit. PHP membuat penulisan kode yang buruk menjadi mudah dan membuat penulisan kode yang baik menjadi sulit. Baris tentang PHP cukup banyak merangkumnya di OOP; itu sangat mampu menjadi bahasa OO yang baik, tetapi membuatnya sedikit lebih sulit untuk melakukannya.

Wayne Molina
sumber
4

PHP Dikategorikan

PHP hanya bahasa lem seperti BASH atau Perl. Itu bagus dalam hal itu, tetapi tidak bagus dalam hal lain, tinggalkan beberapa pekerjaan serius. Bahasa tidak dirancang. Itu hanya dikembangkan dengan meretas berbagai kode secara serampangan (code-and-fix).

Bahasa yang Dikompilasi

Berbeda dengan PHP, Java adalah bahasa yang dikompilasi yang telah direkayasa dengan baik. Ada JSR yang mendefinisikan bahasa, banyak kerangka kerja dan konsep tingkat perusahaan seperti EJB, JMS, ESB, Spring, Struts, Hibernate, dan lainnya.

Perangkat Lunak Perusahaan

Dalam hal sistem perusahaan, Java EE adalah solusi yang sesuai dengan tujuan (Edisi Enterprise) sedangkan PHP digunakan di perusahaan yang berusaha mengurangi biaya dengan mempekerjakan tenaga kerja murah dengan kualifikasi yang lebih rendah.

Telah ada upaya yang cukup besar untuk menyeret PHP ke segmen Enterprise menggunakan berbagai kerangka kerja. Terutama, Zend Framework 2 . Masalah mendasar di sini bukanlah orientasi objek PHP, tetapi kurangnya desain, tidak ada pengetikan yang kuat, solusi non-standar untuk masalah standar (jenis peretasan untuk semuanya), dan tidak adanya arsitektur yang ditentukan.

Desain Perangkat Lunak (Arsitektur Dibahas)

Dengan PHP, beban pembuatan perangkat lunak masih sepenuhnya tergantung pada pengembang yang telah melakukan pekerjaan yang sangat buruk yaitu sering tidak memiliki arsitektur sama sekali, hanya kode acak dan diperbaiki. Keamanan dan transaksi hilang dan harus disepelekan oleh pengembang. Di Jawa, satu solusi adalah EJB beranotasi. Juga pertimbangkan fakta bahwa, dalam PHP, tidak ada yang terjadi jika Anda menghilangkan pengecualian atau membuat berbagai kesalahan. Itu sampai run-time. Dengan Java, Anda akan mendapatkan peringatan dan kesalahan langsung pada waktu desain. Itu disebut ketahanan, tetapi dengan PHP Anda hanya bisa terus bermimpi.

Multithreading

PHP tidak mendukung multithreading. Kode selalu satu utas. Ini menghambat kinerjanya untuk masalah non-sepele di bawah beban yang lebih berat. Dengan Java EE, multithreading didukung sepenuhnya, misalnya melalui antarmuka Runnable.

Dukungan dan Standar

Juga pertimbangkan penyebaran, Layanan Web, dan standar lainnya. Sedangkan di Jawa, ada perusahaan besar seperti Oracle, IBM, RedHat, Apache, dan banyak lainnya, PHP hanya memiliki Zend.

Kesimpulan

Untuk menyimpulkan, PHP adalah bahasa berorientasi objek yang sangat buruk. Sebenarnya, itu bahkan tidak berorientasi objek, tetapi hibrida yang buruk dari versi> 5 karena OOP dicampur dengan pemrograman prosedural. Saya hanya akan merekomendasikan PHP sebagai lem seperti BASH, tetapi untuk pekerjaan serius saya akan menggunakan Java EE.

Pikiran Terkait

Kesepakatan utama dengan Zend Framework 2 terbaru adalah bahwa ia mencoba untuk menjadi seperti Java EE, tetapi sepenuhnya gagal memberikan setidaknya satu set paket, fitur, alat, otomatisasi, pengecekan kesalahan, arsitektur, desain, dan yang dapat dibandingkan dari jarak jauh. segala sesuatu.

Dalam pengalaman saya, lebih mahal menggunakan PHP untuk proyek-proyek kompleks daripada dengan Java.

Ada juga beberapa rumor seperti itu bahwa PHP adalah singkatan dari Pretty Horrible Programming . Saya dapat mengkonfirmasi ini.

Michael Borgwardt
sumber
3

Seberapa baik bahasa menangani OOP? Saya lebih suka bertanya seberapa baik saya bisa menulis program dengan cara OO. Saya bisa menggerakkan hidung saya pada segala sesuatu yang seharusnya menjadi sikap kelas yang diambil oleh Jawa dengan membuat segala sesuatu menjadi statis untuk umum .
PHP mendukung OOP; itu tidak memaksa saya untuk menulis dengan cara OO saja. Seberapa baik menangani itu tergantung pada seberapa baik saya memahami dan menulis program dengan cara yang berorientasi objek.

Srisa
sumber
2

PHP mendukung Ciri-Ciri! (mulai 5.4) . Bahasa apa pun yang dapat menangani penggunaan ulang horizontal secara asli adalah bahasa OO yang cukup baik dalam buku saya.

dukeofgaming
sumber
1

Yah kita harus memikirkan apa yang membuat bahasa lebih OO dan alasan apa yang membuatnya seperti itu.

JavaScript adalah implementasi ECMAScript yang dimaksudkan untuk berjalan di lingkungan browser sebagai bahasa yang diartikan . Fakta bahwa bahasa tersebut dianggap sebagai bahasa yang ditafsirkan memiliki efek yang sangat besar pada desain sintaksis / perilaku.

Misalnya, tidak mengikuti OOP. Namun terlepas dari itu ada banyak fakta seperti, OO prgrammer mungkin menemukan beberapa perilakunya seperti fungsi mengangkat sangat membingungkan.

Sekali lagi ada banyak hal yang datang dengan bahasa OO seperti C ++, Java, C # untuk membuat mereka lebih efisien seperti mengetik yang kuat . Namun, karena JS berjalan dalam lingkungan yang diinterpretasikan, JS tidak mengikuti pengetikan yang kuat melainkan bahasa yang diketik secara longgar .

Terlepas dari perbedaan perilaku di atas ada banyak perbedaan sintaksis seperti JS memiliki notasi Object Literal yang mungkin sangat membingungkan programmer C #. Namun C # juga memiliki objek seperti sintaks, meskipun itu adalah bahasa yang dikompilasi dan sintaks seperti itu jarang digunakan karena tidak secara tradisional gaya kode OO.

Sekarang ada satu hal lagi yang menentukan apakah bahasa OO baik: apakah ini berevolusi dari C ++. Sebagai Java, C # berevolusi dari C ++ dan mengikuti perilaku dan sintaksis yang sama, sebuah komunitas besar memang menganggap perilaku dan sintaksis itu sebagai satu-satunya hal yang OO , dan berpikir bahwa bahasa apa pun yang tidak menghambat kemiripan seperti itu sama sekali bukan OO.

Namun jangan lupa bahwa OO adalah konsep yang sangat abstrak dan tidak terikat dengan gaya sintaksis apa pun dan bahkan tidak dengan properti beahavioral tertentu.

Dan PHP sangat baik OO. Tidak terlihat dan terasa seperti Java, C ++, C # tidak menjadikannya bahasa OO yang buruk. Yah saya belajar C ++ kemudian Java dan kemudian C #.

Jadi, sampai sekarang kepalaku OO sangat baik. Kemudian saya belajar JS dari buku yang sangat bagus "Wrox Pro", dan itu terlalu membesar-besarkan saya. Saya hanya menikmati perilaku dan perbedaan sintaksis JS. Lalu saya menyadari bahwa Objek seperti sintaks ada di dalam C #. Dan sekarang sambil belajar PHP saya merasa seolah-olah membawa banyak hal dari kedua dunia.

Yang harus kita lakukan hanyalah mempelajari sintaks dan seluk-beluk perilaku yang dimiliki bahasa saat menerapkan OO. Begitu kita menguasainya, kita mungkin mulai berpikir bahwa ini adalah implementasi OO yang lebih baik.

Maha
sumber