Willkommen in der Webstatt Zum Webstatt Blog und Stories
phore phore am 21.06.07 13:04

Hallo

Ich habe soeben mit meiner ersten richtigen OOP Applikation angefangen. Und dazu habe ich einige Fragen, und da ich noch am entwickeln bin, kommen sicher noch ein paar dazu :) ..

Die Applikation ist klein, man kann eine Absender und Empfänger Email angeben, einen Text und eine Datei. Die Datei wird auf 'nen FTP geladen, und im Email ein Link verschickt. Soll dann für's Büro eine Art Web FTP geben für die Mitarbeiter.

Also erstmal, mein Aufbau ist im Moment so (aufs Wesentliche beschränkt):

root
-- class
-- data.class.php
-- error.class.php
-- data_excep.class.php
index.php


INDEX.PHP
(die Bedingungen sind noch leer, spielt aber hier noch keine Rolle, ich triggere (absichtlich) im Moment nur einen Fehler in der Function [FONT=courier new]checkContent()[/FONT])

<?php
if ($_POST['action'] == 'Speichern und Versenden') {

function __autoload ($class)
{
require 'class/'.$class.'.class.php';
}

// Variablen abfüllen
$getter = $_POST['empfaenger_email'];
$sender = $_POST['absender_email'];
$text = $_POST['nachricht'];

$data = new Data;
if ($data->checkContent($getter) && $data->checkContent($sender)) {
if ($data->checkHost($getter) || $data->checkContent($sender)) {
if ($data->checkLength($getter, 60) && $data->checkLength($sender, 60)) {

}
}
}
}
?>
Hier käme der HTML Code, lass ich mal weg.


DATA.CLASS.PHP

<?php
class Data {
private $required_host;

// Auf Inhalt prüfen
public function checkContent ($string)
{
if (strlen($string) > 5) {
if ($this->checkEmail($string)) {
return true;
} else {
// Fehler:
// ungültiges Email Format
}
} else {
throw new data_excep('<b>Fehler</b><br />Email war zu kurz!', 1);
}
}

/* Prüfen ob Email gültig ist */
public function checkEmail ($email)
{
$email = eregi("^[a-z0-9]+([-_\.]?[a-z0-9])+@[a-z0-9]+([-_\.]?[a-z0-9])+\.[a-z]{2,4}", $email);
return $email;
}

// Prüfen ob Email Host erlaubt ist
public function checkHost ($email)
{
if (explode($mail, $this->required_host)) {
return true;
} else {
// Fehler:
// "xy.com" nicht im emailadresse vorhanden
}
}

// Maximale Dateinamen Länge prüfen
public function checkLength ($string, $max_length)
{
if (strlen($string) <= $max_length) {
return true;
} else {
// Fehler:
// Text zu lang!
}
}
}
?>


DATA_EXCEP.CLASS.PHP

<?php
class data_excep extends Exception {

}
?>



Die Error Klasse ist noch nichts und wird deshalb nicht aufgelistet. Da kommen auch schon meine Fragen:

1. Bin ich so auf dem richtigen weg? Oder ist der Code schon verkehrt? Wo kommt eigentlich die Ablaufsteuerung rein? Habs ja jetzt wie ihr seht in die index.php gepackt, ist das ok so (für eine kleine Anwendung)?

2. Kann mir jemand helfen hier ein sauberes Error Handling einzubauen? Ich kenne das error_report zeugs und den Error Handler, hab aber keine Ahnung wie ich das jetzt mit der Exception Klasse von PHP verbinden kann..

3. Sehe ich das richtig: try{}/catch{} verwendet man ausserhalb der Klasse, throw{} innerhalb? Ist das komplett falsch? :) Wie setze ich die richtig ein?


Das wärs erstmal, Danke schonmal für eure Antworten!

- phore

netcup.de Warum gibt es hier Werbung?
Snake am 21.06.07 16:40

