Quanto è orientato agli oggetti PHP? [chiuso]


13

Ho avuto la possibilità di avere una conversazione interessante con i miei colleghi. 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 a partire da PHP 5.2 o 5.3. Ho sbagliato? Non sto cercando di ottenere una risposta sì / no, ma vorrei sentire più opinioni dagli sviluppatori.


Ho risposto qui
Martin Wickman,

12
le lingue non sono male, i programmatori lo sono

@Jarrod Roberson: le lingue sono innate, come mai? In tal caso, si prega di fare riferimento alla ricerca a sostegno di questa affermazione, poiché sono molto interessato a leggerlo.
errori

4
@Jarrod, ci sono alcune lingue legittime, specialmente quando sono nelle loro prime versioni. Mi vengono in mente le prime versioni di Actionscript, Javascript, Java e PHP.
Giordania,

2
@JarrodRoberson, quindi i programmatori che hanno progettato PHP ...
dan_waterworth

Risposte:


34

PHP 5.3 in realtà ha un supporto abbastanza decente per OOP.

Il problema con PHP per quanto riguarda OOP è che OOP era davvero legato al linguaggio, mentre in linguaggi come Java e ActionScript fa parte del concetto centrale, anche se considero entrambi i linguaggi OOP cattivi a causa della loro scarsa semantica degli oggetti.

Anche se PHP al giorno d'oggi è ampiamente adatto a OOP, il problema è che:

  1. la stragrande maggioranza del codice di base (librerie, framework, codice personalizzato) non è scritto in PHP 5.3
  2. la stragrande maggioranza delle API è procedurale. arrayè ancora il tipo più importante e più usato 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 la programmazione procedurale in una delle sue forme più pure, ma favorisce chiaramente l'uso di OOP.

PHP non può semplicemente sbarazzarsi di tutte le cose legacy. Se un PHP 6 venisse rilasciato, questo lo getta via, probabilmente non verrebbe usato. Avrebbe sconfitto il suo scopo.
E PHP non è riuscito ad assumere un ritmo sufficiente per deprecare gradualmente le cose. Quindi ci vorrà del tempo prima che ottenga la chiarezza e la coerenza necessarie che un buon linguaggio dovrebbe avere.

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

Riassumendo: non c'è nulla di particolarmente sbagliato nelle strutture OOP di PHP. Pertanto si potrebbe dire che non è un linguaggio OO male . Tuttavia, ci sono molte cose particolarmente sbagliate con PHP, come le strutture OOP che non sono realmente integrate , ma piuttosto solo incluse , quindi potresti obiettare che è un linguaggio OO scadente .


4
Per curiosità, potresti spiegare perché pensi che Java sia un cattivo OOP?
dkuntz2,

2
Ahem .. Potrei aggiornare la tua risposta in modo specifico per Actionscript 3 . Prima di ciò, Actionscript non era progettato per essere OO (essendo basato su ECMA) e anche Actionscript 2 era semplicemente un wrapper per AS1.
Demian Brecht,

1
Sono anche curioso di
sapere

2
@Demian Brecht: Douglas Crockford sembra relativamente convinto JavaScript (qualsiasi script ECMA) è OO: javascript.crockford.com/javascript.html
back2dos

2
Una distinzione che lo riassume bene: PHP è capace di oggetti, non orientato agli oggetti.
Vartec,

11

Scoprirai che " può gestire " non è lo stesso di " supporti ". Voglio dire, in fondo alle chiacchiere, anche C " può gestire " OOP se strutturi correttamente il tuo codice. La domanda è se la lingua vada oltre la semplice abilitazione di OOP a incoraggiarla rendendo OOP il modo più naturale di programmare.

Nella mia (certamente limitata) esperienza, i dialetti PHP 5.n non lo fanno. È troppo facile uscire da OOP e passare a un codice praticamente puramente procedurale. (Nota che non penso che PHP sia un linguaggio volgare per questo motivo. Ci sono molti motivi per cui penso che PHP sia un linguaggio volgare, ma il supporto OOP non è uno di questi.;)


12
Amico, potrei continuare per anni, Luna. Ecco un frammento di codice che non riesce: $e = function_that_returns_an_array()[0];. Ecco cosa dovete fare per risolvere il problema: $a = function_that_returns_an_array(); $e = $a[0];. Le lingue la cui sintassi non ti consente di utilizzare direttamente il risultato di una chiamata di funzione mi spuntano. Inoltre, dimmi che cosa il numero è in decimale: 0246875. (Suggerimento: non sarai in grado di trovare un modo più stupido per implementare quel lexer!) PHP è semplicemente pieno di questo tipo di stupidità.
SOLO IL MIO OPINIONE corretta,

6
@Moon Ecco alcune letture per te: softwarebashing.org/blog/2009/09/php-the-ultimate-suck e tommorris.org/wiki/PHP%20Sucks Ci sono alcuni problemi seri, ma molti sono solo chiacchiere picking. Quello che odio davvero di PHP è la cultura, semplicemente non è professionale o accademica come le alternative, vale a dire rubino e pitone. Le alternative sono più belle e attirano i migliori programmatori. Ad esempio ruby ​​e python hanno entrambi shell interattive, caratteristiche funzionali decenti e sintassi pulita. Sono molto più divertenti da usare. Oltre alla quota di mercato nell'hosting web condiviso, perché usare php?
Keyo,

8
"Esistono solo due tipi di lingue: quelle di cui le persone si lamentano e quelle che nessuno usa." Bjarne Stroustrup. Meditare.
Sylverdrag,


5
Stroustrup è semplicemente incazzato che il C ++ sia una delle lingue di cui la gente parla.
SOLO IL MIO OPINIONE corretta,

8

Esistono in realtà due definizioni dell'orientamento agli oggetti di un linguaggio: il modo in cui l'orientamento agli oggetti è la sua sintassi incorporata e le librerie standard, e quale influenza ha sui programmatori di software che scrivono per esso.

Secondo la prima definizione, PHP sembra essere in fondo alla lista. Le persone spesso citano stringhe e matrici non oggetto come prova di ciò. Secondo me, questa definizione non ha molta importanza. Puoi sempre avvolgerlo in un oggetto se ne hai davvero bisogno , ma le persone non lo fanno perché non lo fanno. Di solito 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 impongono fortemente 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 linguaggi orientati agli oggetti cattivi, ma solo programmatori orientati agli oggetti cattivi . PHP è buono come qualsiasi altra lingua al riguardo.

Forse alcuni linguaggi sono più adatti all'apprendimento della programmazione orientata agli oggetti, ma penso che differirà a seconda dello sviluppatore. Per me, non ha fatto clic finché non ho letto il libro sui cammelli di Larry Wall su come il perl fa (ha fatto?) OOP. Dover benedire esplicitamente i riferimenti in quanto appartenenti a una classe mi ha portato a chiarire cosa sia realmente un'istanza di un oggetto rispetto a cosa sia una classe. Alcune persone preferiscono l'approccio Java per tutti gli oggetti per tutto il tempo per l'apprendimento. Poiché OOP è più una preoccupazione architettonica, è più facile da imparare dopo aver conosciuto variabili di base, espressioni, sequenza, selezione e iterazione, quindi qualsiasi linguaggio che non si oppone immediatamente a OOP ha un vantaggio educativo secondo me.

Quando mia moglie ha fatto un'introduzione al corso di programmazione con Java, è stata costantemente frustrata dal public static void mainmettere tutto in una classe, che non aveva ancora le basi per capire, ma le è stato detto dal suo insegnante solo di fidarsi di averne 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 dividerlo. Potresti sostenere che l'apprendimento della programmazione procedurale prima inculca le cattive abitudini, ma che dire dell'abitudine di copiare e incollare il codice che non capisci?


Sembra che i termini "oggetto", "linguaggio", "orientato" e "programmazione" non siano stati concordati e siano ambigui e relativi, quindi non è possibile alcuna risposta in bianco e nero. Ma ancora "nero" e "bianco" non sono concordati e il loro significato è sfuggente, ecc. Ecc. Ecc.
Tulains Córdova,

5

PHP non è male per la programmazione orientata agli oggetti. Tuttavia, la natura di PHP incoraggia gli hack e le correzioni rapide rispetto al corretto sviluppo di software orientato agli oggetti, e molti libri e tutorial ignorano del tutto i concetti di OOP. Può supportare bene i concetti di OOP, ma è compito dello sviluppatore sapere applicarli. Puoi fare qualsiasi cosa in PHP che potresti fare in un "vero" linguaggio OOP come Java o C #, ma quei linguaggi hanno una maggiore applicazione delle tecniche OOP rispetto a PHP, che potrebbe essere usato stile procedurale se lo scegliessi.

Non riesco a ricordare la citazione esatta, ma è stata da qualcuno che ha confrontato il PHP grezzo all'utilizzo del nuovo Ruby on Rails, e ha fatto qualcosa del genere: Rails rende facile scrivere un buon codice e scrivere male il codice. PHP semplifica la scrittura di codice errato e rende difficile la scrittura di codice errato. La linea su PHP riassume praticamente su OOP; è perfettamente in grado di essere un buon linguaggio OO, ma rende un po 'più difficile farlo.


4

PHP classificato

PHP è solo un linguaggio colla proprio come BASH o Perl. È bravo in questo, ma non bravo in nient'altro, lascia a parte qualche lavoro serio. La lingua non è progettata Si è semplicemente evoluto hackerando vari codici insieme in modo casuale (code-and-fix).

Lingue compilate

A differenza di PHP, Java è un linguaggio compilato che è stato correttamente progettato. Esistono JSR che definiscono il linguaggio, 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 viene utilizzato in aziende che stanno cercando di ridurre i costi assumendo manodopera a basso costo con qualifiche inferiori.

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 agli oggetti di PHP, ma è la mancanza di progettazione, la mancanza di una digitazione forte, soluzioni non standard a problemi standard (tipo di hack per tutto) e una completa mancanza di qualsiasi architettura prescritta.

Progettazione software (architettura discussa)

Con PHP, l'onere del software di architettura è ancora completamente a carico degli sviluppatori che hanno svolto un lavoro molto scarso, cioè spesso non hanno alcuna architettura, solo codice e correzione casuali. La sicurezza e le transazioni mancano e devono essere messe da parte dagli sviluppatori. In Java, una soluzione è EJB con annotazioni. Considera anche il fatto che, in PHP, non succede nulla se ometti di rilevare eccezioni o commetti vari errori. Questo fino al runtime. Con Java, riceverai avvisi ed errori direttamente in fase di progettazione. Questo si chiama robustezza, ma con PHP puoi solo continuare a sognare.

multithreading

PHP non supporta il multithreading. Il codice è sempre un singolo thread. Ciò 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

Considera 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 è male dalle versioni> 5 perché OOP è confuso con la programmazione procedurale. Consiglierei PHP solo come una colla come BASH, ma per lavori seri utilizzerei Java EE.

Pensieri Correlati

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

Secondo la mia esperienza, è più costoso usare PHP per progetti complessi che con Java.

Ci sono anche alcune voci come PHP sta per Pretty Horrible Programming . Posso confermare questi.


3

Quanto bene una lingua gestisce OOP? Preferirei chiedere quanto posso scrivere un programma in modo OO. Riesco a sfogliare il naso con una posizione che dovrebbe essere una classe presa da Java rendendo tutto pubblico statico .
PHP supporta OOP; non mi costringe a scrivere solo in maniera OO. Quanto bene gestisce dipende da quanto bene capisco e scrivo il programma in modo orientato agli oggetti.


2

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


1

Bene, dobbiamo pensare a ciò che rende una lingua più OO e quali ragioni ci sono che l'hanno resa così.

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

Ad esempio, non segue OOP. Ma a parte questo ci sono molti fatti simili, il programmatore OO potrebbe trovare alcuni dei suoi comportamenti come il sollevamento di funzioni molto confusi.

Ancora una volta ci sono molte cose che sono arrivate con i linguaggi OO come C ++, Java, C # per renderli compilatori efficienti come la tipizzazione forte . Tuttavia, poiché JS viene eseguito in un ambiente interpretato, non segue una digitazione forte, ma è un linguaggio tipicamente diffuso .

A parte le differenze comportamentali di cui sopra, ci sono molte differenze sintattiche come JS hanno la notazione letterale a oggetti che può confondere molto bene i programmatori C #. Tuttavia, C # ha anche la sintassi letterale degli oggetti, anche se è un linguaggio compilato e tale sintassi viene usata raramente in quanto non è tradizionalmente stile di codice OO.

Ora c'è un altro punto che determina se il linguaggio è buono OO: è evoluto dal C ++. Come Java, C # si sono evoluti da C ++ e seguono comportamenti e 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 semplicemente non sia OO.

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

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

Quindi, fino ad ora la mia testa era molto bene OO. Poi ho imparato JS da un ottimo libro "Wrox Pro", e mi ha esagerato. Mi è solo piaciuto il comportamento e la distinzione sintattica di JS. Poi mi rendo conto che Object in letterale sintassi era nella loro in C #. E ora mentre apprendo PHP mi sento come se porti molte cose da entrambi i mondi.

Tutto quello che dobbiamo fare è imparare la sintassi e le sottigliezze comportamentali di una lingua durante l'implementazione di OO. Una volta che li padroneggiamo, possiamo iniziare a pensare che si tratti di una migliore implementazione OO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.