anpera.net https://anpera.dyndns.org/phpbb3/ |
|
Objekt Orientiertes Programmieren (=> OOP) https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=2537 |
Seite 1 von 1 |
Autor: | Eliwood [ Fr 05 Mai, 2006 16:25 ] |
Betreff des Beitrags: | Objekt Orientiertes Programmieren (=> OOP) |
Nun ja, die Idee hatte ich schon länger. Durch Aurics veröffentlichen eines OOP-Wohnviertels hab ich mich dann zusammen gerissen und mal planlos mögliche Objekte notiert die man brauchen könnte. Zum Beispiel wäre da die Klasse "User", ein Beispiel hier: [php]class User { var $user; // Entspricht session["user"] var $acctid; // Die Accountid var $prefs; // Entspricht dem Inhalt der Tabelle "prefs" var $output; // Entspricht session["output"] var $allowednavs; // Entspricht session["allowednavs"] var $bufflist; // Entspricht session["bufflist"] var $message; // Eventuelle Fehlermeldungen var $saveduserdata; // Vergleich mit den verändernten array damit nicht geänderte Beträge nicht geschrieben werden. // Veringert den Transferbug! // Konstruktor //function User($acctid) //{ function __construct($acctid) { $this->acctid = $acctid; $this->user = db_fetch_assoc(db_query('SELECT * FROM `accounts` WHERE `acctid` = "'.addslashes(stripslashes($acctid)).'"')); $this->user = $this->Array_Unserialize($this->user); $this->saveduserdata = $this->user; unset($this->saveduserdata['output'],$this->saveduserdata['allowednavs']); $this->output = $this->user['output']; $this->allowednavs = $this->user['allowednavs']; $this->prefs = array(); $prefs = db_query('SELECT `pref`,`value` FROM `prefs` WHERE `acctid` = "'.addslashes(stripslashes($acctid)).'"'); while($row = db_fetch_assoc($prefs)) { $this->prefs[$row['pref']] = $row['value']; } db_free_result($prefs); unset($row,$prefs); $message = ''; } // Unserialisiert eingetragene Felder um die ursprünglichen arrays zu erhalten function Array_Unserialize($array) { $fields = array( 'prefs'=>true, 'dragonpoints'=>true, 'allowednavs'=>true, 'bufflist'=>true, ); while(list($key,$val) = each($fields)) { if($val === true) { $array[$key] = unserialize($array[$key]); } } return $array; } // Speichert den User wieder vollkommen in der Datenbank (Leider...) function SaveUser() { if($_SESSION['session']['loggedin'] === true && $this->acctid > 0) { $this->user['output'] = $this->output; $this->user['allowednavs'] = $this->allowednavs; $this->user['bufflist'] = $this->bufflist; $sql = 'UPDATE `accounts` SET '; reset($this->user); while(list($key,$val) = each($this->user)) { if(isset($this->saveduserdata[$key]) && $val != $this->saveduserdata[$key]) { if (is_array($val)) $val = serialize($val); $val = addslashes($val); $sql.='`'.$key.'` = "'.$val.'", '; } } $sql = substr($sql,0,strlen($sql)-2); $sql.= ' WHERE `acctid` = '.$this->acctid; db_query($sql); } } }[/php] Natürlich ist das nur das Rohprodukt ^^ Wenn wer wirklich interessese daran hat an der Idee weiter zu machen (Und eine Ahnung von OOP hat!) soll sich bitte per PN melden! (Wenn sich niemand meldet hab ich den Beitrag hier nie verfasst und werde still für mich daran arbeiten. Jedoch werde ich es dann auch nicht veröfentlichen sondern für einen "Pherae-Release" oder so ähnlich aufsparen) PS: Kenntnisse in der OOP für PHP 5 ist nicht unbedingt nötig, es reicht die Grundlagen (Also OOP bei PHP 4) zu können ^^ Wird dann wahrscheinlich 2 Versionen geben... PHP 4 und für PHP 5. |
Autor: | Talion [ Fr 05 Mai, 2006 18:56 ] |
Betreff des Beitrags: | |
An und für sich bietet es sich in einigen Punkten an, einen objektorientierten Ansatz zu wählen, also gute Sache. Der Haken: Siehe http://www.webmasterstop.com/56.html . Ich denke, man kann auch in PHP OOP soweit optimieren, dass es nicht ganz so sehr an der Performance saugt. Nur wird der Ansatz so gut wie immer ein gutes Stück langsamer sein als die nicht objektorientierte Lösung - bei Anwendungen wie CMS ist das vernachlässigbar, da sich die Seitenaufrufe meistens in Grenzen halten. Nur bei Onlinespielen, bei denen auch noch so viele Seitenaufrufe zustande kommen wie in LotGD (Waldkämpfe), kann das ein ernstes Problem darstellen. Mich würde nichtsdestotrotz interessieren, wie du das hinbekommst! Vielleicht schaffst du es ja unter vertretbaren Performanceeinbußen.. Dann wär es ne Überlegung wert. |
Autor: | Eliwood [ Fr 05 Mai, 2006 19:37 ] |
Betreff des Beitrags: | |
Talion hat geschrieben: An und für sich bietet es sich in einigen Punkten an, einen objektorientierten Ansatz zu wählen, also gute Sache.
Der Haken: Siehe http://www.webmasterstop.com/56.html . Ich denke, man kann auch in PHP OOP soweit optimieren, dass es nicht ganz so sehr an der Performance saugt. Nur wird der Ansatz so gut wie immer ein gutes Stück langsamer sein als die nicht objektorientierte Lösung - bei Anwendungen wie CMS ist das vernachlässigbar, da sich die Seitenaufrufe meistens in Grenzen halten. Nur bei Onlinespielen, bei denen auch noch so viele Seitenaufrufe zustande kommen wie in LotGD (Waldkämpfe), kann das ein ernstes Problem darstellen. Mich würde nichtsdestotrotz interessieren, wie du das hinbekommst! Vielleicht schaffst du es ja unter vertretbaren Performanceeinbußen.. Dann wär es ne Überlegung wert. Nun ja... Wenn man das so anschaut sieht das ja wirklich beängstigend aus ^^ Aber: Testet man das ganze in kleineren Bereichen als 1'000'000mal merkt man keinen bedauerlichen Unterschied (0.000001 Sekunden? ^^) Und selbst wenn 0.9.7 Objekt Orientiert ist wär sie bei weitem noch schneller aus die neue Version ![]() PS: Grundstruktur erfolgreich in die Version intrigiert (Natürlich Abwwärtskompatibel, so schnell bin ich nicht im S&E ^^) EDIT: 20mal alle diese Durchläufe der Testseite, forschleife jedoch nur je 100mal, Unterschied nicht gravierend: http://eliwood.dyndns.org/bench2.php EDIT2: http://forum.webstatt.org/thread.php?threadid=743 Eine andere Meinund zu dem Benchmark ^^ |
Autor: | Kevz [ Fr 05 Mai, 2006 20:32 ] |
Betreff des Beitrags: | |
Man sollte aber dies bezüglich beachten, das man anhand von "class" wesentlich sauberer den Code halten kann als wenn man nur Doppelte Funktionen & co hat. Worin rein garkeine Übersicht besteht... Denn wenn man die Funktionen schreibt, dann sind meist die Namen bereits besetzt d.h. lohnt sich auch OOP in gewisser Art & Weise. |
Autor: | Talion [ Fr 05 Mai, 2006 21:20 ] |
Betreff des Beitrags: | |
Eliwood hat geschrieben: Und selbst wenn 0.9.7 Objekt Orientiert ist wär sie bei weitem noch schneller aus die neue Version ![]() Wahrscheinlich. Aber ich denke mal, in Sachen Geschwindigkeit ist die neue wohl der falsche Maßstab ^^ Eliwood hat geschrieben: http://eliwood.dyndns.org/bench2.php
EDIT2: http://forum.webstatt.org/thread.php?threadid=743 Eine andere Meinund zu dem Benchmark ^^ Dass das Beispiel hinkt, ist klar. Damit wird nur der grundlegende Unterschied in der Geschwindigkeit verdeutlicht. Bei komplexeren Strukturen relativiert sich das natürlich etwas. Mich würde es in dem speziellen Fall von LotGD interessieren. Wennste die Grundstruktur bereits umgeschrieben hast, kannste vielleicht 1000 Userklicks simulieren und die benötigte Zeit messen? Vorher - nachher? |
Autor: | theTJ [ Fr 05 Mai, 2006 22:56 ] |
Betreff des Beitrags: | |
OOP ansich ist sicherlich ne super sache! aber: 1. muss ich Kevz zustimmen der von dir gezeigte ansatz hat nicht viel mit oop zu tun und 2. ist das mit den Performaceeinbußen u.U. ein wichtiger Faktor... greetz |
Autor: | Kakerlake [ Fr 05 Mai, 2006 23:06 ] |
Betreff des Beitrags: | |
Stellt sich trotzdem immernoch die Frage warum nicht einfach den Funktionen ein Präfix verpassen, sich das OOP sparen und somit Übersicht UND Performance zu erhlaten? ![]() Für solche recht einfachen Anwendungen wie LoGD ist OOP einfach ungeeignet da es bei weitem einfacher ohne geht und wenn man es dann doch braucht kann man es durch den Modulartigen Aufbau ja jederzeit lokal verwenden. Übrigens, hab ich das was verpasst oder muss in einer Schleife ein Objekt jedes mal neu erzeugt werden ehe man es verwenden darf? Ohne diese unnötige Aktion sinkt der Performanceverlust beim Benchmark stark ab! |
Autor: | Eliwood [ Fr 05 Mai, 2006 23:49 ] |
Betreff des Beitrags: | |
Ganz einfach: Dann müsste man für jede neue Klasse die instanziert werden würde einfach die selben Funktionen nochmal erstellen mit anderem Prefix ![]() (Class Race_Human extrand Race_Dummy {} ) Modulartiger Aufbau? Wo bitte? In 0.9.7? Fehlanzeige. @ the TJ: Kevz hat nirgendwo erwähnt dass das nichts mit OOP zu tun hat. Zudem hat das schon was mit OOP zu tun (PHP 4-OOP ist eh simple *g*). Punkte Performanceverlust: So gravierend sind 0.001 Sekunden auch wieder nicht ô_Ò Ich seh schon ich hab das hier überflüssigerweise hingeschrieben... Naja, wenn ichs alleine mach spricht mir wenigstens niemand drein ![]() |
Autor: | theTJ [ Sa 06 Mai, 2006 00:22 ] |
Betreff des Beitrags: | |
*amkopfkratz* ich muss schon echt müde sein... naja ich werd morgen mal ein projekt-system aufsetzen (eigentlich nur n wbbl und n Wiki) um mein LotGD-Projekt zu "veröffentlichen" damit elliwood (bearbeitet) hat geschrieben: spricht mir wenigstens Jemand drein :-) und ich muss mir nicht allein den Kopf über den Code zerbrechen...
|
Autor: | Auric [ Sa 06 Mai, 2006 12:16 ] |
Betreff des Beitrags: | |
Naja, großer Vorteil des OOP ist ja auch, das man (im Optimalfall) Die Daten immer in einem gewissen Kontext hat, was sowohl die Zuordnung, die Übersicht und das Debugging einfach macht - das habe ich beim Schriebn des WV-Mods deutlich gemerkt. Natürlich kann es sein, dass strukturierte Programmierung hier performater wäre, aber es gibt auch stark beschleunigende OOP-Techniken, man sehe sich nur mal die mysqli Erweiterung an. Die Arbeitet auch mit klassen und hängt die "Normalen" Mysql-handler gnadenlos ab. @Eli: ich würde vllt noch jeweils eine prüfung auf die PHP Version einbauen, sodass dynamisch der richtige standart verwendet wird. (ist es eigentlich möglich, einen nach PHP4 Methode verwendeten Konstruktor auch in PHP5 zu verwenden? *grübel*) @ Kevz: wb! |
Autor: | Kevz [ Sa 06 Mai, 2006 12:57 ] |
Betreff des Beitrags: | |
Thank's Aurci, ja ist es. Dennoch sollte man es lieber PHP5 Programmier gerecht Schreiben damit wirklich perfekt ist. |
Autor: | Eliwood [ So 07 Mai, 2006 14:45 ] |
Betreff des Beitrags: | |
theTJ hat geschrieben: *amkopfkratz* ich muss schon echt müde sein...
naja ich werd morgen mal ein projekt-system aufsetzen (eigentlich nur n wbbl und n Wiki) um mein LotGD-Projekt zu "veröffentlichen" damit elliwood (bearbeitet) hat geschrieben: spricht mir wenigstens Jemand drein :-) und ich muss mir nicht allein den Kopf über den Code zerbrechen...Irgendwie check ich den Beitrag nicht... Muss wohl daran liegen dass es Sonntag ist. @ Auric: Ja, PHP 4 Klasen müssten problemlos unter PHP 5 auch funktionieren. Nur PHP 5 funktioniert nicht unter PHP 4. |
Autor: | Auric [ So 07 Mai, 2006 15:53 ] |
Betreff des Beitrags: | |
Joah.. hab ich mittlerweile auch durchs testen herausgefunden (lob an XAMPP für die Versionsschaltung) Insofern wäre wohl eine Versionsbedingte Unterscheidung am besten - es wird noch an zu vielen Stellen PHP4 Verwendet, um nur für Version 5 zu Programmieren... |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |