Richtig PHP programmieren

Dipsi

Mitglied
Hallo!!

Ich hab schon ein paar Scripts mit PHP gemacht. Nur habe ich eigentlich nie
darauf geachtet ob ich überhaupt richtige vorgehe beim programmieren.:-(
Hab mir jetzt ein tolles PHP Buch gekauft.

Hab gleich mal etwas probiert. (Das Script läuft auch so ab wie ich will!)
Aber kann mir jemand vielleicht einen Tipp geben?
Oder ist der folgende Code komplett falsch?
Ich bin in der letzten Zeit ein bisschen verwirrt was PHP angeht! :-)

PHP:
<?php

//Exception Class
class conException extends Exception{};
class dbException extends Exception{};

//Database Class
class MySQL
{
  //Variable
  protected $strUser;
  protected $strPw;
  protected $strHost;
  protected $strDB;
  protected $hDB;
  
  //Constructor
  public function MySQL($strDBUser,$strDBPw,$strDBHost,$strDB)
  {
    $this->strUser = $strDBUser;
    $this->strPw = $strDBPw;
    $this->strHost = $strDBHost;
    $this->strDB = $strDB;
  }
  
  //Connection
  public function connect()
  {
    try
    {
      $this->hDB = @mysql_pconnect($this->strHost,$this->strUser,$this->strPw);
      if(!is_resource($this->hDB))
      {
        throw new conException;
      }
      else if(!mysql_select_db($this->strDB,$this->hDB))
      {
        throw new dbException;
      }
    }
    catch(conException $e)
    {
      echo 'Keine Verbindung zum Datenbankserver';
    }
    catch(dbException $e)
    {
      echo 'Datenbank nicht selektiert';
    }
  }
}

$obj = new MySQL('root','','localhost','test');
$obj->connect();
?>
 
Das sieht meiner Meinung nach alles schon ganz gut aus.
Ein paar Kleinigkeiten hab ich aber noch:
  • Der Konstruktor musste in PHP4 noch genauso heissen wie die Klasse selbst.
    Ab PHP5, und Du verwendest ja dort PHP5-OOP, wird der Konstruktor in der Regel __construct() genannt.
  • Weiterhin gibt es in PHP5 nun auch den Destruktor, die Funktion dazu nennt sich, analog zum Konstruktor, __destruct(). Dies waere in Deinem Fall ein guter Platz fuer mysql_close().
  • Und zu guter Letzt noch eine winzige Kleinigkeit: Ich wuerde die Reihenfolge der Parameter des Konstruktors aendern. Und zwar so, dass sie im Grunde der von mysql_connect() entspricht. Also: Host, User, Passwort, Datenbank
    Oder Du machst es so: Host, Datenbank, User, Passwort
    Dann kannst Du User und Passwort durch leere Standardwerte zu optionalen Parametern machen. Auch wenn man damit wohl nicht mit allzu vielen MySQL-Servern verbinden kann. ;)
 
Du könntest deine Exceptions noch weiter ausbauen, dass sie dir z.B. bei MySQL-Fehlern noch die genaue Fehlerbeschreibung und Nummer ausgeben.

Dazu musst du lediglich einen Konstruktor in deinen eigenen Exception-Klassen schreiben.

Das sieht dann z.B. so aus:
PHP:
class DBException extends Exception {
    private $error_no;
    private $error_msg;
    
    public function __construct($msg, $error_no, $error_msg, $code = 0) {
        parent::__construct($msg, $code);    
        $this->error_no = $error_no;
        $this->error_msg = $error_msg; 
    }

    public function __toString() {
        return __CLASS__ . ': '.$this->error_no.' -> '.$this->error_msg;
    }
}

// Die Exception wird dann so geworfen:
throw new DBException("Datenbank Fehler: ", mysql_errno(), mysql_error());
//...

// und so abgefangen:
try {
    //...
} catch(DBException $dbe) {
    echo $dbe->getMessage() . $dbe;
}
(ungetestet)

EDIT: Hab die Vererbung vergessen. Jetzt sollte es funktionieren.

greetz
daddz
 
Zuletzt bearbeitet:
Zurück