HTML-Klasse
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ansicht
array
break
browser
code
datum
dom
echtzeit
einarbeiten
element
entsprechende dom
erweitern
fehler
inspektor
leisten
null
option
tag
text
url
-
Ich habe vor ein tag/browser">Browsergame zu skripten und will deshalb von Anfang an alles sauber (OOP) machen. Also muss eine HTML-Klasse her - und genau da liegt das Problem. Ich wollte sie nämlich so ähnlich wie DOM gestalten und scheitere jetzt am Auslesen der Objekte; vllt gibt's auch noch andere Fehler:
<?php class HTML{ private $children = array(); function addChild(&$child){ $this->children[] = $child; $child->parent = $this; $child->nextChild = $child->parent->children[array_search($child,$this->children)+1]; } function __destruct(){ $gen = 0; $element = $this->children[0]; $_element; while(true){ $_element = $element; if(isset($element)){ echo'<'.$element->getTag().'>'."\n"; if(isset($element->children[0])){ $gen++; $element = $element->children[0]; }else{ echo'</'.$_element->getTag().'>'."\n"; $element = $element->nextChild; } }else{ if(get_class($_element->parent) == 'HTML'){ break; }else{ $gen--; $element = $element->parent->nextChild; } } } } } class TAGempty{ private $tag; private $options = array(); private $style = array(); public $parent; public $nextChild; function __construct($tag){ $this->tag = $tag; } function getTag(){ return $this->tag; } function setOptions(array $options){ $this->options = $options; } function getOptions($option = NULL){ if(isset($option)){ return $this->options[$option]; }else{ return $this->options; } } function setStyle(array $style){ $this->style = $style; } function getStyle($style = NULL){ if(isset($style)){ return $this->style[$style]; }else{ return $this->style; } } } class TAG extends TAGempty{ public $childs = array(); function addChild($element){ $this->children[] = $element; } } class TEXT{ private $text; public $parent; public $nextChild; function __construct($text){ $this->text = htmlspecialchars($text); } function getText(){ return $this->text; } function getTag(){ return $this->getText; } } ?>
Dieser Code liefert bei einem Test durch z.B.
<?php $HTML = new HTML(); $HTML->addChild(new TAG('p')); ?>
eine Endlosschleife.
Das Hauptproblem liegt also im Destruktor.
Freue mich auf Hilfe -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was soll diese Klasse denn leisten? Ich sehe da gerade keinen Nutzen drin in der Klasse.
-
Die Klasse soll in erster Linie Fehler vermeiden und den Code ordentlich einrücken.
Im Destruktor liegt der Fehler; dort soll jedes Objekt durchgegangen und ausgegeben werden.
Wahrscheinlich habe ich einen einfachen Denkfehler, ich find ihn nur nicht. -
....du hast eine while(true) aber nirgenwo ein break; oder?
-
Schau mal genauer hin
-
Anstatt solch eine Klasse zu schreiben, solltest du dich besser in ein Template System einarbeiten oder selbst ein passendes schreiben. Eingerückter Code ist unwichtig. Denn du wirst wohl kaum in der Sourcecode Ansicht debuggen. Dafür gibt es Browser Plugins mit denen man sowas erledigt. Das beste zum debuggen ist im Firefox Firebug und die anderen Browser haben auch entsprechende DOM Inspektoren mit denen man in Echtzeit alle Daten ändern/erweitern kann.
-
Hi,
progger schrieb:
Schau mal genauer hin
das habe ich mal gemacht:
In der Funktion "__destruct()" setzt du
"$_element = $element"
Im else Zweig sind dann "$_element = $element" nicht gesetzt.
Um das "break" zu erreichen soll "parent" vom nicht gesetzten
"$_element" der Klasse "HTML" angehören.
Das wird nie der Fall sein, wenn "$_element" Null ist.
Somit wird das "break" nicht erreicht und die Schleife nicht verlassen.
Ich befürchte aber, dass ist nur ein Fehler von vielen, also nimm es als Motivation ;).
Gruß
Manni
-
evil-devil schrieb:
Anstatt solch eine Klasse zu schreiben, solltest du dich besser in ein Template System einarbeiten oder selbst ein passendes schreiben. Eingerückter Code ist unwichtig. Denn du wirst wohl kaum in der Sourcecode Ansicht debuggen. Dafür gibt es Browser Plugins mit denen man sowas erledigt. Das beste zum debuggen ist im Firefox Firebug und die anderen Browser haben auch entsprechende DOM Inspektoren mit denen man in Echtzeit alle Daten ändern/erweitern kann.
Vor allem solltest du gerade bei einem Browsergame darauf achten, dass der (HTML-)Code minimal ist und generell wenige Requests pro Seitenaufruf abgesetzt werden.
Ergo, JS&CSS Dateien serverseitig zusammenführen und Kommentare und Whitespaces ebenfalls serverseitig löschen. -
Es gibt bereits eine Klasse die das leisten dürfte. phpQuery http://code.google.com/p/phpquery verwendet die jQuery Syntax, um in PHP entsprechende DOM-Manipulationen durchzuführen.
-
bandi999 schrieb:
Somit wird das "break" nicht erreicht und die Schleife nicht verlassen.
Die Frage war aber:
myhead schrieb:
....du hast eine while(true) aber nirgenwo ein break; oder?
Es ist eine break-Anweisung im Code - ich habe schon am Anfang vor Denkfehlern gewarnt.
lucas9991 schrieb:
evil-devil schrieb:
Anstatt solch eine Klasse zu schreiben, solltest du dich besser in ein Template System einarbeiten oder selbst ein passendes schreiben. Eingerückter Code ist unwichtig. Denn du wirst wohl kaum in der Sourcecode Ansicht debuggen. Dafür gibt es Browser Plugins mit denen man sowas erledigt. Das beste zum debuggen ist im Firefox Firebug und die anderen Browser haben auch entsprechende DOM Inspektoren mit denen man in Echtzeit alle Daten ändern/erweitern kann.
Vor allem solltest du gerade bei einem Browsergame darauf achten, dass der (HTML-)Code minimal ist und generell wenige Requests pro Seitenaufruf abgesetzt werden.
Ergo, JS&CSS Dateien serverseitig zusammenführen und Kommentare und Whitespaces ebenfalls serverseitig löschen.
Was habt ihr gegen eine HTML-Klasse ?
Ich habe übrigens keine Lust mit Templates zu arbeiten.
dbt schrieb:
Es gibt bereits eine Klasse die das leisten dürfte. phpQuery http://code.google.com/p/phpquery verwendet die jQuery Syntax, um in PHP entsprechende DOM-Manipulationen durchzuführen.
Diese Klasse wird das und noch viel mehr können, aber ich würde lieber eine eigene Klasse schreiben - da weiß ich, woran ich bin.
Beitrag zuletzt geändert: 3.5.2009 11:16:16 von progger -
Du hast keine Lust auf das altbewährte, funktionale und praktische Templatesystem und wirfst deshalb Stilfragen und Konzepte über den Haufen um eine HTML-Klasse zu schreiben?
An sich mag ich die Einstellung, aber es ist recht dumm - in meinen Augen.
Die Frage ist: Was ist also an einer HTML Klasse besser, als an einem Templatesystem? Mir erschließt sich der Sinn einer HTML-Klasse einfach nicht... ^^ -
Was kann es schaden, das Rad neu zu erfinden, wenn man danach DOM besser versteht ?
Ich weiß selbst noch nicht, ob die Klasse in künftigen Projekten zum Einsatz kommt,
aber eines ist sie für mich ganz sicher nicht: sinnlos. -
Wenn sie nicht nutzlos ist, dann erkläre uns bitte den Nutzen, denn ich sehe noch immer keinen Nutzen da drin.
Wäre es eine Javascript DOM Klasse könnte ich das ganze ja noch verstehen, aber in PHP, wo sowieso alles Serverseitig generiert wird und nur als Text beim Browser landet halte ich den Aufwand für unnötig. -
Also gut,
trotz der hier verbreiteten Annahme, dass eine solche Klasse ja sinnlos und andere Methoden vorzuziehen wären, habe ich die Klasse bzw. die Klassen zum Laufen gebracht.
Dafür eignet sich eine doppelt verkettete Liste sehr viel besser als ein Array - und das Zauberwort zum Auslesen hieß Rekursion (danke nochmal an bladehunter).
Wer sie sich mal anschauen möchte: PN an mich.
Ich danke allen für ihr Bemühen -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage