PC-Freak :D
Hi, also ich habe auf dieser Seite hier ein paar Tutorials gesehen. Unter anderem eben das Tutorial für ein Eventsystem. Ich hab es mir durchgelesen und den Code mal angeschaut und versucht zu verstehen.
Rein technisch verstehe ich den Code fast komplett. Aber warum er das so gemacht hat, verstehe ich manchmal nicht so ganz.
1.) Er arbeitet fast ausschließlich mit static Methoden und Variablen. Beim ersten mal durchlesen fand ich die Idee ziemlich gut, weil man dann keine Instanzen mehr erstellen muss. Aber dann bin ich auf diese Seite gestoßen, die schreibt, dass man halt mit static eher vorsichtig umgehen soll (aus meiner Meinung nach sehr nachvollziehbaren Gründen). Ist das auch hier der Fall, dass man lieber ohne static arbeiten sollte?
2.) Eine essentielle Sache an diesem Eventsystem verstehe ich gar nicht. Und zwar benutzt er eine Methode, um Events zu registrieren. Diese registrierten Events werden dann in der Klasse in einer static Variable gespeichert, damit der eventHandler später weiß, welche Methode oder Funktion er bei einem Event aufrufen muss.
Dann hat er zusätzlich noch ein Array mit den Events (das man auch aus der Datenbank z.B. holen kann). Diese kann er dann ausführen und durcharbeiten lassen
Aber wie funktioniert das in der Praxis? Woher kommen in der Praxis diese "zu registrierenden" Events(damit meine ich nicht die Events Ansicht, sondern das, was per "registerEvent" registriert werden muss), die in der Klasse gespeichert werden? Wo liest man die aus? Was bringt einem das außer unnötiger Arbeit? Wenn die unveränderlich sind und allgemeingültig (Also das für JEDES Truppenbewegungs-Event Skript A aufgerufen wird z.B.) sind, dann kann man die doch direkt in der Klasse speichern, ohne dass man sie erst registrieren muss.
Ich versteh den Sinn dahinter nicht. Aber es muss doch einen geben, oder? Ich mein, ich glaube kaum, dass ich mehr von PHP verstehe als der Autor dieser Seite.
Ich habe mal versucht, so was selbst zu schreiben und das ist meine Lösung:
Meine Frage ist jetzt? Hat meine Version die gleichen Möglichkeiten wie die von der Seite? Ich hab es halt so geschrieben, dass man nicht immer die Events registrieren muss, sondern einfach die Methoden-Namen im events-Array speichert, welches man aus der Datenbank ausliest. So ist es doch viel einfacher.
Ein Unterschied ist der, dass man mit meiner Version nicht mehrere Methoden in einem einzigen Event aufrufen kann. Aber das Bedarf nur einer kleinen Änderung, und schon würde das auch gehen (ob man das braucht ist eine andere Frage).
Was bei mir auch noch ist: Er lässt momentan alle events durchlaufen, auch wenn sie in der Zukunft lägen. Aber das ist auch eine winzige Änderung, zu der ich noch nicht gekommen bin.
Stehe ich jetzt vollkommen auf dem Schlauch und vergesse was wichtiges, oder funktioniert mein Skript genauso und ist gefühlt nur halb so lang (was ich irgendwie bezweifle)?
Danke schon mal für eure Hilfe,
Lg
Rein technisch verstehe ich den Code fast komplett. Aber warum er das so gemacht hat, verstehe ich manchmal nicht so ganz.
1.) Er arbeitet fast ausschließlich mit static Methoden und Variablen. Beim ersten mal durchlesen fand ich die Idee ziemlich gut, weil man dann keine Instanzen mehr erstellen muss. Aber dann bin ich auf diese Seite gestoßen, die schreibt, dass man halt mit static eher vorsichtig umgehen soll (aus meiner Meinung nach sehr nachvollziehbaren Gründen). Ist das auch hier der Fall, dass man lieber ohne static arbeiten sollte?
2.) Eine essentielle Sache an diesem Eventsystem verstehe ich gar nicht. Und zwar benutzt er eine Methode, um Events zu registrieren. Diese registrierten Events werden dann in der Klasse in einer static Variable gespeichert, damit der eventHandler später weiß, welche Methode oder Funktion er bei einem Event aufrufen muss.
Dann hat er zusätzlich noch ein Array mit den Events (das man auch aus der Datenbank z.B. holen kann). Diese kann er dann ausführen und durcharbeiten lassen
Aber wie funktioniert das in der Praxis? Woher kommen in der Praxis diese "zu registrierenden" Events(damit meine ich nicht die Events Ansicht, sondern das, was per "registerEvent" registriert werden muss), die in der Klasse gespeichert werden? Wo liest man die aus? Was bringt einem das außer unnötiger Arbeit? Wenn die unveränderlich sind und allgemeingültig (Also das für JEDES Truppenbewegungs-Event Skript A aufgerufen wird z.B.) sind, dann kann man die doch direkt in der Klasse speichern, ohne dass man sie erst registrieren muss.
Ich versteh den Sinn dahinter nicht. Aber es muss doch einen geben, oder? Ich mein, ich glaube kaum, dass ich mehr von PHP verstehe als der Autor dieser Seite.
Ich habe mal versucht, so was selbst zu schreiben und das ist meine Lösung:
PHP:
// Enthält einfach Verbindungsdaten und -methoden für die Datenbank. Enthält auch die Klasse DatabaseBased, die das Datenbank-Objekt beinhaltet, um es in mehreren Klassen verwenden zu können
include("database.php");
class EventScripts extends DatabaseBased {
public function ScriptA($callTime, $params) {
//print_r($this->database->query("SELECT * FROM test", "assoc"));
// Hier werden dann Berechnungen angestellt etc...
return $params;
}
}
class EventSystem extends DatabaseBased {
// Ich glaube, hier wäre static nicht mal zwingend notwendig
protected static $results;
public function handleEvents($events) {
// Instanz der EventScripts wird erzeugt (Als Parameter dient das Datenbank-Objekt)
$EventScripts = new EventScripts($this->database);
foreach ($events as $key => $event) {
// Momentan wird hier immer dieselbe Methode aufgerufen, aber im $events-Array sind die Daten für andere Methoden
// Das $results-Array werde ich noch überarbeiten, dass man später auch sieht, was das für ein Event war
self::$results[] = $EventScripts->ScriptA(4,"testparameter");
}
}
// Sortiert nach Datum. Ältestes zuerst
public function eventSort($a, $b) {
$subt = $a['time'] - $b['time'];
if ($subt == 0) {
// Umgedreht, da je höher, desto weiter vorne in der Abarbeitungsliste
return $b['importance'] - $a['importance'];
} else {
return $subt;
}
}
public function getResults() {
return self::$results;
}
}
try {
$database = new Database(/* Datenbankverbindungen */ );
$EventSystem = new EventSystem($database);
} catch (Exception $e) {
echo $e->getMessage();
}
// Testevents
$events = array(
array("id" => 2, "name" => "Nachricht Senden", "time" => 1, "class" => "EventScripts", "method" => "ScriptA", "importance" => 1, "params" => "Funktion4"),
array("id" => 1, "name" => "Nachricht Senden", "time" => 5, "class" => "EventScripts", "method" => "ScriptA", "importance" => 1, "params" => "Funktion1"),
array("id" => 2, "name" => "Nachricht Senden", "time" => 5, "class" => "EventScripts", "method" => "ScriptA", "importance" => 3, "params" => "Funktion2"),
array("id" => 2, "name" => "Nachricht Senden", "time" => 5, "class" => "EventScripts", "method" => "ScriptA", "importance" => 5, "params" => "Funktion3"));
usort($events, array("EventSystem", "eventSort"));
$EventSystem->handleEvents($events);
print_r($EventSystem->getResults());
Meine Frage ist jetzt? Hat meine Version die gleichen Möglichkeiten wie die von der Seite? Ich hab es halt so geschrieben, dass man nicht immer die Events registrieren muss, sondern einfach die Methoden-Namen im events-Array speichert, welches man aus der Datenbank ausliest. So ist es doch viel einfacher.
Ein Unterschied ist der, dass man mit meiner Version nicht mehrere Methoden in einem einzigen Event aufrufen kann. Aber das Bedarf nur einer kleinen Änderung, und schon würde das auch gehen (ob man das braucht ist eine andere Frage).
Was bei mir auch noch ist: Er lässt momentan alle events durchlaufen, auch wenn sie in der Zukunft lägen. Aber das ist auch eine winzige Änderung, zu der ich noch nicht gekommen bin.
Stehe ich jetzt vollkommen auf dem Schlauch und vergesse was wichtiges, oder funktioniert mein Skript genauso und ist gefühlt nur halb so lang (was ich irgendwie bezweifle)?
Danke schon mal für eure Hilfe,
Lg