Hey Leute,
habe die schon ein paar Wochen auf meiner Festplatte rumgammeln, und dachte mir, dass ich sie einfach mal veröffentliche.
Ich nutze die Klassen gerne, wenn ich etwas programmiere, da ich gerade in einer "OOP-Phase" bin, in der alles in eine Klasse getan werden muss.
Wie läuft das ganze ab ?
Ich habe ein paar Klassen geschrieben, die über meinen "ComponentLoader" eingebunden werden. Das sieht dann in etwa so aus:
Der erste Parameter gibt eine Art "Kategorie", der zweite den Klassennamen an.
Werbung:
Hier könnte Ihre Werbung stehen. Jetzt buchen - nur 299€ die Stunde.
Was können die lassen bis jetzt ?
Bis jetzt kann man mit den Klassen mit ZIP-Archiven arbeiten, auf FTP-Servern tüfteln, ein eigenes Session-System ( anstelle dem PHP-eigenem ) nutzen & ein paar kleine Sachen mehr.
Hast du eine Liste der Kategorien und Klassen ?
Klar, sogar mit Beispielen
- client
- Session
- connection
- FTPConnection
- files
- IniParser
- ZIPReader
- ZIPWriter
-
Update( nicht zu empfehlen, die zu nutzen, könnt ihr euch angucken, aber kommt aus meiner Anfänger-Zeit )
- server
- GlobalVar
- OutputStream
- templates
- InformationStorage
- InformationStorageInterface
Beispiel-Liste:
Dieses Beispiel wird eine Datei via FTP downloaden und wieder hochladen.Die Datei auf dem FTP-Server heißt "downloadme.txt" und wird auf dem Webspace "uploadme.txt" heißen.##########Benötigte Komponenten: connection:FTPConnection########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('connection', 'FTPConnection'); $ftpcon = new FTPConnection('83.133.224.53'); $ftpcon->auth('root', 'kalaga33'); $ftpcon->get('downloadme.txt', 'uploadme.txt'); $ftpcon->put('downloadme.txt', 'uploadme.txt');########## Als Parameter bei der Initialisierung wird die IP oder die Domain übergeben. Per "auth" wird sich eingeloggt. Per "get" gedownloaded, dabei ist der erste Parameter die Datei auf dem FTP-Server, der zweite die 'lokale'. Per "put" geuploaded, dabei ist wieder der erste Parameter die Datei auf dem FTP-Sevrer und die zweite die 'lokale' Per "cd" ( "Change Dir" ) kann das Verzeichnis gewechselt werden - Dabei wird als einziger Parameter das neue Verzeichnis übergeben
Hier werden wir eine Variable setzen und wieder auslesen.##########Benötigte Komponenten: server:GlobalVar########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('server', 'GlobalVar'); GlobalVar::assign('version', '0.1a'); GlobalVar::get('version');########## Ich nutze diese Klasse oft, wenn ich Variablen zwischen den Klassen und Dateien austauschen muss.
Ein "InformationStorage" ist eine SQLite-Datenbank, die OOP ist und schon viele Sachen vorimplementiert hat.Man muss sich zum Beispiel nicht mehr um den Check, ob die DB existiert, kümmern.Anders als die anderen Komponenten muss hier eine eigene Klasse geschrieben werden, die von "InformationStorage" erbt.##########Benötigte Komponenten: templates:InformationStorage templates:InformationStorageInterface########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('templates', 'InformationStorage'); ComponentLoader::load('templates', 'InformationStorageInterface'); class MyStorage extends InformationStorage implements InformationStorageInterface { function __construct($dbname) { parent::init($this, $dbname); } // Wenn die Datenbank erzeugt wird / noch nicht existiert public function onCreate($dbname) { parent::exec('CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, email TEXT, password TEXT);'); } // Immer, wenn eine Query per "exec" ausgefuehrt wird - egal, ob INSERT, SELECT, ALTER, UPDATE, ... public function onQuery($query) { // Hier evtl. etwas loggen ? // auf jeden Fall nicht in die Datenbank schreiben, sonst koennte es zu einer Endlosschleife kommen ;) } // Hier können eigene Funktionen folgen }########## Ich habe mir mal die Freiheit genommen, eine eigenen "Login-Storage" zu schreiben: include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('templates', 'InformationStorage'); ComponentLoader::load('templates', 'InformationStorageInterface'); class MyStorage extends InformationStorage implements InformationStorageInterface { function __construct($dbname) { parent::init($this, $dbname); } public function onCreate($dbname) { parent::exec('CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, email TEXT, password TEXT);'); } public function onQuery($query) { } // EIGENE FUNKTIONEN public function createUser($name, $email, $password) { $name = parent::escape($name); $email = parent::escape($email); $password = parent::escape(md5($password)); $sql = 'INSERT INTO user (name, email, password) VALUES ("'. $name .'", "'. $email .'", "'. $password .'");'; parent::exec($sql); } public function getUser($email) { $email = parent::escape($email); $sql = 'SELECT id FROM user WHERE email = "'. $email .'";'; $result = parent::exec($sql); if(parent::numRows($result) != 0) { $row = parent::fetchArray($result); return $row['id']; } else return -1; } public function checkUserPassword($userid, $password) { if(!is_numeric($userid)) return false; // $userid muss jetzt nicht escaped werden, da es zu 100% aus Zahlen besteht ( siehe chack oben ) $sql = 'SELECT password FROM user WHERE id = '. $userid .';'; $result = parent::exec($sql); $row = parent::fetchArray($result); return md5($password) == $row['password']; } } // Benutzen der Klasse: $userstorage = new MyStorage('testdb'); $userstorage->createUser('MaxMustermann', 'max@muster.mann', 'passwort'); $userstorage->createUser('MauriceMustermann', 'maurice@muster.mann', 'passwort2'); $userstorage->createUser('PizzaLieferMann', 'pizza@liefer.mann', 'passwort3'); $pizza = $userstorage->getUser('pizza@liefer.mann'); echo'Der Pizza-Mann hat die ID '. $pizza ."\r\n"; if($userstorage->checkUserPassword($pizza, 'passwort')) // false echo'Sein Passwort lautet "passwort"'."\r\n"; else if($userstorage->checkUserPassword($pizza, 'passwort2')) // false echo'Sein Passwort lautet "passwort2"'."\r\n"; else if($userstorage->checkUserPassword($pizza, 'passwort3')) // true echo'Sein Passwort lautet "passwort3"'."\r\n";
Dieses Beispiel wird eine INI-Datei auslesen, ein paar Werte ändern und wieder speichern.##########Benötigte Komponenten: files:IniParser########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('files', 'IniParser'); $player = IniParser::parse('user.txt'); $player['Passwort'] = 'NeuesPassword'; IniParser::save($player, 'user.txt');########## Bei Version > 0.2 wird die PHP-hauseigene Funktion "parse_ini_file" genutzt.
In diesem Beispiel werden wir Ausgaben abfangen, löschen und andere senden.##########Benötigte Komponenten: server:OutputStream########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('server', 'OutputStream'); OutputStream::record(); echo'Diesen Text wird niemand zu sehen bekommen'; OutputStream::stop(false); // Das "false" sagt, das alle Ausgaben bis jetzt nicht gesendet und gelöscht werden. Bei weglassen oder "true" würden sie gesendet werden. echo'Hallo :)'; OutputStream::record(); echo'3.1415'; $text = OutputStream::get(); // in $text ist jetzt "3.1415" OutputStream::stop(); // Der Benutzer bekommt jetzt "3.1415" gesendet########## Diese Klasse kann genutzt werden, um an beliebigen Stellen des Scriptes die Header zu verändern oder eigene Fehlerbildschirme zu erzeugen, die ein eigenes Design haben. Die OutputStream-Klasse fängt sogar Text außerhalb der "<?php"-Tags ab.
In diesem Beispiel werden wir eine neue "Session" initialisieren, ein paar Variablen setzen und sie wieder auslesen.Wichtig: Für dieses Beispiel muss eine Verbindung zu einer MySQL-Datenbank bestehen und die Tabellen, wie sie ganz unten als Dumb stehen,müssen importiert sein !##########Benötigte Komponenten: client:Session########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('client', 'Session'); Session::initialisize(); if(Session::firstinit()) { // Der Benutzer ist zum ersten Mal auf der Seite Session::set('logedin', false); } if(Session::get('logedin') == false) { echo'Du bist nicht eingeloggt'; } else { if(Session::exists('username') == false) { Session::set('username', 'IrgendeinName'); } else { echo'Wilkommen, '. Session::get('username'); } }##########Hinweis: Session::initialisize MUSS vor jedem Output via "echo", ... aufgerufen werden. Sollte es nicht anders gehen, kann die "OutputStream"-Komponente genutzt werden.##########CREATE TABLE `session_indexes`( `id` int(5) NOT NULL AUTO_INCREMENT, `session` text NOT NULL, `useragent` text NOT NULL, `lastvisit` int(11) NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = 2;CREATE TABLE `session_variables`( `id` int(4) NOT NULL AUTO_INCREMENT, `session` int(2) NOT NULL, `typ` int(1) NOT NULL, `var` text NOT NULL, `value` text NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT = 4;
Dieses Beispiel wird eine ZIP-Datei öffnen, die Namen auslesen und anzeigen, und entpacken.##########Benötigte Komponenten: files:ZIPReader########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('files', 'ZIPReader'); $archiv = new ZIPReader('archiv.zip'); echo'<pre>'; print_r($archiv->getFiles()); echo'</pre>'; $archiv->extractAll('.');########## Diese Komponente wird nicht auf allen Webservern unterstützt, da einige Hoster ihren PHP-Kernel ohne die ZIP-Bibliothek compiliert haben.
Dieses Beispiel wird eine ZIP-Datei öffnen und 2 Dateien hinzufügen.Dabei wird eine Datei nicht wirklich existieren, sondern als String der Inhalt übergeben werden.##########Benötigte Komponenten: files:ZIPWriter########## include_once('./includes/ComponentLoader.class.php'); ComponentLoader::load('files', 'ZIPWriter'); $archiv = new ZIPWriter('archiv.zip'); $archiv->addFile('addme.txt', 'addme.txt'); // lokal | im Archiv - letzteres kann weggelassen werden $archiv->addStringAsFile('virtual.file', 'Ich bin eine Datei im ZIP-Archiv :O'); //$archiv->addFolder('folder'); //$archiv->import('.'); // ein ganzes Verzeichnis rekursiv importieren########## Diese Komponente wird nicht auf allen Webservern unterstützt, da einige Hoster ihren PHP-Kernel ohne die ZIP-Bibliothek compiliert haben.
Lizenz-Bestimmungen:
Nutzt es einfach, wenn ihr es braucht. Ihr dürft es nur nicht als eures ausgeben, verkaufen, bla, bla, bla.
Als Hinweis: Ihr dürft es auch in Systeme einbinden, die ihr anderen kostenpflichtig zur Verfügung stellt, wenn ihr meinen Namen irgendwo ins Kleingedruckte schreibt, oder erwähnt, dass dieses "Mini-Framework" drinne ist.
Source-Code:
Das sind etliche Dateien Da kann man nicht einfach den Sourcecode posten
Hier einfach mal der Source von dem ComponentLoader:
<?php /* @class: ComponentLoader * @type: static * @author: Tion * @container: . * @version: 3.3.4 */ class ComponentLoader { private static $libs = array(); public static function load($container, $class) { $mypath = dirname(__FILE__); if(substr($mypath, strlen($mypath) - 1) != '/') $mypath .= '/'; $fullpath = $mypath . $container .'/'. $class .'.class.php'; if(!file_exists($fullpath)) return false; require_once($fullpath); $lib = array('container' => $container, 'class' => $class); self::$libs[] = $lib; return true; } public static function isLoad($container, $class) { for($i = 0; $i < sizeof(self::$libs); $i++) { if(self::$libs[$i]['container'] == $container && self::$libs[$i]['class'] == $class) return true; } return false; } }?>
Feedback:
Jaaaaaaaa, bitte auch melden, falls ich eine wichtige Klasse vergessen habe ( was ich 100%ig getan habe )
Tion