• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Php oop

Status
Für weitere Antworten geschlossen.

Hansii

Mitglied
Hallo.

Wo ist die OOP-Programmierung sehr einfach erklärt. Wenn ich mir etwas durchlese, verstehe ich das eigentlich auch.

Hierbei fällt es mir eigentlich schwer-warum keine ahnung.

1. Wozu ist die OOP?
2. Wann sollte man Sie verwenden und wann nicht?
3. Begriffe?
4. Wie nutzt man Sie?

Ich weiß, dass ich das eigentlich können sollte. Habe auch schon gegoogelt, aber irgendwie bekomme ich das nicht hin.

Bin für jede Hilfe dankbar.
 
Schau dir mal das Pattern an da findest Antworten auf all deine Fragen. Es verschiedene Pattern arten und je nach dem eigenet sich die eine oder andere besser für das vorhaben.

Es gibt eigentlich keinen Grund wann man OO nicht verwenden sollte. Du kannst es für alles verwenden

Mfg Splasch
 
OOP ist für den Programmierer eine darstellerische Möglichkeit, um einen Sachverhalt in ein Programm umzusetzen.

Die Grundannahme ist dabei, dass ein Programm aus einer Vielzahl von interagierenden Objekten besteht. Objekte werden durch Klassen definiert. Eigenschaften, die ein Objekt besitzt (definiert in dessen Klasse), nennt man üblicherweise Attribute. Fähigkeiten, die ein Objekt drauf hat, nennt man Methoden. [Klassen lassen sich vererben/spezialisieren und abstrahieren/generalisieren.]

Das klingt erstmal sehr chinesisch. So war es auch bei mir. Und ich muss sagen: Mit PHP und Website-Beispielen lässt sich das OOP-Prinzip nur schwer veranschaulichen. Bei einer Website in Objekte zu unterscheiden, verlangt eigentlich direkt Kenntnisse über Design Patterns.

Such dir mal ein paar Informationen zusammen und versuch dann folgendes umzusetzen (es soll kein funktionierendes Programm entstehen; nur theoretischer Code):

Es gibt die Klassen Pferd und Reiter. Jeder Reiter hat einen Namen und ein Pferd (Attribute). Außerdem kann ein Reiter mit seinem Pferd reiten (Methode). Jedes Pferd hat ebenfalls einen Namen und hat eine individuelle Nummer zur Identifikation. Es bsesitzt die Fähigkeit zu fressen.

Weiterführend: Es gibt eine Spezialisierung des Pferds: Das Zwergpferd. Es darf keinem Reiter allein zugeordnet sein, sondern steht allen zur Verfügung.
 
.....
Zu 2. So oft wie möglich
....
Nein, das ist prinzipiell falsch!

Das würde bedeuten, dass man sich eine Klasse schreibt, um z.B. zu einer Variablen einen Wert 12 zu addieren. Die Verwendung von OOP ist zu relativieren und OOP ist keine Eier legende Wollmilchsau.
OOP erzeugt oftmals einen riesigen Overhead und macht nur Sinn, wenn man Scripte erstellt, die in Projekten z.B. ständig für andere Zwecke verwendet werden (also viel am Datenaufbau ändert) oder ständig erweitert werden.
Ob OO oder über Funktionen hägt sehr davon ab, ob es sinnvoll ist, sich den Aufwand anzutun.

Bsp.
Eine Admin-Useranlage für ein Gästebuch. Gehe ich davon aus, dass sich nicht jeder User registrieren muss und Adminrechte am Gästebuch braucht, ist eine kleine Funktion, die einen User anlegt sinnvoll. Die Funktion macht vielleicht 10 Zeilen Code aus, die Klasse sicher ein Vielfaches.
Eine Klasse, die eine Useranlage für 3 User generiert wäre hier vollkommen überzogen und ein Schuss mit Kanonen auf Spatzen.

