Quanto è orientato agli oggetti il PHP? [chiuso]

13

Ho avuto la possibilità di avere una conversazione interessante con i miei colleghi di lavoro. Molti di questi sono script di azioni flash o sviluppatori Java.

Abbiamo parlato di come php gestisce OOP. Ho detto che PHP può gestire quasi tutte le cose OOP come da PHP 5.2 o 5.3. Ho sbagliato? Non sto cercando di ottenere risposta sì / no, ma mi piacerebbe sentire più opinioni dagli sviluppatori.

    
posta user23583 21.05.2011 - 11:40
fonte

8 risposte

34

PHP 5.3 ha in realtà un supporto discreto per OOP.

Il problema con PHP rispetto a OOP è che OOP è stato appena imbullonato alla lingua, mentre in linguaggi come Java e ActionScript fa parte del concetto di base, anche se considero entrambi i cattivi linguaggi OOP a causa del loro scarso semantica degli oggetti.

Anche se oggigiorno PHP è largamente adatto per OOP, il problema è che:

  1. la maggior parte della base di codici là fuori (librerie, framework, codice personalizzato) non è scritta in PHP 5.3
  2. la stragrande maggioranza dell'API è procedurale. array è ancora il tipo più importante e più utilizzato e non è un oggetto.
  3. la stragrande maggioranza dei programmatori PHP si limiterà a seguire lo stile procedurale nel prossimo futuro. PHP non promuove OOP, al contrario di Objective-C per esempio: Objective-C ha C come sottoinsieme completo e quindi consente programmazione procedurale in una delle sue forme più pure , ma chiaramente favorisce l'uso di OOP.

PHP non può semplicemente sbarazzarsi di tutto ciò che è legacy. Se è stato rilasciato un PHP 6, che getta la maggior parte di esso, probabilmente non verrebbe utilizzato. Avrebbe sconfitto il suo scopo.
E PHP non è riuscito ad assumere un ritmo sufficiente a deprecare gradualmente le cose. Quindi ci vorrà un po 'di tempo prima che abbia la chiarezza e la coerenza necessarie di un buon linguaggio.

Personalmente, non mi piace il PHP, semplicemente a causa di tutto quel bagaglio, dell'API e di tutto.
Tuttavia framework come Flow3, Symfony, CakePHP e Codeigniter forniscono una solida base per OOP e altri potenti paradigmi. A causa della limitatezza di ActionScript e Java, con uno sforzo sufficiente (un livello di astrazione in cima ai difetti di PHP), PHP può essere alla pari o addirittura superarli.

Riassumendo: non c'è niente di particolarmente sbagliato con le strutture OOP di PHP. Quindi potresti dire che non è una cattiva lingua OO . Tuttavia ci sono molte cose che sono in particolare sbagliate in PHP, come le funzionalità di OOP che non sono in realtà integrate , ma piuttosto solo incluse , quindi potresti dire che è un cattivo linguaggio OO.

    
risposta data 21.05.2011 - 12:31
fonte
11

Scoprirai che " può gestire " non è lo stesso di " supporta ". Voglio dire, giù ai polizieschi, anche C " può gestire " OOP se si struttura correttamente il codice. La domanda è se la lingua va oltre il semplice permetter OOP di incoraggiarlo, rendendo OOP il modo più naturale per programmare.

Nella mia esperienza (certamente limitata) i dialetti di PHP 5.n non lo fanno. È troppo facile scivolare fuori da OOP e in un codice puramente procedurale. (Nota che non penso che PHP sia un linguaggio cattivo per questo motivo Ci sono molte ragioni per cui penso che PHP sia un linguaggio scurrile, ma il supporto OOP non è uno di questi.;))

    
risposta data 21.05.2011 - 12:13
fonte
8

Esistono due definizioni dell'orientamento agli oggetti di un linguaggio: il modo in cui l'object oriented è costruito in sintassi e nelle librerie standard, e quale influenza ha sui programmatori di software scrivere per esso.

Secondo la prima definizione, PHP sembra essere in fondo alla lista. Le persone citano spesso stringhe e array non-object come prova di ciò. Secondo me, questa definizione non ha molta importanza. Puoi sempre racchiuderlo in un oggetto se davvero hai bisogno di uno, ma le persone no perché non lo fanno. Solitamente l'unica differenza che farà al codice sta cambiando function(var) in var.function() . La sintassi da sola non cambia qualcosa da non-OOP a OOP.

Per quanto riguarda la seconda definizione, le persone riescono a scrivere codice scarsamente orientato agli oggetti anche in linguaggi che rafforzano strongmente tali costrutti, e le persone che scrivono un buon codice orientato agli oggetti sono a malapena influenzate dal linguaggio, tranne per essere infastidite da stranezze sintattiche. In altre parole, nella mia esperienza, non ci sono cattivi linguaggi orientati agli oggetti, solo programmatori orientati male agli oggetti . PHP è buono come qualsiasi altra lingua al riguardo.

Forse alcune lingue sono più adatte per la programmazione orientata agli oggetti di apprendimento , ma penso che sarà diversa per lo sviluppatore. Per me, non ha fatto clic finché non ho letto il libro sui cammelli di Larry Wall su come perl (o?) Ha fatto OOP. Dovendo benedire esplicitamente i riferimenti come appartenenti a una classe, in realtà ho portato a casa il punto di ciò che un'istanza di un oggetto è in realtà contro ciò che è una classe. Alcune persone preferiscono l'approccio all-objects-all-the-time di Java per l'apprendimento. Poiché OOP è più una questione architettonica, è più facile da imparare dopo aver conosciuto le variabili di base, le espressioni, la sequenza, la selezione e l'iterazione, quindi qualsiasi linguaggio che non ponga OOP direttamente su di te ha un vantaggio educativo a mio parere.

Quando mia moglie introdusse un programma di programmazione con java, era costantemente frustrata dal public static void main e metteva tutto in una classe, che non aveva ancora le basi per capire, ma gli era stato detto solo dal suo insegnante fidarsi di lei ne aveva bisogno. Ho cercato di spiegarlo, ma è molto difficile spiegare a qualcuno che ha appena imparato a conoscere le variabili perché sarebbe utile impedire ad altre parti del codice di accedervi e come decidere come suddividerlo. Si potrebbe sostenere che l'apprendimento della programmazione procedurale inculca innanzitutto le cattive abitudini, ma che dire dell'abitudine di copiare e incollare il codice che non si capisce?

    
risposta data 21.05.2011 - 18:50
fonte
5

PHP non è cattivo per la programmazione orientata agli oggetti. Tuttavia, la natura di PHP incoraggia gli attacchi e le correzioni rapidi rispetto al corretto sviluppo del software orientato agli oggetti e molti libri e tutorial ignorano completamente i concetti di OOP. Può supportare i concetti OOP bene, ma è responsabilità dello sviluppatore sapere di applicarli. Puoi fare praticamente tutto ciò che in PHP puoi fare in un linguaggio OOP "vero" come Java o C #, ma quelle lingue hanno una maggiore applicazione delle tecniche OOP rispetto a PHP, che potrebbe essere usato come stile procedurale se hai scelto.

Non riesco a ricordare la citazione esatta ma è stato da qualcuno che ha confrontato PHP non elaborato con l'allora nuovo Ruby on Rails, ed è andato qualcosa del genere: Rails rende facile scrivere codice e scrivere codice errato . PHP rende facile la scrittura di codice errato e rende difficile scrivere bene il codice. La riga su PHP lo riassume piuttosto in OOP; è perfettamente in grado di essere un buon linguaggio OO, ma rende un po 'più difficile farlo.

    
risposta data 08.06.2011 - 21:52
fonte
4

PHP Categorizzato

PHP è solo una lingua della colla proprio come BASH o Perl. Va bene, ma non va bene in qualsiasi altra cosa, lascia a parte qualche lavoro serio. La lingua non è progettata. Si è semplicemente evoluto hackerando insieme vari codici in modo casuale (code-and-fix).

Lingue compilate

Diversamente da PHP, Java è un linguaggio compilato che è stato progettato correttamente. Esistono JSR che definiscono la lingua, molti framework e concetti di livello enterprise come EJB, JMS, ESB, Spring, Struts, Hibernate e altri.

Software aziendale

In termini di sistemi aziendali, Java EE è una soluzione adatta allo scopo (Enterprise Edition) mentre PHP è utilizzato in aziende che stanno cercando di ridurre i costi assumendo una manodopera a basso costo con meno qualifiche.

C'è stato un notevole sforzo per trascinare PHP nel segmento Enterprise usando vari framework. In particolare, Zend Framework 2 . Il problema fondamentale qui non è l'orientamento all'oggetto di PHP, ma è la mancanza di progettazione, manca una strong tipizzazione, soluzioni non standard ai problemi standard (una specie di hack per ogni cosa) e una completa mancanza di qualsiasi architettura prescritta.

Progettazione software (architettura discussa)

Con PHP, l'onere del software di progettazione è ancora pienamente agli sviluppatori che hanno svolto un lavoro molto scarso, spesso senza alcuna architettura, solo codice e correzione casuali. La sicurezza e le transazioni sono mancanti e devono essere snocciolate dagli sviluppatori. In Java, una soluzione è EJB con annotazioni. Considera anche il fatto che, in PHP, non succede nulla se si omettono di rilevare eccezioni o di commettere vari errori. Questo è fino al tempo di esecuzione. Con Java, riceverai avvisi ed errori direttamente in fase di progettazione. Questo si chiama robustezza, ma con PHP puoi continuare a sognare.

Multithreading

PHP non supporta il multithreading. Il codice è sempre un singolo thread. Questo ostacola le sue prestazioni per problemi non banali sotto carico più pesante. Con Java EE, il multithreading è completamente supportato, ad esempio tramite l'interfaccia Runnable.

Supporto e standard

Considerare anche la distribuzione, i servizi Web e altri standard. Mentre in Java ci sono grandi aziende come Oracle, IBM, RedHat, Apache e molte altre, PHP ha solo Zend.

Conclusione

Per concludere, PHP è un pessimo linguaggio orientato agli oggetti. A rigor di termini, non è nemmeno orientato agli oggetti, ma ibrido che non va bene dalle versioni di > 5 perché OOP è confuso con la programmazione procedurale. Vorrei solo raccomandare PHP come colla come BASH, ma per il lavoro serio userei Java EE.

Pensieri correlati

L'accordo principale con l'ultimo Zend Framework 2 è che sta cercando di essere come Java EE, ma non riesce a fornire almeno un insieme paragonabile di pacchetti, funzionalità, strumenti, automazione, controllo degli errori, architettura, design e tutto.

È, secondo la mia esperienza, più costoso usare PHP per progetti complessi rispetto a Java.

Ci sono anche alcune voci come quelle in cui PHP sta per Pretty Horrible Programming . Posso confermarli.

    
risposta data 01.01.2013 - 05:28
fonte
3

Quanto bene un linguaggio gestisce l'OOP? Preferirei chiedere quanto bene posso scrivere un programma in modo OO. Posso annusare il mio punto di vista di tutto-dovrebbe-essere-classe presa da Java rendendo tutto statico pubblico .
PHP supporta OOP; non mi costringe a scrivere solo in modo OO. Quanto bene gestisce dipende da quanto bene comprendo e scrivo il programma in modo orientato agli oggetti.

    
risposta data 21.05.2011 - 21:10
fonte
2

PHP supporta Tratti! (a partire dal 5.4) . Qualsiasi linguaggio in grado di gestire il riutilizzo orizzontale in modo nativo è un linguaggio OO abbastanza buono nel mio libro.

    
risposta data 21.05.2011 - 22:07
fonte
1

Bene, dobbiamo pensare a cosa rende un linguaggio più OO e quali sono le ragioni che lo hanno reso così.

JavaScript è un'implementazione di ECMAScript che significava essere eseguito nell'ambiente del browser come lingua interpretata . Il fatto che si pensi che il linguaggio sia interpretato ha avuto un grande impatto sul suo design sintattico / comportamentale.

Ad esempio, non segue OOP. Ma a parte questo ci sono molti fatti come, OO prgrammer potrebbe trovare alcuni dei suoi comportamenti come sollevamento delle funzioni molto confuso.

Anche in questo caso ci sono molte cose con i linguaggi OO come C ++, Java, C # per renderli efficienti come strong tipizzazione . Tuttavia, poiché JS viene eseguito in ambiente interpretato, non segue una digitazione strong, ma è una lingua tipicamente blandata .

Oltre alle differenze comportamentali di cui sopra ci sono molte differenze sintattiche come JS hanno Notazione letterale oggetto che può benissimo confondere i programmatori C #. Comunque C # ha anche una sintassi di tipo Object letterale, anche se è un linguaggio compilato e tale sintassi viene usata raramente in quanto non è tradizionalmente lo stile del codice OO.

Ora c'è un altro punto che determina se la lingua è buona OO: è evoluta da C ++. Come Java, i C # si evolvono dal C ++ e seguono un comportamento e una sintassi simili, una grande comunità percepisce tale comportamento e sintassi come l'unica cosa OO e pensa che qualsiasi linguaggio che non inibisca tali somiglianze sia semplicemente non OO.

Tuttavia, non dimentichiamo che OO è un concetto molto astratto, non è legato ad alcuno stile di sintassi e nemmeno a una specifica proprietà di comportamento.

E PHP è molto buono OO. Semplicemente non guardare e sentirsi come Java, C ++, C # non lo rende un linguaggio OO scadente. Bene ho imparato C ++ poi Java e poi C #.

Quindi, fino ad ora la mia testa era molto buona OO. Poi ho imparato JS da un ottimo libro "Wrox Pro", e mi ha sopraffatto. Ho appena apprezzato il comportamento e la distinzione sintattica di JS. Poi mi rendo conto che l'oggetto letterale come la sintassi era nel loro in C #. E ora, mentre imparo PHP, mi sento come se portasse molte cose da entrambi i mondi.

Tutto quello che dobbiamo fare è imparare la sintassi e le sottigliezze del comportamento di una lingua durante l'implementazione di OO. Una volta che li abbiamo padroneggiati, potremmo iniziare a pensare che questa sia l'implementazione OO migliore.

    
risposta data 01.01.2013 - 06:48
fonte

Leggi altre domande sui tag