Wie objektorientiert ist PHP? [geschlossen]

13

Ich hatte Gelegenheit, ein interessantes Gespräch mit meinen Mitarbeitern zu führen. Die meisten von ihnen sind Flash-Action-Skripte oder Java-Entwickler.

Wir haben darüber gesprochen, wie gut PHP mit OOP umgeht. Ich sagte, dass PHP mit fast allen OOP-Sachen ab PHP 5.2 oder 5.3 umgehen kann. Liege ich falsch? Ich versuche nicht, eine Ja / Nein-Antwort zu bekommen, aber ich würde gerne mehr Meinungen von Entwicklern hören.

user23583
quelle
Ich habe das hier
Martin Wickman
12
Sprachen sind nicht schlecht, Programmierer sind
@Jarrod Roberson: Sprachen sind angeboren, wie? Wenn ja, beziehen Sie sich bitte auf Forschungsergebnisse, die diese Behauptung stützen, da ich sehr daran interessiert bin, sie zu lesen.
Fehler
4
@Jarrod, es gibt einige rechtmäßig schlechte Sprachen, insbesondere wenn sie in ihren frühen Versionen sind. Frühe Versionen von Actionscript, Javascript, Java und PHP fallen mir ein.
Jordanien
2
@ JarrodRoberson, so die Programmierer, die PHP entworfen ...
dan_waterworth

Antworten:

34

PHP 5.3 unterstützt OOP tatsächlich recht gut.

Das Problem mit PHP in Bezug auf OOP ist, dass OOP wirklich nur an die Sprache gebunden war, wohingegen es in Sprachen wie Java und ActionScript Teil des Kernkonzepts ist, obwohl ich beide schlechten OOP-Sprachen wegen ihrer schlechten Objektsemantik betrachte.

Obwohl PHP heutzutage weitgehend für OOP geeignet ist, besteht das Problem darin, dass:

  1. Der größte Teil des Codes (Bibliotheken, Frameworks, benutzerdefinierter Code) ist nicht in PHP 5.3 geschrieben
  2. Die überwiegende Mehrheit der API ist prozedural. arrayist immer noch der wichtigste und am häufigsten verwendete Typ und es ist kein Objekt.
  3. Die überwiegende Mehrheit der PHP-Programmierer wird in absehbarer Zeit nur noch den prozeduralen Stil beibehalten. PHP fördert OOP nicht, im Gegensatz zu Objective-C, zum Beispiel: Objective-C hat C als vollständige Teilmenge und ermöglicht damit die prozedurale Programmierung in einer seiner reinsten Formen, bevorzugt jedoch eindeutig die Verwendung von OOP.

PHP kann nicht einfach alle alten Sachen loswerden. Wenn ein PHP 6 veröffentlicht würde, das das meiste rauswirft, würde es wahrscheinlich nicht verwendet werden. Es würde seinen Zweck zunichte machen.
Und PHP hat es nicht geschafft, ein ausreichendes Tempo zu erreichen, um die Dinge allmählich zu verwerfen. Es wird also einige Zeit dauern, bis eine gute Sprache die notwendige Klarheit und Konsistenz erreicht.

Persönlich mag ich PHP wirklich nicht, einfach wegen des ganzen Gepäcks, der API und allem.
Frameworks wie Flow3, Symfony, CakePHP und Codeigniter bieten jedoch eine solide Basis für OOP und andere leistungsstarke Paradigmen. Aufgrund der Einschränkungen von ActionScript und Java kann PHP mit ausreichendem Aufwand (eine Abstraktionsebene über PHP-Fehlern) diesen ebenbürtig oder sogar überlegen sein.

Zusammenfassend lässt sich sagen: An den OOP-Funktionen von PHP ist nichts besonders Falsches. Man könnte also sagen, es ist keine schlechte OO- Sprache. Allerdings gibt es eine Menge Dinge , besonders falsch mit PHP, wie die OOP Einrichtungen nicht wirklich ist integriert , sondern nur enthalten , daher argumentieren Sie könnte es eine ist schlecht OO - Sprache.

back2dos
quelle
4
Können Sie aus Neugier erklären, warum Sie Java für ein schlechtes OOP halten?
dkuntz2
2
Ähm .. Ich könnte Ihre Antwort so aktualisieren, dass sie spezifisch für Actionscript 3 ist . Zuvor war Actionscript nicht als OO (ECMA-basiert) konzipiert, und selbst Actionscript 2 war lediglich ein Wrapper für AS1.
Demian Brecht
1
Ich bin auch neugierig, warum Sie Java für eine schlechte OOP-Sprache halten
Starcorn
2
@Demian Brecht: Douglas Crockford scheint relativ überzeugt zu sein, dass JavaScript (jedes ECMA-Skript) OO ist: javascript.crockford.com/javascript.html
back2dos
2
Unterscheidung, die das gut zusammenfasst: PHP ist objektfähig , nicht objektorientiert.
Vartec
11

Sie werden feststellen, dass " kann behandeln " nicht dasselbe ist wie " unterstützt ". Ich meine, unten in den Nitty-Gritties kann sogar C mit OOP umgehen, wenn Sie Ihren Code richtig strukturieren. Die Frage ist, ob die Sprache über die bloße Aktivierung von OOP hinausgeht oder nicht , indem sie OOP zur natürlichsten Art des Programmierens macht.

Nach meiner (zugegebenermaßen eingeschränkten) Erfahrung tun dies die PHP 5.n-Dialekte nicht. Es ist zu einfach, aus der OOP heraus und in so ziemlich rein prozeduralen Code hineinzukommen. (Beachten Sie, dass ich PHP aus diesem Grund nicht für eine schlechte Sprache halte . Es gibt viele Gründe, warum ich PHP für eine schlechte Sprache halte, aber die OOP-Unterstützung ist keine davon.;))

Nur meine richtige Meinung
quelle
12
Mann, ich könnte ewig so weitermachen, Moon. Hier ist ein Ausschnitt von Code, der fehlschlägt: $e = function_that_returns_an_array()[0];. Hier ist , was Sie tun müssen, um es zu beheben: $a = function_that_returns_an_array(); $e = $a[0];. Sprachen, mit deren Syntax Sie das Ergebnis eines Funktionsaufrufs nicht direkt verwenden können, kreuzen mich an. Auch sagen Sie mir , was die folgende Zahl in Dezimal ist: 0246875. (Hinweis: Sie werden keinen langweiligen Weg finden, um diesen Lexer zu implementieren!) PHP ist nur voll von dieser Art von Dummheit.
NUR MEINE STELLUNGNAHME
6
@Moon Hier ist eine Lektüre für Sie: softwarebashing.org/blog/2009/09/php-the-ultimate-suck und tommorris.org/wiki/PHP%20Sucks Es gibt einige ernsthafte Probleme, aber viele davon sind einfach nichtig Kommissionierung. Was ich an PHP wirklich hasse, ist die Kultur, sie ist einfach nicht so professionell oder akademisch wie die Alternativen Ruby und Python. Die Alternativen sind besser und ziehen die besten Programmierer an. Zum Beispiel haben Ruby und Python beide interaktive Shells, anständige funktionale Merkmale und eine klare Syntax. Es macht viel mehr Spaß, sie zu benutzen. Neben dem Marktanteil im Shared Web Hosting, warum sollte man PHP benutzen?
Keyo
8
"Es gibt nur zwei Arten von Sprachen: die, über die sich die Leute beschweren, und die, die niemand benutzt." Bjarne Stroustrup. Meditieren.
Sylverdrag
4
@NUR, zum Glück haben sie das Array-Dereferenzierungsproblem in 5.4 behoben .
Charles
5
Stroustrup ist nur sauer, dass C ++ eine der Sprachen ist, über die die Leute meckern.
NUR MEINE STELLUNGNAHME
8

Tatsächlich gibt es zwei Definitionen für die Objektorientierung einer Sprache: Wie objektorientiert die eigene Syntax und die Standardbibliotheken sind und welchen Einfluss sie auf die Software-Programmierer haben, die für sie schreiben.