Quote
Original von phore
1. Bin ich so auf dem richtigen weg? Oder ist der Code schon verkehrt? Wo kommt eigentlich die Ablaufsteuerung rein? Habs ja jetzt wie ihr seht in die index.php gepackt, ist das ok so (für eine kleine Anwendung)?

bei "echtem oop" ist jeder code der was anständiges macht in ner klasse. lediglich der erste aufruf (und __autoload) sind außerhalb. Dennoch ist das für deine anwendung durchaus ok
Quote
Original von phore
2. Kann mir jemand helfen hier ein sauberes Error Handling einzubauen? Ich kenne das error_report zeugs und den Error Handler, hab aber keine Ahnung wie ich das jetzt mit der Exception Klasse von PHP verbinden kann..

Ich mach das so:
<?php

class PHP_Exception extends Exception {

public function setLine($line) {
$this->line = $line;
}
public function setFile($file) {
$this->file = $file;
}
}

abstract class ErrorHandler {


public static function phperror ($errno, $errstr, $errfile, $errline) {
//if($errno==E_STRICT) return; //auskommentierung entfernen wenn man keine strikt meldungen haben will
if(error_reporting()==0) return; //mit @ unterdrückt
if($errfile == __FILE__) { //naja...doof...
//die('Beim Abfangen eines Fehlers ist ein Fehler aufgetreten!');
//return;
}
$errors = array(
E_WARNING => 'E_WARNING',
E_NOTICE => 'E_NOTICE',
E_USER_ERROR => 'E_USER_ERROR',
E_USER_WARNING => 'E_USER_WARNING',
E_USER_NOTICE => 'E_USER_NOTICE',
E_STRICT => 'E_STRICT'
);
$e = new PHP_Exception($errstr);
//try to hack the exception
$e->setFile($errfile);
$e->setLine($errline);
throw $e;

}

public static function getErrorMessage($type, $e) {
ob_end_clean();
$trace = str_replace(array(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB), '****', $e->getTraceAsString()); //replace sensible data to ***
return $type.' error in '.$e->getFile().':'.$e->getLine().'<br><br>Message: '.nl2br($e->getMessage()).'<br><br>Stacktrace:<br><pre>'.$trace.'</pre>';
}

public static function unhandledException($e) {
switch (get_class($e)) {
case 'Mysql_Exception':
echo self::getErrorMessage('Mysql', $e);
break;
case 'PHP_Exception':
echo self::getErrorMessage('PHP', $e);
break;
case 'Exception':
echo self::getErrorMessage('Fatal', $e);
break;
}
exit;
}
}
set_error_handler(array('ErrorHandler', 'phperror'));

set_exception_handler(array('ErrorHandler', 'unhandledException'));
?>

leider bringt er bei php fehlern nicht den 100% richtigen stacktrace, aber es lässt sich erahnen

Quote
Original von phore
3. Sehe ich das richtig: try{}/catch{} verwendet man ausserhalb der Klasse, throw{} innerhalb? Ist das komplett falsch? :) Wie setze ich die richtig ein?

Halb richtig.
Wie oben schon beschrieben, ist bei "echtem oop" alles in einer klasse.
Aber auch ich lass die try/catch blöcke außerhalb der klassen. ist meiner meinung nach übersichtlicher.

einfaches beispiel:

<?php
class myException extends Exception { }

try {
new meineHauptKlasse();
throw new myException('Fehlermeldung'); //kann auch IRGENDWO in der klasse stehen!
} catch(Exception $e) {
echo 'Exception caught'; //wird NICHT aufgerufen!
} catch(myException $e) {
echo 'myException caught'; //wird aufgerufen
}

phore phore am 27.06.07 13:43

danke dir schonmal für die antworten.

hat jemand auch eine einfachere funktion für fehler? ich blicke da nicht ganz durch. was wäre das einfachste funktionierende beispiel?

zudem verstehe ich den unterschied nicht zwischen [FONT=courier new]handle_error()[/FONT] und [FONT=courier new]throw new meineException()[/FONT] - bzw. wann verwendet man was?

danke & gruss

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt