PHP nesne yönelimli mi? [kapalı]


13

İş arkadaşlarımla ilginç bir konuşma yapma şansım oldu. Çoğu flash eylem komut dosyası veya Java geliştiricileri.

Biz php OOP ne kadar iyi ele hakkında konuştuk. PHP'nin PHP 5.2 veya 5.3'ten itibaren hemen hemen her OOP işleyebileceğini söyledim. Yanlış mıyım? Evet / hayır cevabı almaya çalışmıyorum, ancak geliştiricilerden daha fazla görüş almak istiyorum.



12
Diller fena değil, programcılar

@Jarrod Roberson: Diller doğuştan, nasıl? Eğer öyleyse, lütfen bu iddiayı destekleyen araştırmaya başvurunuz, çünkü bunu okumakla çok ilgileniyorum.
büyük hatalar

4
@Jarrod, özellikle ilk sürümlerinde olduklarında meşru olarak kötü diller var. Actionscript, Javascript, Java ve PHP'nin ilk sürümleri akla geliyor.
Ürdün

2
@JarrodRoberson, böylece PHP tasarlayan programcılar ...
dan_waterworth

Yanıtlar:


34

PHP 5.3 aslında OOP için oldukça iyi bir desteğe sahiptir.

PHP'nin OOP ile ilgili sorunu, OOP'nin gerçekten sadece dile bağlı olması, Java ve ActionScript gibi dillerde temel kavramın bir parçası olmasına rağmen, zayıf nesne semantikleri nedeniyle hem kötü OOP dillerini göz önünde bulunduruyorum.

PHP günümüzde OOP için büyük ölçüde uygun olsa da, sorun şudur:

  1. kod tabanının büyük çoğunluğu (kütüphaneler, çerçeveler, özel kod) PHP 5.3'te yazılmamıştır
  2. API'nın büyük çoğunluğu prosedüreldir. arrayhala en önemli ve en çok kullanılan tiptir ve bir nesne değildir.
  3. PHP programcılarının büyük çoğunluğu, öngörülebilir bir gelecekte prosedürel stile sadık kalacaktır. PHP, Objective-C yerine OOP'yi desteklemez : Objective-C tam bir alt küme olarak C'ye sahiptir ve bu nedenle en saf formlarından birinde prosedürel programlamaya izin verir , ancak OOP kullanımını açıkça tercih eder.

PHP tüm eski şeylerden kurtulamaz. Bir PHP 6 piyasaya sürüldüyse, bu çoğunu dışarı atarsa, muhtemelen kullanılmaz. Amacını yenecekti.
Ve PHP şeyleri yavaş yavaş tasfiye etmek için yeterli bir hız yakalayamadı. Bu nedenle, iyi bir dilin sahip olması gereken açıklığı ve tutarlılığı elde etmesi biraz zaman alacaktır.

Şahsen ben sadece PHP, tüm bu bagaj, API ve her şey yüzünden sevmiyorum.
Ancak Flow3, Symfony, CakePHP ve Codeigniter gibi çerçeveler OOP ve diğer güçlü paradigmalar için sağlam bir temel oluşturur. ActionScript ve Java'nın kısıtlılığı nedeniyle, yeterli çaba ile (PHP kusurlarının üzerinde bir soyutlama katmanı), PHP eşit veya hatta daha üstün olabilir.

Özetlemek gerekirse: PHP'nin OOP tesislerinde özellikle yanlış bir şey yoktur. Bu nedenle bunun kötü bir OO dili olmadığını söyleyebilirsiniz . Bununla birlikte, PHP ile özellikle yanlış olan birçok şey var, örneğin OOP tesisleri gerçekten entegre değil, sadece dahil , bu nedenle bunun kötü bir OO dili olduğunu iddia edebilirsiniz .


4
Meraktan, Java'nın neden kötü bir OOP olduğunu düşündüğünüzü açıklayabilir misiniz?
dkuntz2

2
Ahem .. Cevabınızı Actionscript 3'e özgü olarak güncelleyebilirim . Bundan önce, Actionscript OO (ECMA tabanlı) olacak şekilde tasarlanmamıştı ve hatta Actionscript 2 bile AS1 için bir sarıcıydı.
Demian Brecht

1
Java'nın neden kötü bir OOP dili olduğunu düşündüğünü de merak ediyorum
starcorn

2
@Demian Brecht: Douglas Crockford nispeten ikna olmuş bir JavaScript (bu nedenle ECMA-betiği) OO: javascript.crockford.com/javascript.html
back2dos

2
De bu özetliyor ayrım: PHP nesneye sahip değil nesne yönelimli.
vartec

11

" İşleyebilir " in " destekler " ile aynı olmadığını göreceksiniz . Yani, nitty-cesetleri aşağı doğru, kodunuzu düzgün bir şekilde yapılandırırsanız, C bile OOP işleyebilir . Soru dili sadece ötesinde olsun ya da olmasın sağlayan cepten programa en doğal yolu yaparak bunu teşvik içine OOP.

Benim (kuşkusuz sınırlı) deneyimimde PHP 5.n lehçeleri bunu yapmayın. OOP'tan çıkmak ve tamamen prosedürel koda girmek çok kolay. (PHP'nin bu nedenle kötü bir dil olduğunu düşünmüyorum. PHP'nin kötü bir dil olduğunu düşünmem için birçok neden var, ancak OOP desteği bunlardan biri değil.;))


12
Dostum, bunun hakkında uzun yıllar devam edebilirdim, Moon. İşte başarısız kod snippet'idir var: $e = function_that_returns_an_array()[0];. İşte bunu düzeltmek için yapmanız gereken budur: $a = function_that_returns_an_array(); $e = $a[0];. Sözdizimi bir işlev çağrısının sonucunu doğrudan kullanmanıza izin vermeyen diller beni işaretler. Ayrıca, aşağıdaki sayı ondalık içinde ne söyle: 0246875. (İpucu: bu lexer'ı uygulamak için bir numara bulamazsınız!) PHP sadece bu tür aptallıkla doludur.
SADECE benim doğru görüşüm

6
@Moon İşte size bazı okumalar: softwarebashing.org/blog/2009/09/php-the-ultimate-suck ve tommorris.org/wiki/PHP%20Sucks Bazı ciddi sorunlar var, ancak bunların çoğu sadece nit toplama. PHP hakkında gerçekten nefret ettiğim şey kültür, sadece yakut ve python gibi alternatifler kadar profesyonel veya akademik değil. Alternatifler daha güzel ve en iyi programcıları çekiyorlar. Örneğin, ruby ​​ve python'un ikisi de etkileşimli kabuklara, iyi işlevsel özelliklere ve temiz sözdizimine sahiptir. Kullanımı çok daha eğlenceli. Paylaşılan web hosting pazar payının yanı sıra neden php kullanın?
Keyo

8
"Sadece iki tür dil vardır: insanların şikayet ettikleri ve kimsenin kullanmadığı diller." Bjarne Stroustrup. Meditasyon.
Sylverdrag


5
Stroustrup, C ++ 'ın insanların kaltak olduğu dillerden biri olduğu için sinirlendi.
SADECE benim doğru görüşüm

8

Bir dilin nesne yöneliminin gerçekten iki tanımı vardır: nesne yönelimli kendi yerleşik sözdizimi ve standart kütüphanelerdir ve programcıların bunun için yazdığı yazılım üzerinde ne gibi etkileri vardır.

İlk tanım gereği PHP listenin en altına doğru görünüyor. İnsanlar genellikle nesne olmayan dizeleri ve dizileri bunun kanıtı olarak gösterirler. Bence bu tanım gerçekten önemli değil. Eğer gerçekten ihtiyacınız varsa onu her zaman bir nesneye sarabilirsiniz , ama insanlar buna ihtiyaç duymadıkları için yapmazlar. Genellikle koduna bunu yapacak tek fark değişiyor function(var)için var.function(). Sadece sözdizimi OOP olmayandan OOP'a bir şey değiştirmez.

İkinci tanıma gelince, insanlar bu tür yapıları kuvvetle uygulayan dillerde bile kötü nesne yönelimli kod yazmayı başarırlar ve iyi nesne yönelimli kod yazan insanlar sözdizimsel tuhaflıklardan rahatsız olmak dışında dilden neredeyse hiç etkilenmezler. Başka bir deyişle, tecrübelerime göre, kötü nesne yönelimli diller yok, sadece kötü nesne yönelimli programcılar var . PHP bu konuda diğer diller kadar iyidir.

Belki bazı diller nesne yönelimli programlamayı öğrenmek için daha uygundur , ancak bunun geliştiriciye göre değişeceğini düşünüyorum. Benim için, Larry Wall'un perl'in nasıl çalıştığı (yaptı?) Hakkında deve kitabını okuyana kadar tıklamadı. Bir sınıfa ait referansları açık bir şekilde kutsamak zorunda kalmak, bir nesnenin örneğinin gerçekte ne olduğu ile sınıfın ne olduğunun gerçek anlamını bana getirdi. Bazı insanlar Java'nın her zaman öğrenme nesnesi yaklaşımından yanalar. OOP daha mimari bir kaygı olduğundan, temel değişkenleri, ifadeleri, sıralamayı, seçimi ve yinelemeyi öğrendikten sonra öğrenmek daha kolaydır, bu yüzden hemen OOP'yi önlemeyen herhangi bir dilin bence bir eğitim avantajı vardır.

Eşim java ile programlama dersine giriş yaptığında, public static void mainher şey tarafından bir sınıfta sürekli hayal kırıklığına uğradı ve her şeyi henüz anlayabilecek bir geçmişi olmayan bir sınıfa koydu, ancak öğretmeni tarafından sadece ona ihtiyaç duyduğuna güvenmesi söylendi. Bunu açıklamaya çalıştım, ancak kodun diğer bölümlerinin bunlara erişmesini önlemenin neden yararlı olduğunu ve nasıl bölüneceğine nasıl karar verileceğini değişkenleri zar zor öğrenen birine anlatmak çok zor. Prosedürel programlamanın öğrenilmesinin önce kötü alışkanlıklar getirdiğini iddia edebilirsiniz, ama anlamadığınız kodu kopyalama ve yapıştırma alışkanlığı ne olacak?


Görünüşe göre "nesne", "dil", "yönelimli" ve "programlama" terimleri üzerinde anlaşılmamış ve belirsiz ve görecelidir, bu yüzden olası siyah veya beyaz cevap mümkün değildir. Ama yine "siyah" ve "beyaz" üzerinde anlaşmaya varılmamıştır ve anlamları anlaşılmazdır, vb.
Vs

5

PHP nesne yönelimli programlama için fena değil . Bununla birlikte, PHP'nin doğası, doğru nesne yönelimli yazılım geliştirmeye karşı hızlı saldırıları ve düzeltmeleri teşvik eder ve birçok kitap ve öğretici OOP kavramlarını tamamen görmezden gelir. OOP kavramlarını iyi destekleyebilir, ancak bunları uygulamayı bilmek geliştiricinin sorumluluğundadır. PHP'de Java veya C # gibi "gerçek" bir OOP dilinde yapabileceğiniz çoğu şeyi yapabilirsiniz, ancak bu diller, PHP'den daha fazla OOP tekniklerinin uygulanmasına sahiptir ve bu, seçerseniz prosedürel tarzda kullanılabilir.

Tam alıntı hatırlayamıyorum ama o zaman yeni Ruby on Rails kullanarak ham PHP karşılaştıran biri oldu ve böyle bir şey gitti: Rails iyi kod yazmayı kolay ve kötü kod zor yazma yapar. PHP kötü kod yazmayı kolaylaştırır ve iyi kod yazmayı zorlaştırır. PHP ile ilgili çizgi hemen OOP üzerinde özetliyor; iyi bir OO dili olma yeteneğine sahiptir, ancak bunu yapmak biraz daha zorlaşır.


4

PHP Kategorize

PHP sadece BASH veya Perl gibi bir tutkal dilidir . Bu konuda iyi, ama başka hiçbir şeyde iyi değil, bazı ciddi işleri ayırın. Dil tasarlanmamıştır. Sadece çeşitli kodları gelişigüzel bir şekilde hackleyerek geliştirilir (kod ve düzeltme).

Derlenmiş Diller

PHP'nin aksine Java, uygun şekilde tasarlanmış derlenmiş bir dildir. Dili tanımlayan JSR'ler, EJB, JMS, ESB, Spring, Struts, Hibernate ve diğerleri gibi birçok kurumsal düzeyde çerçeve ve kavramlar vardır.

Kurumsal yazılım

Kurumsal sistemler açısından, Java EE amaca uygun bir çözümdür (Enterprise Edition), PHP ise daha az niteliklere sahip ucuz bir işgücü kiralayarak maliyetleri düşürmeye çalışan şirketlerde kullanılmaktadır.

Çeşitli çerçeveler kullanarak PHP'yi Enterprise segmentine sürüklemek için büyük çaba sarf edilmiştir. En önemlisi, Zend Framework 2 . Buradaki temel sorun PHP'nin nesne yönelimi değildir, ancak tasarım eksikliği, güçlü yazım eksikliği, standart sorunlara standart olmayan çözümler (her şey için bir tür hack) ve öngörülen herhangi bir mimarinin tamamen eksikliğidir.

Yazılım Tasarımı (Tartışılan Mimari)

PHP ile, mimarlık yazılımının yükü hala çok kötü bir iş yapan geliştiricilere kalmış, yani herhangi bir mimariye sahip değil, sadece rastgele kod ve düzeltme. Güvenlik ve işlemler eksiktir ve geliştiriciler tarafından ayakkabı giydirilmelidir. Java'da bir çözüm açıklamalı EJB'dir. Ayrıca, PHP'de istisnaları atlamayı veya çeşitli hatalar yapmayı hiçbir şey yapmaz. Bu, çalışma zamanına kadar. Java ile uyarı ve hataları doğrudan tasarım zamanında alırsınız. Buna sağlamlık denir, ancak PHP ile sadece hayal kurmaya devam edebilirsiniz.

Çok iş parçacığı

PHP çok iş parçacığı kullanımını desteklemez. Kod her zaman tek bir iş parçacığıdır. Bu, ağır yük altında önemsiz sorunlar için performansını engeller. Java EE ile, çoklu iş parçacığı, örneğin Runnable arabirimi aracılığıyla tam olarak desteklenir.

Destek ve Standartlar

Ayrıca dağıtımı, Web Hizmetlerini ve diğer standartları da göz önünde bulundurun. Java'da Oracle, IBM, RedHat, Apache ve diğerleri gibi büyük şirketler varken PHP'nin sadece Zend'i var.

Sonuç

Sonuç olarak, PHP çok kötü bir nesne yönelimli dildir. Açıkçası, nesne yönelimli değil, aynı zamanda> 5 sürümlerinden kötü olan melezdir, çünkü OOP prosedürel programlama ile karıştırılmıştır. PHP'yi BASH gibi bir yapıştırıcı olarak tavsiye ederim, ancak ciddi işler için Java EE kullanırım.

İlgili Düşünceler

En son Zend Framework 2 ile ana anlaşma, Java EE gibi olmaya çalıştığı, ancak en azından uzaktan karşılaştırılabilir mevcut paketler, özellikler, araçlar, otomasyon, hata kontrolü, mimari, tasarım ve herşey.

Deneyimlerime göre, PHP'yi karmaşık projeler için Java ile kullanmak daha pahalıdır.

PHP'nin Oldukça Korkunç Programlama'yı temsil ettiği gibi bazı söylentiler de var . Bunları onaylayabilirim.


3

Bir dil OOP'yi ne kadar iyi işler? Bir programı OO yolunda ne kadar iyi yazabileceğimi sormayı tercih ederim. Her şeyi herkese açık hale getirerek Java'nın aldığı her şeyde durdurabilirim .
PHP OOP'yi destekler; beni sadece OO tarzında yazmaya zorlamıyor. Ne kadar iyi işlediği, programı ne kadar iyi anladığım ve nesneyi yönelten bir şekilde yazdığımma bağlıdır.


2

PHP Özellikleri destekler ! (başlangıç ​​5.4) . Yatay yeniden kullanımı yerel olarak işleyebilen herhangi bir dil, kitabımda yeterince iyi bir OO dilidir.


1

Bir dili daha çok OO yapan ve onu böyle yapan nedenler olduğunu düşünmeliyiz.

JavaScript, ECMAScript'in yorumlanmış bir dil olarak tarayıcı ortamında çalıştırılması amaçlanan bir uygulamasıdır . Yorumlandığı düşünülen dilin sözdizimsel / davranışsal tasarımı üzerinde çok büyük etkisi oldu.

Örneğin, OOP'yi izlemez. Ancak bunun dışında birçok gerçek var, OO prgrammer fonksiyon kaldırma gibi bazı davranışlarını çok kafa karıştırıcı bulabilir.

Yine C ++, Java, C # gibi OO dilleri ile gelen birçok şey var, bu da derleyiciyi güçlü yazma gibi verimli hale getiriyor . Bununla birlikte, JS yorumlanmış bir ortamda çalıştığı için gevşek yazım yerine güçlü yazmayı izlemez .

Yukarıdaki davranışsal farklılıkların yanı sıra JS gibi C # programcılarını çok iyi karıştırabilecek Nesne Değişimi gösterimine sahip birçok sözdizimsel farklılık vardır . Bununla birlikte, C #, dil derlenmiş olmasına ve geleneksel olarak OO kod stili olmadığı için bu sözdiziminin nadiren kullanılmasına rağmen, sözdizimi gibi Nesne değişmezine sahiptir.

Şimdi, dilin iyi olup olmadığını belirleyen bir nokta daha var OO: C ++ 'dan evrildi mi? Java, C #, C ++ 'dan gelişip benzer davranış ve sözdizimini takip ederken , büyük bir topluluk bu davranış ve sözdizimini tek OO olayı olarak algılar ve bu benzerlikleri engellemeyen herhangi bir dilin OO olmadığını düşünür.

Ancak OO'nun çok soyut bir kavram olduğunu ve herhangi bir sözdizimi stiline ve hatta herhangi bir belirli davranışsal özelliğe bağlı olmadığını unutmayalım.

Ve PHP çok iyi OO. Java, C ++, C # gibi görünmüyor ve hissetmiyor, OO dilini zayıflatmıyor. Peki C ++ sonra Java ve sonra C # öğrendim.

Yani, şimdiye kadar başım çok iyiydi OO. Sonra JS'yi çok iyi bir kitap olan "Wrox Pro" dan öğrendim ve bu sadece beni çok etkiledi. Sadece JS'nin davranışından ve sözdizimsel farklılığından keyif aldım. Sonra sözdizimi gibi Object değişmez kendi C # olduğunu fark ettim. Ve şimdi PHP öğrenirken her iki dünyadan da birçok şey getiriyormuş gibi hissediyorum.

Gerçekten tek yapmamız gereken, bir dilin OO'yu uygularken sözdizimi ve davranış inceliklerini öğrenmek. Onlara hakim olduktan sonra, bunun daha iyi OO uygulaması olduğunu düşünmeye başlayabiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.