Nach der ersten Definition scheint PHP am Ende der Liste zu stehen. Menschen zitieren oft nicht-objektbezogene Strings und Arrays als Beweis dafür. Meiner Meinung nach spielt diese Definition keine Rolle. Sie können es immer in ein Objekt einwickeln, wenn Sie wirklich eines brauchen , aber die Leute tun es nicht, weil sie es nicht brauchen. Normalerweise ändert sich der Code nur function(var)in var.function(). Die Syntax allein ändert nichts von Nicht-OOP zu OOP.

Was die zweite Definition betrifft, gelingt es den Menschen, selbst in Sprachen, die solche Konstruktionen stark erzwingen, schlecht objektorientierten Code zu schreiben, und diejenigen, die guten objektorientierten Code schreiben, werden von der Sprache kaum beeinflusst, außer dass sie durch syntaktische Macken gestört werden. Mit anderen Worten, meiner Erfahrung nach gibt es keine schlechten objektorientierten Sprachen, sondern nur schlechte objektorientierte Programmierer . PHP ist in dieser Hinsicht so gut wie jede andere Sprache.

Vielleicht sind einige Sprachen besser geeignet, um objektorientiertes Programmieren zu lernen , aber ich denke, das wird sich je nach Entwickler unterscheiden. Für mich hat es nicht geklickt, bis ich Larry Walls Kamelbuch darüber gelesen habe, wie Perl OOP macht (tat?). Referenzen explizit als zu einer Klasse gehörend segnen zu müssen, brachte mich auf den Punkt, was eine Instanz eines Objekts wirklich ist und was eine Klasse ist. Einige Leute bevorzugen Javas All-Objekte-All-The-Time-Ansatz zum Lernen. Da OOP eher ein architektonisches Anliegen ist, ist es einfacher zu lernen, nachdem Sie grundlegende Variablen, Ausdrücke, Sequenzen, Auswahlen und Iterationen kennen. Daher hat jede Sprache, die OOP nicht sofort in den Vordergrund stellt, meiner Meinung nach einen pädagogischen Vorteil.

Als meine Frau eine Einführung in den Programmierunterricht mit Java nahm, war sie ständig frustriert darüber public static void main, dass sie alles in eine Klasse gesteckt hatte, was sie noch nicht verstehen konnte, aber von ihrer Lehrerin nur darum gebeten wurde, sich darauf zu verlassen, dass sie es brauchte. Ich habe versucht, es zu erklären, aber es ist sehr schwer, jemandem zu erklären, der gerade erst etwas über Variablen gelernt hat, warum es nützlich ist, zu verhindern, dass andere Teile des Codes auf sie zugreifen, und wie man entscheidet, wie man ihn aufteilt. Sie könnten argumentieren, dass das Erlernen der prozeduralen Programmierung zunächst schlechte Gewohnheiten hervorruft, aber was ist mit der Gewohnheit, Code zu kopieren und einzufügen, die Sie nicht verstehen?

Karl Bielefeldt
quelle
Es scheint, dass die Begriffe "Objekt", "Sprache", "orientiert" und "Programmierung" nicht vereinbart wurden und mehrdeutig und relativ sind, so dass keine mögliche Schwarz- oder Weißantwort möglich ist. Aber auch hier sind "schwarz" und "weiß" nicht vereinbart und ihre Bedeutung ist schwer zu
fassen
5

PHP ist nicht schlecht für die objektorientierte Programmierung. Die Art von PHP ermutigt jedoch zu schnellen Hacks und Korrekturen im Vergleich zu einer ordnungsgemäßen objektorientierten Softwareentwicklung, und viele Bücher und Tutorials ignorieren OOP-Konzepte vollständig. Es kann OOP-Konzepte gut unterstützen, aber es ist die Aufgabe des Entwicklers, zu wissen, wie man sie anwendet. Sie können in PHP fast alles tun, was Sie in einer "echten" OOP-Sprache wie Java oder C # tun könnten, aber diese Sprachen verfügen über eine stärkere Durchsetzung von OOP-Techniken als PHP, die bei Bedarf im prozeduralen Stil verwendet werden können.

Ich kann mich nicht an das genaue Zitat erinnern, aber es stammte von jemandem, der rohes PHP mit dem damals neuen Ruby on Rails verglich, und es ging ungefähr so: Rails macht das Schreiben von gutem Code einfach und das Schreiben von schlechtem Code schwierig. PHP erleichtert das Schreiben von schlechtem Code und erschwert das Schreiben von gutem Code. Die Zeile über PHP fasst es ziemlich gut auf OOP zusammen; Es ist durchaus in der Lage, eine gute OO-Sprache zu sein, aber es macht es ein bisschen schwieriger, dies zu tun.

Wayne Molina
quelle
4

PHP kategorisiert

PHP ist nur eine Klebe Sprache wie BASH oder Perl. Es ist gut darin, aber nicht gut in irgendetwas anderem, abgesehen von ernsthafter Arbeit. Die Sprache ist nicht gestaltet. Es entsteht lediglich durch zufälliges Zusammenhacken verschiedener Codes (Code-and-Fix).

Kompilierte Sprachen

Im Gegensatz zu PHP ist Java eine kompilierte Sprache, die ordnungsgemäß entwickelt wurde. Es gibt JSRs, die die Sprache definieren, viele Frameworks und Konzepte für Unternehmen wie EJB, JMS, ESB, Spring, Struts, Hibernate und andere.

Unternehmenssoftware

In Bezug auf Unternehmenssysteme ist Java EE eine Lösung, die dem Zweck entspricht (Enterprise Edition), wohingegen PHP in Unternehmen eingesetzt wird, die versuchen, Kosten zu senken, indem sie billige Arbeitskräfte mit geringerer Qualifikation einstellen.

Es wurden erhebliche Anstrengungen unternommen, um PHP mit verschiedenen Frameworks in das Enterprise-Segment zu ziehen. Vor allem Zend Framework 2 . Das grundlegende Problem ist hier nicht die Objektorientierung von PHP, sondern das Fehlen von Design, das Fehlen starker Typisierung, nicht standardisierte Lösungen für Standardprobleme (Art von Hacks für alles) und das völlige Fehlen einer vorgeschriebenen Architektur.

Software Design (Architektur diskutiert)

Mit PHP liegt die Last der Softwarearchitektur immer noch bei den Entwicklern, die einen sehr schlechten Job gemacht haben, dh oft überhaupt keine Architektur haben, nur zufälligen Code und Fehlerbehebung. Sicherheit und Transaktionen fehlen und müssen von den Entwicklern überprüft werden. In Java wird eine Lösung als EJB bezeichnet. Bedenken Sie auch, dass in PHP nichts passiert, wenn Sie Ausnahmen auslassen oder verschiedene Fehler machen. Das ist bis zur Laufzeit. Mit Java erhalten Sie Warnungen und Fehler direkt zur Entwurfszeit. Das nennt man Robustheit, aber mit PHP kann man nur weiter träumen.

Multithreading

PHP unterstützt kein Multithreading. Der Code ist immer ein einzelner Thread. Dies beeinträchtigt die Leistung bei nicht trivialen Problemen unter schwerer Last. Mit Java EE wird Multithreading vollständig unterstützt, beispielsweise über die Runnable-Schnittstelle.

Support und Standards

Berücksichtigen Sie auch die Bereitstellung, die Webdienste und andere Standards. Während es in Java große Unternehmen wie Oracle, IBM, RedHat, Apache und viele andere gibt, hat PHP nur Zend.

Fazit

Zusammenfassend ist PHP eine sehr schlechte objektorientierte Sprache. Streng genommen ist es nicht einmal objektorientiert, sondern hybride, was ab Versionen> 5 schlecht ist, weil OOP mit prozeduraler Programmierung verwechselt wird. Ich würde PHP nur als Klebstoff wie BASH empfehlen, aber für ernsthafte Arbeiten würde ich Java EE verwenden.

Verwandte Gedanken

Das Hauptproblem des neuesten Zend Framework 2 ist, dass es versucht, wie Java EE zu sein, aber nicht in der Lage ist, mindestens einen remote vergleichbaren Satz verfügbarer Pakete, Funktionen, Tools, Automatisierung, Fehlerprüfung, Architektur, Design und Funktionen bereitzustellen alles.

Meiner Erfahrung nach ist die Verwendung von PHP für komplexe Projekte teurer als mit Java.

Es gibt auch einige Gerüchte, dass PHP für Pretty Horrible Programming steht . Das kann ich bestätigen.

Michael Borgwardt
quelle
3

Wie gut kann eine Sprache mit OOP umgehen? Ich würde eher fragen, wie gut ich ein Programm auf OO-Weise schreiben kann. Ich kann meine Nase nach allem richten, was Java für eine Klasse hält, indem ich alles öffentlich statisch mache .
PHP unterstützt OOP; es zwingt mich nicht, nur auf OO-Weise zu schreiben. Wie gut es funktioniert, hängt davon ab, wie gut ich das Programm objektorientiert verstehe und schreibe.

Srisa
quelle
2

PHP unterstützt Traits! (ab 5.4) . Jede Sprache, die von Haus aus mit horizontaler Wiederverwendung umgehen kann, ist eine OO-Sprache in meinem Buch.

dukeofgaming
quelle
1

Nun, wir müssen darüber nachdenken, was eine Sprache zu einer OO macht und aus welchen Gründen sie so gemacht wurde.

JavaScript ist eine Implementierung von ECMAScript, die in einer Browserumgebung als interpretierte Sprache ausgeführt werden soll . Die Tatsache, dass es sich um eine interpretierte Sprache handelt, hatte einen großen Einfluss auf das syntaktische / verhaltensbezogene Design.

Beispielsweise folgt es nicht OOP. Aber abgesehen davon , dass es viele Fakten wie, OO prgrammer kann einen Teil seines Verhaltens wie finden Funktion Hebes sehr verwirrend.

Wieder gibt es viele Dinge, die mit OO-Sprachen wie C ++, Java und C # geliefert wurden, um sie effizienter zu machen, wie z . B. starkes Tippen . Da JS jedoch in einer interpretierten Umgebung ausgeführt wird, folgt es keiner starken Typisierung, sondern ist eine lose typisierte Sprache.

Abgesehen von den obigen Verhaltensunterschieden gibt es viele syntaktische Unterschiede, wie z. B. die Objekt-Literal-Notation von JS, die C # -Programmierer sehr verwirren können. C # verfügt jedoch auch über eine Syntax wie ein Objektliteral, obwohl es eine kompilierte Sprache ist und eine solche Syntax nur selten verwendet wird, da sie traditionell nicht im OO-Codestil vorliegt.

Jetzt gibt es noch einen Punkt, der vorschreibt, ob die Sprache gut ist. Ist sie aus C ++ entstanden? Da Java C # aus C ++ entwickelt wurde und ein ähnliches Verhalten und eine ähnliche Syntax aufweist, nimmt eine große Community dieses Verhalten und diese Syntax als das einzige OO-Element wahr und denkt, dass jede Sprache, die solche Ähnlichkeiten nicht hemmt, einfach kein OO ist.

Vergessen wir jedoch nicht, dass OO ein sehr abstraktes Konzept ist, das nicht an einen Syntaxstil gebunden ist und auch nicht an eine bestimmte Verhaltenseigenschaft.

Und PHP ist sehr gut OO. Einfach nicht wie Java, C ++, C # aussehen und sich nicht so anfühlen, macht es nicht zu einer schlechten OO-Sprache. Nun, ich habe C ++, dann Java und dann C # gelernt.

Also, bis jetzt war mein Kopf sehr gut OO. Dann habe ich JS aus einem sehr guten Buch "Wrox Pro" gelernt und es hat mich einfach umgehauen. Ich habe gerade das Verhalten und die syntaktische Unterscheidbarkeit von JS genossen. Dann stelle ich fest, dass Objektliteral wie Syntax in ihrem in C # war. Und jetzt, während ich PHP lerne, habe ich das Gefühl, dass es viele Dinge aus beiden Welten mit sich bringt.

Alles, was wir wirklich tun müssen, ist, Syntax- und Verhaltensfeinheiten zu lernen, die eine Sprache bei der Implementierung von OO hat. Sobald wir sie gemeistert haben, werden wir vielleicht denken, dass dies eine bessere OO-Implementierung ist.

Maha
quelle