[PHP] OOP Error class vullen uit Mail class

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste Tweakers...

Ik snap geloof ik toch niet helemaal het principe van OOP.
Om te beginnen heb ik een index file met o.a. daarin:

code:
1
2
3
4
5
require_once ($I_CFG['sClassDir']."/error.class.php");
require_once ($I_CFG['sClassDir']."/mail.class.php");

$OBJ_ERR    = NEW ERROR($aErrorCode,"nl"); // Error object
$OBJ_MAIL   = NEW SENDMAIL($OBJ_ERR); // mail object


Als ik op een pagina dit uitvoer

code:
1
2
3
4
5
if($OBJ_MAIL->send_mail()) {
  // send mail
} else {
  // show errorlist van de error class
}


Met in de class OBJ_MAIL

code:
1
2
3
4
5
6
7
8
9
# --------------------------------------------------------------------------
# set email address 
function set_email_to($sEmail) {
    if ($this->validate_email($sEmail)) {
        $this->sEmailTo = $sEmail;
    } else {
        $this->OBJ_ERR->add_error(4);
    }
}


Maar nu vul ik lokaal het object OBJ_ERR met errors.
Maar dat wil ik niet. Ik zou graag ipv
$this->OBJ_ERR->add_error(4);
dit willen doen
$OBJ_ERR->add_error(4);

Ik heb het ook geprobeert met "sendmail extends error"

Maar geloof dat ik de clue ff mis van hoe het moet.
Dus samenvattend: Hoe vul ik de errorlist in de class error vanuit andere classes.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Parameteroverdracht? Gewoon je constructor zo maken dat je een referentie naar de error-class meegeeft.

offtopic:
Overigens slaan die hoofdletters voor je klassenamen en het new-keyword nergens op. ;) En OBJ_MAIL is geen klasse, SENDMAIL is een klasse. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja daar ben ik mee bezig geweest. Maar zonder succes... het zou als volgt moeten zijn toch?
code:
1
$OBJ_MAIL = NEW SENDMAIL(&$OBJ_ERR);

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik had het gelezen ;( without getting the point in my story

$this =& $some_other_foo_obj;

hmmmm eens zien

Volgens php.net zou dit moeten werken.

code:
1
2
$temp =& $OBJ_ERR;
$object =& $temp->add_error(4);


Ik krijg een error:
Fatal error: Call to a member function on a non-object in D:\websites\****.nl\class\mail.class.php on line 35

[ Voor 94% gewijzigd door Verwijderd op 07-06-2006 11:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
http://www.obdev.at/developers/articles/00002.html

doet mij eigenlijk ook weinig vertellen ;(

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 11:30

Guldan

Thee-Nerd

Wat je in bovenstaande code doet is een referentie van een referentie maken. Eerst maak je je OBJ_ERR referientie in $temp.. en dan roep je in een referentie van een referentie een methode aan :S probeer eens om bij die onderste regel de & weg te halen?

[ Voor 5% gewijzigd door Guldan op 07-06-2006 13:12 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nope... werkt ook niet.

Maar wat is nu de manier van werken?

$OBJ_MAIL = NEW SENDMAIL(&$OBJ_ERR);

of

$OBJ_ERR = &NEW ERROR($aErrorCode,"nl");
$OBJ_MAIL = NEW SENDMAIL($OBJ_ERR);

en wat moet er in de mail class komen te staan?

$temp = $OBJ_ERR;
$this->OBJ_ERR =& $temp->add_error(4);

??? ik niet meer snappen

Acties:
  • 0 Henk 'm!

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 08-09 11:11
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Mail
{
  private $error;

  public function __construct(Error $error)
  {
    $this->error = $error;
  }

  public function send()
  {
    if($anError)
    {
      $this->error->addError('An error');
    }
  }
}

class Error
{
  ...

  public function addError($error)
  {
    //
  }
}

$error = new Error();
$mail = new Mail($error);
$mail->send();


Misschien dat je hier iets mee kunt...

[ Voor 8% gewijzigd door remcotolsma op 07-06-2006 13:43 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Verwijderd schreef op woensdag 07 juni 2006 @ 13:26:
Nope... werkt ook niet.

Maar wat is nu de manier van werken?

$OBJ_MAIL = NEW SENDMAIL(&$OBJ_ERR);

of

$OBJ_ERR = &NEW ERROR($aErrorCode,"nl");
$OBJ_MAIL = NEW SENDMAIL($OBJ_ERR);

en wat moet er in de mail class komen te staan?

$temp = $OBJ_ERR;
$this->OBJ_ERR =& $temp->add_error(4);

??? ik niet meer snappen
Gewoon $OBJ_MAIL = NEW SENDMAIL($OBJ_ERR); sinds PHP5 is dit standaard een referentie. Voor een kopie moet je copy gebruiken.

[ Voor 73% gewijzigd door XWB op 07-06-2006 13:44 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
-NMe- schreef op woensdag 07 juni 2006 @ 11:32:

offtopic:
Overigens slaan die hoofdletters voor je klassenamen en het new-keyword nergens op. ;) En OBJ_MAIL is geen klasse, SENDMAIL is een klasse. :P
?????????? moet je wat meer over vertellen

Acties:
  • 0 Henk 'm!

  • Massiefje
  • Registratie: Mei 2002
  • Laatst online: 14:12
Verwijderd schreef op woensdag 07 juni 2006 @ 13:47:
[...]


?????????? moet je wat meer over vertellen
Moeten ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
remcotolsma schreef op woensdag 07 juni 2006 @ 13:42:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Mail
{
  private $error;

  public function __construct(Error $error)
  {
    $this->error = $error;
  }

  public function send()
  {
    if($anError)
    {
      $this->error->addError('An error');
    }
  }
}

class Error
{
  ...

  public function addError($error)
  {
    //
  }
}

$error = new Error();
$mail = new Mail($error);
$mail->send();


Misschien dat je hier iets mee kunt...
Niet echt...

Dit print_r ik uit in de class sendmail met
code:
1
2
echo "<pre>"; 
print_r($this->OBJ_ERR);




error Object
(
[bErrors] => 1
[aErrorCode] => Array
(
[nl] => Array
(
[0] =>
[1] => Please contact the webmaster of this website!
[2] => Het email versturen is mislukt!
[3] => Het e-mail adres van de afzender is niet correct!
[4] => Het opgegeven e-mail adres is niet correct!
)

[en] => Array
(
[0] =>
[1] => Please contact the webmaster of this website!
[2] => Failed to send email!
[3] => E-mail sender is not correct!
[4] => E-mail address is not correct!
)

)

[sLang] => nl
[aErrorList] => Array
(
[0] => Het opgegeven e-mail adres is niet correct!
)

)



En dit buiten de klasse



error Object
(
[bErrors] =>
[aErrorCode] => Array
(
[nl] => Array
(
[0] =>
[1] => Please contact the webmaster of this website!
[2] => Het email versturen is mislukt!
[3] => Het e-mail adres van de afzender is niet correct!
[4] => Het opgegeven e-mail adres is niet correct!
)

[en] => Array
(
[0] =>
[1] => Please contact the webmaster of this website!
[2] => Failed to send email!
[3] => E-mail sender is not correct!
[4] => E-mail address is not correct!
)

)

[sLang] => nl
[aErrorList] =>
)



en het gaat om de "aErrorList". Deze wordt gevuld in de klasse mail en niet in de error klasse

[ Voor 5% gewijzigd door Verwijderd op 07-06-2006 14:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Jaja.... _/-\o_ <= vergeten :D

Acties:
  • 0 Henk 'm!

  • remcotolsma
  • Registratie: December 2005
  • Laatst online: 08-09 11:11
Verwijderd schreef op woensdag 07 juni 2006 @ 13:47:
[...]


?????????? moet je wat meer over vertellen
Dan heb je weer variabelen met hoofdletter en dan weer met kleine... beetje consequent in die dingen zijn is nooit verkeerd.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
@ West, die code is onleesbaar, wil je dat even tussen de code tags plaatsen? [code=php]code[/code]

[ Voor 8% gewijzigd door XWB op 07-06-2006 13:58 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Verwijderd schreef op woensdag 07 juni 2006 @ 13:47:
[...]


?????????? moet je wat meer over vertellen
obj_mail is een instantie van de klasse sendmail. Zo'n instantie noem je een object, obj_mail is dus geen klasse

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 07 juni 2006 @ 13:57:
@ West, die code is onleesbaar, wil je dat even tussen de code tags plaatsen? [code=php]code[/code]
Het is geen code maar een output dump. Ik heb deze tussen de
gezet

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Misschien moet ik even wat meer code geven, ik wil het namelijk wel goed opzetten.

de index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# --------------------------------------------------------------------------
# include global vars and template
require_once ("inc/config.inc.php");
require_once ("inc/errors.inc.php");

# --------------------------------------------------------------------------
# Required classes
require_once ($I_CFG['sClassDir']."/mysql.class.php");
require_once ($I_CFG['sClassDir']."/macro.class.php");
require_once ($I_CFG['sClassDir']."/form.class.php");
require_once ($I_CFG['sClassDir']."/pc.class.php");
require_once ($I_CFG['sClassDir']."/user.class.php");
require_once ($I_CFG['sClassDir']."/error.class.php");
require_once ($I_CFG['sClassDir']."/mail.class.php");

# --------------------------------------------------------------------------
# construct pagina
$OBJ_MYSQL = NEW MYSQL($I_CFG,$DB_CFG);     // database mogelijkheden
$OBJ_MACRO = NEW MACRO($I_CFG,$DB_CFG);     // macro object
$OBJ_PC = NEW PC($I_CFG,$PC_CFG);               // opmaak object
$OBJ_USER   = NEW USER();                                   // user object
$OBJ_ERR    = NEW ERROR($aErrorCode,"nl");  // Error object
$OBJ_MAIL   = NEW SENDMAIL($OBJ_ERR);           // mail object


De mail klasse:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# --------------------------------------------------------------------------
# class mail
class SENDMAIL {
    
    var $sContentPlain;
    var $sContentHtml;
    var $sEmailTo;
    var $sEmailFrom;
    var $sSubject;
    
    # --------------------------------------------------------------------------
    # set vars
    function sendmail($OBJ_ERR) {
        $this->OBJ_ERR = $OBJ_ERR;
    }
    
    # --------------------------------------------------------------------------
    # set email address 
    function set_email_to($sEmail) {
        if ($this->validate_email($sEmail)) {
            $this->sEmailTo = $sEmail;
        } else {
            // hier add_error in het error object
        }
    }


en de Error klasse
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# error class
class ERROR {
    
    var $bErrors = false;               // boolean runtime
    var $aErrorCode = array();  // error code list
    var $sLang = "en";                  // default language
    var $aErrorList;
    
    # --------------------------------------------------------------------------
    # error constuctor
    function error($aErrorCode, $sLang) {
        $this->set_Language($sLang);
        $this->bErrors = false;
        $this->aErrorCode = $aErrorCode;
    }

    # --------------------------------------------------------------------------
    # set language
    function set_Language($sLang) {
        $this->sLang = $sLang;
    }
        
    # --------------------------------------------------------------------------
    # set error hash
    function add_error($iErr) {
        $this->bErrors = true;
        $this->aErrorList[] = $this->aErrorCode[$this->sLang][$iErr];
    }


En de pagina
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        $OBJ_MAIL->set_email_to($_POST['sToEmail']);
        $OBJ_MAIL->set_email_from("info@west-site.net");
        $OBJ_MAIL->set_subject("mail subject");
        $OBJ_MAIL->set_message_template("templ/mail_collage.txt");
        //$OBJ_MAIL->set_messagefile_template_html("html tekst");
        
        # send the mail
        if(!$OBJ_ERR->bErrors()) {
            $OBJ_MAIL->send_mail();
        } else {
            $aErrorMsg = $OBJ_ERR->error_msg();
            $sErr .= "<b>".$aErrorMsg[0].'</b><br/>';
            return $sErr.$sForm;
        }


Dan de vraag:

Ik zou graag het object OBJ_ERR willen vullen met een error vanuit het object OBJ_MAIL. Om deze daarna te kunnen tonen op de pagina.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Dan gebruik je de methode add_error toch? $OBJ_ERR->add_error('Een fout'); Overigens vind ik jouw error class niet erg netjes.

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 07 juni 2006 @ 14:19:
Dan gebruik je de methode add_error toch? $OBJ_ERR->add_error('Een fout'); Overigens vind ik jouw error class niet erg netjes.
Wat vind je er niet netjes aan?

Als ik $OBJ_ERR->add_error(4) uitvoer in de sendmail object dan is deze alleen hierin bekend. Toch? of sla ik nu echt helemaal de plank mis????

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Verwijderd schreef op woensdag 07 juni 2006 @ 14:22:
[...]


Wat vind je er niet netjes aan?
De manier waarop je de class gemaakt hebt. De classnaam in drukletters, vind ik verwarrend met constanten. Verder is php hoofdlettergevoelig en heb je de constructor in kleine letters geschreven. Dan heb je $bErrors, deze zet je standaard op false en in de constructor doe je dit nogmaals? En $aErrorCode defineer je als een array maar voor $aErrorList doe je dit niet. Verder is het ook handig om een methode te hebben die al je errors in een array returned.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Dat ligt eraan of je je script of PHP4 of PHP5 draait (ik neem aan PHP4 gezien je methode van constructors definieren). In PHP4 wordt alles by value meegegeven dus is het error object wat je in je sendmail class opslaat een kopie van het object wat je in de globale scope hebt aangemaakt. Alle wijzigingen die binnen een sendmail object uitgevoerd worden op het error object zijn dus niet in de globale scope terug te zien. In PHP5 wordt argument by reference meegegeven (wat inhoudt dat je als het ware een wijzertje naar het object meegeeft in plaats van een kopie ervan te maken) als het objecten zijn, en zou het dus al gewoon moeten werken. Je kan deze reference in PHP4 ook afdwingen door je sendmail constructor te veranderen naar:

PHP:
1
2
3
4
function sendmail(&$OBJ_ERR)
{
...
}


Je naamgeving en dergelijke is trouwens behoorlijk brak. Classes en variabelen moet je niet met hoofdletters schrijven (en language constructs zoals 'new' ook niet) want hoofdletters zijn in principe gereserveerd voor constanten. Bovendien is het nogal vreemd om je class in hoofdletters te noemen en dan vervolgens de constructor niet (in PHP4 en in de meeste andere talen moet de constructor naam gelijk zijn aan de class naam, zelfs als het zo ook werk, het is niet netjes). Voor classes begin je meestal met een hoofdletter voor ieder woord waaruit ze bestaan. En variabelen begin je altijd met een kleine letter en hoe je die verder noemt verschil per persoon (sommigen gebruiken underscores en anderen starten ieder volgend woord weer met een hoofdletter). Het lijkt allemaal misschien niet zo boeiend maar dit soort dingen maken je code wel een stuk makkelijker leesbaar.

[ Voor 8% gewijzigd door ReverendBizarre op 07-06-2006 14:41 ]


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Hacku schreef op woensdag 07 juni 2006 @ 14:27:
[...]


De manier waarop je de class gemaakt hebt. De classnaam in drukletters, vind ik verwarrend met constanten. Verder is php hoofdlettergevoelig en heb je de constructor in kleine letters geschreven. Dan heb je $bErrors, deze zet je standaard op false en in de constructor doe je dit nogmaals? En $aErrorCode defineer je als een array maar voor $aErrorList doe je dit niet. Verder is het ook handig om een methode te hebben die al je errors in een array returned.
Ik zou er dus zoiets van maken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
error_reporting(E_ALL);
# error class
class clsError {
    
    var $sLang;
    var $aErrorList = array();
    
    # --------------------------------------------------------------------------
    # error constuctor
    function clsError($sLangCode = "en") {
        $this->sLang = $sLangCode;
    }
        
    # --------------------------------------------------------------------------
    # set error hash
    function add_error($sError) {
        $this->aErrorList[] = $sError;
    }
    
    function getErrors() {
        return $this->aErrorList;
    }
    
    function getLanguage() {
        return $this->sLang;
    }           
}

$oError = new clsError("nl");

$oError->add_error("Een fout.");
print_r($oError->getErrors()); // output: 1 error

$oError->add_error("Nog een fout.");
print_r($oError->getErrors()); // output: 2 errors


Die mailclass kan best ook op de schop.

[ Voor 5% gewijzigd door XWB op 07-06-2006 14:46 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal het overnemen. Ik leer het mezelf ook maar aan.
Verder is het ook handig om een methode te hebben die al je errors in een array returned.
Klopt ik heb ook niet de hele klasse hier neergezet.
Classes en variabelen moet je niet met hoofdletters schrijven
Helemaal geen gebruiken? Ik zie het toch best veel op officiele php sites.
Net zoals het gebruik van underscores in de function names.

Code uit php.net
code:
1
2
3
class Foo { var $myVar; }

class Foo_Bar extends Foo { var $myVar2;}



Ik zal op de klasse naam letten en thanks for the notes.
Ik geloof wel dat dit een ander topic is zo :D Is er niet een site met een manual hierover?

Maar ik gebruik idd nog PHP4 voor dit project.

Hoe zou de constructor van de mail klasse eruit moeten zien?

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Helemaal geen gebruiken? Ik zie het toch best veel op officiele php sites.
Jawel, maar niet de volledige naam. Dus:

PHP:
1
2
3
4
$sString; // ok
$string; //ok
$STRING; // niet doen
define('STRING', 'Een string'); // ok
Hoe zou de constructor van de mail klasse eruit moeten zien?
Hangt ervan af wat je allemaal nodig hebt. Voor je een class maakt moet je eens goed nadenken wat je allemaal nodig hebt ;)

[ Voor 4% gewijzigd door XWB op 07-06-2006 15:01 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dus...

index

PHP:
1
2
$oError = new clsError($aErrorCode,"nl"); // Error object
$oMail  = new clsMail($oError);                     // mail object


pagina
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$oMail->set_email_to($_POST['sToEmail']);
$oMail->set_email_from("info@west-site.net");
$oMail->set_subject("mail subject");
$oMail->set_message_template("templ/mail_collage.txt");

# send the mail
if($oMail->bErrors) {
    $oMail->send_mail();
    return "send mail";
} else {
    $aErrorMsg = $oMail->error_msg();
    $sErr .= "<b>".$aErrorMsg[0].'</b><br/>';
    return $sErr.$sForm;
}


mail class
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# --------------------------------------------------------------------------
# class mail
class clsMail {
    
    var $sContentPlain;
    var $sContentHtml;
    var $sEmailTo;
    var $sEmailFrom;
    var $sSubject;
    
    # --------------------------------------------------------------------------
    # set vars
    function clsMail(&$oError) {
        $this->oError = $oError;
    }
    
    # --------------------------------------------------------------------------
    # set email address 
    function set_email_to($sEmail) {
        if ($this->validate_email($sEmail)) {
            $this->sEmailTo = $sEmail;
        } else {
            // hier add_error in het error object
            $this->oError->add_error(4);
        }
    }

    # --------------------------------------------------------------------------
    # set email address 
    function set_email_from($sEmail) {
        if ($this->validate_email($sEmail)) {
            $this->sEmailFrom = $sEmail;
        } else {
            $this->oError->add_error(3);
        }
    }


en de error class

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# --------------------------------------------------------------------------
# error class
class clsError {
    
    var $bErrors;                               // boolean runtime
    var $sLang;                                 // default language
    var $aErrorCode = array();  // error code list
    var $aErrorList = array();  // list with runtime errors
    
    # --------------------------------------------------------------------------
    # error constuctor
    function clsError($aErrorCode, $sLang = "en") {
        $this->set_Language($sLang);
        $this->bErrors = false;
        $this->aErrorCode = $aErrorCode;
    }

    # --------------------------------------------------------------------------
    # set language
    function set_language($sLang) {
        $this->sLang = $sLang;
    }
        
    # --------------------------------------------------------------------------
    # set error hash
    function add_error($iErr) {
        $this->bErrors = true;
        $this->aErrorList[] = $this->aErrorCode[$this->sLang][$iErr];
    }
    
    # --------------------------------------------------------------------------
    # runtime 
    function error_runtime() {
        return $this->bErrors;
    }


Nu dan...
De aanroep in het object oMail:
PHP:
1
$this->oError->add_error(4);

Vult het $this->oError object. Deze kan ik aanroepen in de pagina met $oMail->oError. Maar wat ik zou willen doen is $oErrors->get_errors();

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Waarom wil je het error object eigenlijk in je mailclasse?
Je kan ook :

PHP:
1
2
3
4
5
if (!$oMail->send_mail()) {
   $oError->add_error('Mislukt');
} 

print_r($oError->get_errors());


doen.

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hacku schreef op woensdag 07 juni 2006 @ 15:26:
Waarom wil je het error object eigenlijk in je mailclasse?
Je kan ook :

PHP:
1
2
3
4
5
if (!$oMail->send_mail()) {
   $oError->add_error('Mislukt');
} 

print_r($oError->get_errors());


doen.
Dat zou idd een stuk makkelijker zijn ik weet :D maar ben eigenwijs en wil de klassen voor meerdere projecten gebruiken + de klasse error heeft een array met error foutmeldingen. Op deze manier hoef ik alleen de included file met error meldingen aan te passen indien nodig.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
maar ben eigenwijs en wil de klassen voor meerdere projecten gebruiken
In dat geval zou ik het zeker niet doen, als je de mailclass dus in 10 projecten wil gebruiken moet je overal je errorclass gebruiken omdat de constructor dat object verwacht.

En dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
    function clsError($aErrorCode, $sLang = "en") {
        $this->set_Language($sLang);
        $this->bErrors = false;
        $this->aErrorCode = $aErrorCode;
    }

    # --------------------------------------------------------------------------
    # set language
    function set_language($sLang) {
        $this->sLang = $sLang;
    }


Als je de taalcode alleen via de constructor wil zetten heb je die methode set_language niet nodig maar kan je gewoon:

PHP:
1
2
3
    function clsError($aErrorCode, $sLang = "en") {
        $this->sLang = $sLang;
    }


doen.

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor het geval dat ik zoiets toch zou willen doen?

Wat is dan de juiste manier :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Hacku schreef op woensdag 07 juni 2006 @ 15:38:
In dat geval zou ik het zeker niet doen, als je de mailclass dus in 10 projecten wil gebruiken moet je overal je errorclass gebruiken omdat de constructor dat object verwacht.
Dat is toch niet zo'n probleem? Als je maar niet afhankelijk van concrete classes gaat zijn, maar alleen van de interface. Op dit moment kun je ieder object gebruiken dat methode add_error implementeerd. Dat is helemaal niet verkeerd opzich. Ik zou wel duidelijker defineren wat je intenties zijn. Bij Error gaan er niet echt veel belletjes rinkelen over wat je nou wilt doen moet die class. ErrorLogger of ErrorHandler zou al beter zijn. add_error(4) vind ik ook niet echt geweldig eerlijk gezegd. trigger_error(ERROR_MAIL) of log_error(ERROR_MAIL) is imo al een stuk beter.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op woensdag 07 juni 2006 @ 19:01:
[...]ErrorLogger of ErrorHandler zou al beter zijn. add_error(4) vind ik ook niet echt geweldig eerlijk gezegd. trigger_error(ERROR_MAIL) of log_error(ERROR_MAIL) is imo al een stuk beter.
Zekers... nog niet overna gedacht. Ik heb een error lijst die editable is met daarin de meldingen.

Weet alleen nou nog steeds niet hoe ik het voor elkaar moet krijgen om het object error te vullen

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Heb je hier wat aan?
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

define('ERROR_TYPE_MAIL', 4);

/*
interface ErrorHandler
{
    function handleError($error);
}
*/

class ErrorManager /* implements ErrorHandler */
{
    var $registeredErrors;
    
    function ErrorManager()
    {
        $this->registeredErrors = array();
    }
    
    function registerError($errorType)
    {
        $this->registeredErrors[] = $errorType;
    }
    
    function handleError($errorType)
    {
        $this->registerError($errorType);
    }
    
    function getRegisteredErrors()
    {
        return $this->registeredErrors;
    }
}

class Mailer
{
    var $errorHandler;
    
    function Mailer(/* ErrorHandler */ &$errorHandler)
    {
        $this->errorHandler = &$errorHandler;
    }
    
    function mail()
    {
        $this->errorHandler->handleError(ERROR_TYPE_MAIL);
    }
}

$errorManager = new ErrorManager();
$mailer = new Mailer($errorManager);
$mailer->mail();
var_dump($errorManager->getRegisteredErrors());

?>


Ik heb het niet in PHP4 getest, maar het zou daar wel gewoon in moeten werken, het is met die syntax geschreven. Ik heb er commentaar bij gezet, wat een interface impliceert. Ik hoop dat dat concept zo iets duidelijker wordt.

[ Voor 4% gewijzigd door Michali op 07-06-2006 23:17 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Vet relaxed... jah zeker, mooi mooi mooi! ik gaat het gebruiken! thanks! Mag ik ook vragen hoe het eruit zou komen te zien in PHP5?

Zoiets?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php

define('ERROR_TYPE_MAIL', 4);

/*
interface ErrorHandler
{
    function handleError($error);
}
*/

class ErrorManager /* implements ErrorHandler */
{
    private $registeredErrors;
    
    function __construct()
    {
        $this->registeredErrors = array();
    }
    
    private function registerError($errorType)
    {
        $this->registeredErrors[] = $errorType;
    }
    
    public function handleError($errorType)
    {
        $this->registerError($errorType);
    }
    
    public function getRegisteredErrors()
    {
        return $this->registeredErrors;
    }
}

class Mailer
{
    private $errorHandler;
    
    function __construct(/* ErrorHandler */ &$errorHandler)
    {
        $this->errorHandler = &$errorHandler;
    }
    
    public function mail()
    {
        $this->errorHandler->handleError(ERROR_TYPE_MAIL);
    }
}

$errorManager = new ErrorManager();
$mailer = new Mailer($errorManager);
$mailer->mail();
var_dump($errorManager->getRegisteredErrors());

?>

[ Voor 111% gewijzigd door Verwijderd op 08-06-2006 10:24 ]


Acties:
  • 0 Henk 'm!

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Je kan de /* en */ ook weghalen, PHP5 ondersteunt interfaces en type hinting voor objecten. Die & is ook niet nodig omdat PHP5 alle objecten per definitie als reference meegeeft.

[edit: die & staat er zelfs dubbelop. Als het argument al een & ervoor heeft hoef je die er niet weer voor te zetten wanneer je hem gaat opslaan in een variabele want dan ben je eigenlijk een reference naar een reference aan het opslaan]

[ Voor 41% gewijzigd door ReverendBizarre op 08-06-2006 12:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Werkt mooi! zekers! Begrijp er heel wat meer van nu. Wat ik nog niet zo 1 2 3 weet is als ik met define een errormessagelijst maak hoe ik dan ook nog een variabele kan mee geven.

Dus ik heb nu

PHP:
1
define('ERROR_TO_MAIL', "Failed to send an email", 0);


En in het object:

PHP:
1
$this->oErrorHandler->handleError(ERROR_TO_MAIL);


Hoe krijg kan ik de variabele $sEmail = "bla@bla.nl"; weer geven in de errormessage?

Iemand die me een hint kan geven?

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
http://be.php.net/define
The optional third parameter case_insensitive is also available. If the value TRUE is given, then the constant will be defined case-insensitive. The default behaviour is case-sensitive; i.e. CONSTANT and Constant represent different values.
De tweede parameter is dus de value :)

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Op http://nl2.php.net kon ik dat ook vinden. ;) :D Blijkbaar moet ik een extra functie schrijven zoals:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Define
{
   var $Name;
   var $Func;
  
   function Define($Name, $Func)
   {
       $this->Name = $Name;
       $this->Func = &$Func;
   }
}

$DEFINES = array();

function set_define($Name, $Value, $Args)
{
   global $DEFINES;
   foreach($DEFINES as $DEFINE)    if($DEFINE->Name == $Name) return false;
   $DEFINES[] = new Define($Name, create_function($Args, 'return "' . $Value . '";'));
}

function get_define($Name, $Args = NULL)
{
   global $DEFINES;
   foreach($DEFINES as $DEFINE) if($DEFINE->Name == $Name)
   {
       $Func = $DEFINE->Func;
       return eval('return $Func(' . implode(",", $Args) . ');');
   }
   return false;
}
?>

<?php
set_define("ERROR", 'There was an error : $error\n', '$error');
echo get_define("ERROR", array("pouet"));


Of....? is er een makkelijkere manier?

[ Voor 12% gewijzigd door Verwijderd op 16-06-2006 16:21 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Wow, dit is wel de meest ranzige code en meest omslachtige oplossing die ik deze week heb gezien :P

Je wil blijkbaar gewoon een message aan een error type koppelen en parameters kunnen toevoegen? Waarom niet gewoon zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php

define('ERROR_TYPE_MAIL', 0);

$errorMessages = array(
    ERROR_TYPE_MAIL => 'Hier is je message met {parameter1} en {parameter2}.'
);

function getErrorMessage()
{
    if ( func_num_args() == 0 )
    {
        return null;
    }
    $errorType = func_get_arg(0);
    if ( !isset($GLOBALS['errorMessages'][$errorType]) )
    {
        return null;
    }
    $errorMessage = $GLOBALS['errorMessages'][$errorType];
    $params = array_slice(func_get_args(), 1);
    $paramCount = count($params);
    if ( $paramCount % 2 != 0 )
    {
        return null;
    }
    for ( $i = 0; $i < $paramCount; $i += 2 )
    {
        $errorMessage = str_replace($params[$i], $params[$i + 1], $errorMessage);
    }
    return $errorMessage;
}

$message = getErrorMessage(
    ERROR_TYPE_MAIL,
    '{parameter1}', 'een appel',
    '{parameter2}', 'een banaan'
);

print $message;

?>


Gelijk een handige functie erbij.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Michali schreef op zaterdag 17 juni 2006 @ 12:17:
Wow, dit is wel de meest ranzige code en meest omslachtige oplossing die ik deze week heb gezien :P
En die code kan je zo kant en klaar rippen van php.net :D

Thanks voor de code... ik had zoiets al eerder maar dan zonder define. Dit is top! _/-\o_ Erg veel aan je code gehad. Kan nu tenminste verder bouwen op een manier die duidelijk is er werkt!

Enige minpunt... ik vind globals niks... waarom dat is kan ik je niet precies zeggen.
Maar ik geef liever een var mee met een functie dan:
$errorMessage = $GLOBALS['errorMessages'][$errorType];

Thanks

[ Voor 18% gewijzigd door Verwijderd op 19-06-2006 12:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
define('ERROR_TYPE_MAIL', 0);

Is in je laatste voorbeeld ook niet meer nodig toch?




Ik heb er dit van gemaakt. Wel of niet goed?

De errorhandler include list met defined errors:
PHP:
1
define('ERROR_TO_MAIL', "Failed to send an email to {parameter1} ({parameter2})", 0);


De functie in de mailhandler class:
PHP:
1
2
3
4
5
6
7
    public function to_email_address($sToEmail, $sTo) {
        $this->oEm->handle_error(
            ERROR_TO_MAIL, 
            '{parameter1}', $sToEmail,
            '{parameter2}', $sTo
        );
    }


En de errorhandler class:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    # --------------------------------------------------------------------------
    private function register_error($sErrorType) {
        $this->registeredErrors[] = $sErrorType;
    }

    # --------------------------------------------------------------------------
    public function handle_error() {
        
        # are there arguments?
        if (func_num_args() == 0) {
            return null;
        }
        
        # The first argument is always the error type
        $sErrorMsg = func_get_arg(0);
        $hParams = array_slice(func_get_args(), 1);
        $iParamCount = count($hParams);
                
        if ( $iParamCount % 2 != 0 ) {
            return null;
        }
        
        # Replace the first param string with the argument
        for ( $i = 0; $i < $iParamCount; $i += 2 ) {
            $sErrorMsg= str_replace($hParams[$i], $hParams[$i + 1], $sErrorMsg);
        }
            
        $this->register_error($hErrorMsg);
    }
    
    # --------------------------------------------------------------------------
    # return messages
    public function get_registered_errors() {
        return $this->registeredErrors;
    }

[ Voor 108% gewijzigd door Verwijderd op 19-06-2006 15:23 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op maandag 19 juni 2006 @ 09:44:
Enige minpunt... ik vind globals niks... waarom dat is kan ik je niet precies zeggen.
Maar ik geef liever een var mee met een functie dan:
$errorMessage = $GLOBALS['errorMessages'][$errorType];
Je moet ook heel erg uitkijken voor globals. Maar het gebruik op deze manier is niet verkeerd. Als je globals op een readonly manier gebruikt, of alleen via een vaste set methoden (en geen enkele anderen), dan is er weinig mis mee. Maar als je het kan oplossen zonder globals zonder al te veel moeite of omwegen, dan moet je dat zeker doen.
Verwijderd schreef op maandag 19 juni 2006 @ 13:48:
define('ERROR_TYPE_MAIL', 0);

Is in je laatste voorbeeld ook niet meer nodig toch?
Ik zou je error define niet direct aan een message koppelen. Zo is het ook onmogelijk om meerdere talen als optie te geven. $errorMessages zou je in aparte bestanden kunnen zetten, zoals error_message_nl.php en error_messages_en.php, en dan aan de hand van de huidige taal de juiste file includen. Je defines (je error typen) staan daar helemaal los van.

Overigens zou ik van {parameter1} {to} maken en van {parameter2} {email}. Dat is wat duidelijker.

[ Voor 6% gewijzigd door Michali op 19-06-2006 16:25 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Wow, ik denk dat je misschien even eerst stil wil staan over je opzet. Je beseft je nu wel dat je asynchroon met twee objecten zit te checken of je een error bij de ene hebt? Aggregratie is niet zo handig me dunkt, aangezien je wil dat de error object alleen van toepassing is op je mail object toch? Wat nou als je meerdere objecten hebt, die ook afhankelijk zijn van 'errors'. Ga je dan analoog voor n objecten ook n error objecten aanmaken? Maakt dat het niet ongelooflijk onoverzichtelijk op een gegeven moment? Of ben je van plan met 1 error object alles af te handelen ? Hoe ben je van plan terug te traceren dan etc... Het is allemaal wel mogelijk, maar toch even waard om er bij stil te staan. Zoals je het nu hebt staan iig, is dat je per object waar iets fout KAN gaan, al per definitie een error object voor aanmaakt. Beetje voorbarig vind je niet? ;) Zonde van de resources ;) Je zou de error object ook kunnen gooien op het moment dat het fout gaat; hallo exceptions. Mensen hebben hier wel 's eerder over nagedacht dus, en het is het misschien waard om er even naar te kijken ;)

Acties:
  • 0 Henk 'm!

  • D4V3
  • Registratie: Augustus 2003
  • Laatst online: 19-03-2021
-- edit --

Whoops, had pagina 2 nog niet gezien, solly ;)

[ Voor 99% gewijzigd door D4V3 op 19-06-2006 18:17 ]

op-voorraad.nl - Realtime voorraad updates voor de Playstation 5!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
prototype schreef op maandag 19 juni 2006 @ 16:54:
Wow, ik denk dat je misschien even eerst stil wil staan over je opzet. Je beseft je nu wel dat je asynchroon met twee objecten zit te checken of je een error bij ...
De errorhandler class zou er voor moeten dienen om met een include file (de messages). Fouten te bewaren. Niet alleen van de mail maar nu ook voor formulieren. Dus indien het tekstveld verkeerd is ingevoerd komt de boolean in de errorhandler class op true en kan ik (alle) foutieve meldingen tonen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik snap trouwens ook niet precies wat je bedoelt met "asynchroon" want ik vul toch gewoon de hash in het object errorhandler vanuit object mail? Dit ben ik nu ook aan het doen met het object formulieren.

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Verwijderd schreef op donderdag 22 juni 2006 @ 10:07:
Ik snap trouwens ook niet precies wat je bedoelt met "asynchroon" want ik vul toch gewoon de hash in het object errorhandler vanuit object mail? Dit ben ik nu ook aan het doen met het object formulieren.
Dat asynchroon gaat misschien niet helemaal op hier aangezien PHP geen multithreading ondersteund, maar het idee is ongeveer hetzelfde; wat nou als een object ergens je error object een statechange geeft die ongewenst is. Het is zeg maar iets dat niet zozeer een probleem hoeft te zijn, maar wel rekening mee gehouden moet worden, dus of iets ook re-entrant safe is; als ik een argument geef, wordt deze argument dan aangepast na verloop van de methode? en hoe backtrack ik eventuele fouten? Het zal allemaal wel mogelijk zijn, maar 'k herinner je er even aan dat er mechanismen hiervoor zijn bedacht, namelijk excepties.
Pagina: 1