[PHP] OOP Komponenten ( die das Leben leichter machen )

  • 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:

    PHP
    ComponentLoader::load('files', 'ZIPWriter');


    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 :P

    • 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:

    Code
    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

    Code
    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.

    Code
    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";

    Code
    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.

    PHP
    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.

    Code
    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;

    Code
    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.

    Code
    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 8| Da kann man nicht einfach den Sourcecode posten ;)
    Hier einfach mal der Source von dem ComponentLoader:

    PHP
    <?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;      }    }?>


    Download:
    Tell me have you seen the Marvellous Breadfish - Swimming in the ocean waters - Have you seen the Marvellous Breadfish - He's like an inverse sandwich - For fishermen and sharks.


    Feedback:
    Jaaaaaaaa, bitte auch melden, falls ich eine wichtige Klasse vergessen habe ( was ich 100%ig getan habe ;) )


    Tion

  • Nichts, was e snicht schon länsgt in besser gäbe: http://pear.php.net/


    ... klingt cool, unterwelcher Lizenz steht das ? Finde auf der Webseite nichts :(


    (e: Dafür braucht man Zugriff auf die Shell, um die Packages zu installieren - was man bei 99% der Hoster wohl nicht hat ;) )

  • Blödsinn, kann man natürlich auch Manuell machen


    Wie genau Manuell ?



    und bringen keine nennenswerte Vorteile außer das man damit das OOP Konzept verfolgen kann.


    Zitat von Tion

    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.



    Zitat von Vincent Petritz

    OOP würde ich das auch nicht unbedingt nennen, nur weil er mit Klassen arbeitet.


    ... kein Kommentar.

  • Mh, naja.
    OOP würde ich das auch nicht unbedingt nennen, nur weil er mit Klassen arbeitet.


    Was sonst? *kopfschüttel Lerne mal die Bedeutung der Begriffe bevor du etwas verneinst.


    Tion man kann sich eine Klasse einfach runterladen und in seine PHP Applikation einfügen, gleich wie deine.


    Finde es schön, dass sich Entwickler mit PHP5 auseinandersetzen, aber wenn man etwas veröffentlicht(in Breadfish) soll das nicht aus Jucks und Dollerei sein sondern schon etwas nützliches...

  • OOP ist ein interresantes Thema. Ich befasse mich seit längerem auch damit.


    Du hast dir viel Mühe gegeben, allerdings denke ich solltest du diesen Artikel in einem anderen Forum,
    was sich nur damit befasst, eintragen.


    Hier gibt es zu wenige die sich mit der Materie auskennen.



    Liebe Grüße,


    Steven