Verwendest du aber die Userasnlage gemeinsam für dein Gästebuch, dein Forum und dein CMS macht OOP sehr wohl Sinn, da die Useranlage so flexiebel wie möglich sein soll und nun für 1000`de User angewandt wird.

OOP verlangsamt den Code, und macht Änderungen relativ aufwendig, das vergessen viele hier immer wieder.
Ähnlich sieht es übrigens aus, wenn sehr kleine Datenbestände aufgebaut und verwaltet werden. Da sind Dateien z.B. wesentlich schneller als Datenbanken.

Paradebeispiel sind Mailklassen.
Jeder will Mails versenden, dass aber aus unterschiedlichsten Beweggründen, mit unterschiedlichsten Mailservern und unterschiedlichsten Inhalten. Jeder hat ein eigenes Passwort und eigene Logindaten.
Du siehst, wie oft in diesem Beispiel Variablen vorkommen. Um das möglichst anpassungsfähig zu gestalten sind Klassen da und dann macht OOP auch echten Sinn.

Das Problem ist, dass man am Beginn seiner Programmier-Karriere, oftmals nicht (oder nur schwer) abschätzen kann, wann OOP sinnvoll eingesetzt wird und wann das vollkommen überzogen ist.

Wer OOP einmal durchschaut hat, tendiert dazu, alles Objekt orientiert zu machen und hat am Ende mehr Klassen, als andere, die mit Funktionen arbeiten.
Aus meiner Programmier-Tätigkeit heraus behaupte ich, dass gut 30-50% aller Klassen, die ich geschrieben habe, leichter und sicherer mit einer Funktion hätten gelöst werden können. Dabei hätte ich wesentlich weniger Zeit und weniger Code verbraucht.
Gut 90% meiner Scripte sind nicht für die Allgemeinheit bestimmt und erfüllen gezielt bestimmte Aufgaben, die sich in den nächsten Jahren sicher nicht in Aufbau und Funktionalität ändern.
Mittlerweile mutiere ich also zu sowas wie einem Funktionsmeister :mrgreen: und Fan.
Wer guten Code produziert, kann sehr mächtige Funktionen erstellen, die einer Klasse schon recht nahe kommen. Ersatz sind sie dennoch nicht. Man sollte sich also vorher Gedanken machen, was man braucht...... (is wie beim Handy)
 
Danke sysop für die Erklärung! Das ist genau mein Problem oft, nicht unterscheiden zu können wann eine Klasse Sinn macht. Aber mein Problem ist auch, dass ich Darstellung und Logik nicht immer sauber trennen kann und das gerne auch mal in einer Klasse(und Funktion) gerne mal mische.

@Hansii
Auch für mich war das Thema lange Zeit sehr schwer zu begreifen und hab deshalb nur Prozedural Programmiert. Dann bin ich auf Funktionen gekommen, aus dem Grund um gleiche Abläufe nicht immer kopieren zu müssen(um dann zu ändern) und somit kam ich dann auf Klassen! Vereinfacht gesagt: OOP ist im Prinzip nur eine zusammenfassung von themenbasierten Funktionen.
 
Nein, was sysop da sagt, ist Unsinn. Aus seinem Beitrag geht nämlich heraus, dass er nicht verstanden hat, was genau OOP ist, und vor allem, dass OOP nicht nur dafür da ist, Funktionen im Code durch Klassen zu ersetzen.
Allein, wenn man Mailerklassen als Beispiel für OOP nimmt, tritt schon das erste Problem auf: Wer Klassen benutzt, arbeitet nicht unbedingt objektorientiert. Objektorientierung ist eine Applikationsstruktur und nicht die Benutzung von Klassen, bzw. Objekten.
Es ist im Übrigen auch nicht aufwändiger, objektorientierten Code zu schreiben - vorausgesetzt, man hat einen konkreten Plan und programmiert nicht wild drauf los.
OOP macht Code nicht langsamer; das ist Unsinn. Und objektorientierter Code ist auch viel einfacher zu warten und zu ändern als prozeduraler Spaghetticode - das ist nämlich gerade der Vorteil. Diese ganzen Argumente deuten wirklich auf mangelnde Kenntnis über dieses Thema hin.

Es ist auch falsch, dass OOP nur für aufwändige Projekte benutzt werden sollte.
 
Eigentlich wollte ich ja nicht antworten, aber es lässt mir einfach keine Ruhe.

Nein, was sysop da sagt, ist Unsinn. Aus seinem Beitrag geht nämlich heraus, dass er nicht verstanden hat, was genau OOP ist, und vor allem, dass OOP nicht nur dafür da ist, Funktionen im Code durch Klassen zu ersetzen.
Habe ich das behauptet? Wo?
Dummes Zeug. Du meinst der Weisheit letzten Schluss mit OOP gefunden zu haben. So ist das aber nunmal nicht, auch wenn es dir komplett gegen den Strich geht.

Allein, wenn man Mailerklassen als Beispiel für OOP nimmt, tritt schon das erste Problem auf: Wer Klassen benutzt, arbeitet nicht unbedingt objektorientiert. Objektorientierung ist eine Applikationsstruktur und nicht die Benutzung von Klassen, bzw. Objekten.
Welches Problem geht aus dem Beispiel Mailklasse hervor?
Du wirfst hier einfach einen weiteren Parameter in die Diskussion (Struktur) und hältst dich daran fest. Das war nicht gefragt und darumgeht es hier doch garnicht. Als wenn ich für Strukturloses wildes Draufloscoden plädiert hätte.

Es ist im Übrigen auch nicht aufwändiger, objektorientierten Code zu schreiben - vorausgesetzt, man hat einen konkreten Plan und programmiert nicht wild drauf los.
Wer hat gesagt, dass man munter drauf los programmieren soll, wo steht das? Struktur kann man auch mittels Funktionen erreichen, deshalb heisst es übrigens strukturierte Programmierung. Ohne Plan geht auch mit Funktionen nichts.

Und objektorientierter Code ist auch viel einfacher zu warten und zu ändern als prozeduraler Spaghetticode - das ist nämlich gerade der Vorteil. Diese ganzen Argumente deuten wirklich auf mangelnde Kenntnis über dieses Thema hin.
Hat hier irgend wer was von Spagetticode gesagt. Du solltest dir die Frage nochmal durchlesen. Wartungsaufwand ist abhängig von dem was du Struktur nennst. Strukturierter Code ist wesentlich einfacher zu warten als unstrukturierter. Das, worauf du dich hier beziehst ist die Wartung von OO Code im Verhälltnis zu vollkommen unstrukturiertem Code, also Äpfel und Birnen.
Unstrukturierte OOP (soweit das überhaupt geht) ist wesentlich aufwendiger als unstrukturierter Spagetticode. OOP zwingt mich nur in eine gewisse Struktur, weshalb es viel schwieriger ist unstrukturierten OO Code zu erzeugen.

Es ist auch falsch, dass OOP nur für aufwändige Projekte benutzt werden sollte.
Ja, nein, natürlich. Man presst alles in OOP und lässt alles andere vollkommen ausser acht. Zeit scheint bei dir (noch) keine Rolle zu spielen. Egal was, man macht das OO. Du solltest nochmal enige HOWTOS von sehr erfahrenen Programmieren durchlesen und auf den Begriff OVERHEAD aufpassen.

OOP macht Code nicht langsamer; das ist Unsinn.
Man kann natürlich auch die Augen vor Tatsachen verschliessen und so tun, als wenn das eigene Rezept das einzig wahre wäre:
PHP:
<?PHP

function start_time()
{
    global $starttime;

    $starttime = 0;
    $mtime = explode(" ",microtime());
    $starttime = $mtime[1] + $mtime[0];
}


function end_time()
{
    global $starttime;

    $mtime = explode(" ",microtime());
    $mtime = $mtime[1] + $mtime[0];
    $runtime = round($mtime-$starttime,6);
    echo "<br><br>Laufzeit:".$runtime."<br><br>";
    return $runtime;
}

function plus($wert)
{
    return $wert + 1;
}


class addiere
{
    private static $zahl;

    public function plus_eins()
    {
        return self::$zahl++;
    }
}

// Die Klasse
start_time();
echo "Ergebnis Klasse:";
$start = new addiere;

for($i = 0; $i < 50000000; $i++)
{
    $erg = $start -> plus_eins($i);
}
echo $erg;
$klasse = end_time();

// die Funktion
start_time();
echo "Ergebnis Funktion";
for($i = 0; $i < 50000000; $i++)
{
    $erg = $start = plus($i);
}
echo $erg;
$funktion = end_time();

echo number_format(($funktion - $klasse),6,",",".");
Starten uns sich wundern. Die Laufzeiten für OOP sind gerade in Interpretersprachen sogar signifikant langsamer und je grösser die Anzahl an Schleifendurchläufen, um so signifikanter wird es auch bei simpelsten Klassen, Von Eltern/Kind Bezügen gar nicht zu reden.
Technisch erst mal schlau machen, bevor man die Antworten Anderer als Unsinn bezeichnet.

Im Übrigen ist das schon immer ein Glaubenskrieg gewesen. Diese Diskussionen führe ich nun schon über 20 Jahre und höre immer die selben 2 Ansichten. Meine habe ich kund getan, man kann sie annehmen oder auch nicht.
Mein Vergleich mit Dateien und Datenbanken kam auch nicht von ungefähr. Da ist es das selbe Thema. Die einen klopfen ALLES in Datenbanken, die Anderen machen das abhängig von den Bedürfnissen und nutzen auch mal Files (weil sie bei kleinen Datenmengen nun mal einfach schneller sind). Jeder wie er mag.
 
Dein Benchmark zeugt einfach nur von deiner Inkompetenz. Wahrscheinlich hast du das sogar mit PHP5.1 getestet.

Bei mir (und die Resultate waren 20 mal ähnlich und 5 mal war der Gewinner die Klasse):
Code:
Ergebnis Klasse:49999999

Laufzeit:9.741731

Ergebnis Funktion50000000

Laufzeit:9.700629

-0,041102

Nehmen wir diesen Unterschied, der einer der schlimmsten meiner Testergebnisse war.

50-Millionen Iterationen, 0,04 Sekunden Unterschied in der Ausführungszeit? Ist das dein Ernst? Ich finde sowas lächerlich.

Und selbst hier verwechselst du noch die Thematik Klassen und Objektorientierung. Und dass du schon seit 20 Jahren auf dem Holzweg gehst, ist auch kein Argument dafür, dass du Recht hast.
Das Thema hier ist Objektorientierung, nicht, was Klassen sind. Man kann objektorientiert ohne Klassen arbeiten und man kann auch prozedural mit Klassen arbeiten (Beispiel: einzelne Klassen wie PDO oder PHPMailer benutzen - das ist mein Problem). Für dich beschränkt OOP ist auf Klassen (und möglicherweise sogar auf deren Instanzen) - das kann jeder, der objektorientiert arbeiten kann, anhand deiner Beiträge erkennen. Und sagen, dass OOP dich in irgendwas reinzwingt zeugt - meiner Meinung nach - am besten davon.

Weitere Testausführungen:

Code:
Ergebnis Klasse:49999999

Laufzeit:9.697849

Ergebnis Funktion50000000

Laufzeit:9.695343

-0,002506

Code:
Ergebnis Klasse:49999999

Laufzeit:9.709688

Ergebnis Funktion50000000

Laufzeit:9.715308

0,005620

Ergebnis Klasse:49999999

Laufzeit:9.740029

Ergebnis Funktion50000000

Laufzeit:9.693667

-0,046362

Edit: Noch lustiger ist, dass der Klassencode JEDES Mal gewinnt, wenn ich das ++ am Anfang von self::$zahl setze, statt am Ende.

Was ich damit meine, ist, dass du kein relevantes Benchmark gepostet hast, da Mikoroptimierungen es stark beeinflussen können. Was hier relevant ist, ist die Anzahl Schleifen und nicht der Funktionscontainer. Bin aber sicher, es gibt gute HOWTOs von erfahrenen Programmierern, bei denen du durchlesen kannst wie man richtige Benchmarks schreibt. :roll:
 
Zuletzt bearbeitet:
Bist du des lesens und weiterdenkens wirklich so unfähig?

Wenn bei einer derartigen simplen Operation schon solche Unterschiede sichtbar werden, versuch es doch mit anderen Klassen, die richtig heftige Aufgaben lösen. Jer schneller dein Rechner um so geringer werden die Unterschiede. Teste mal in einer echten Umgebung, wo auch Traffic ist und wo ein paar Leute auf den Server zugreifen und der PHP-Parser beschäftigt ist.

Klassen und deren Objekte sind wesentlich komplexer als einzelne Funktionen und es wird mehr Speicherbereich allokiert, Namespace reserviert etc. Daher bist du wohl der einzige und letzte, der Performance-Verluste nicht akzeptieren will.

Wahrscheinlich unter 5.1, soso, jaja, wahrscheinlich.
Hier läuft PHP Version 5.4.4-13

Wahrscheinlich testest du auf einem Core i7. Wahrscheinlich laufen bei dir im Hintergrund sonst NULL Dieste und dein Rechner hat sonst nichts zu tun.

Soso, 0,04 Sekunden auf deinem Rechner sind nicht relevant und das bei einer simplen Addition von 1.
Wahrscheinlich fällt es dir schwer die 0,04 Sek. mit 100 gehosteten Usern auf einem Server, bei einigen Tausend Zugriffen am Tag hoch zu rechnen.

Wahrscheinlich glaubst du auch nicht an die globale Erwärming und wahrscheinlich ist deine Fähigkeit ein simples (in einer Minute aus dem Ärmel geschütteltes) Beispiel auf höhere Aufgaben umzulegen nicht sonderlich ausgeprägt.

Mach doch wie du willst. Plastik "Die drei weisen Affen"

EDIT:
Auf einem Server auf dem gerade nur 70 Leute unterwegs sind ist inkl. deiner Verbesserung (dem ++) das Ergebnis derzeit
Code:
Ergebnis Klasse:49999999

Laufzeit:9.57196

Ergebnis Funktion50000000

Laufzeit:8.788869

-0,783091

Wie das wohl aussieht, wenn es dann richtig losgeht......

PPS
Wenn du übrigens den Funktionsaufruf VOR den Aufruf der Klasse stellst, host du übrigens nochmal ein paar Hundertstel zu Gunsten der Klasse heraus. Woran das nun wieder liegt, kannst du selber harausfinden.
 
Zuletzt bearbeitet von einem Moderator:
Lagert eure Meinungsverschiedenheiten bitte in einer PN aus.

Alternativ könntet ihr auch ein Tutorial erstellen, wann man jetzt OOP verwendet und wann nicht, würde ich willkommen heißen.

Closed: Vom Thema abweichende, ausartende Diskussion (XraYSoLo)

Nils aka XraYSoLo
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben