XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   OOP Problem - class Email (http://xhtmlforum.de/showthread.php?t=47681)

ct2oo4 31.08.2007 14:59

OOP Problem - class Email
 
Hi Leute,
ich wollte heute mal wieder etwas in PHP programmieren und dabei wollte ich auf die OOP zurückgreifen.
Projekt ist "noch" ein Email Script.
Bisher sieht das Kontaktformular schlicht gehalten aus. Dies ist auch so gewollt, denn mir geht es im wesentlichen Sinne eher darum etwas die OOP kennen zu lernen.
Das Kontaktfomular wie folgt:
PHP-Code:

<?php
require_once 'Email.php';
echo 
"
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='de' lang='de'>
<head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
    <title>Email.php Test</title>
</head>

<body>
 <form action='"
.$PHP_SELF."' method='POST'>
  <input type='text' name='from' /><br />
  <input type='text' name='subject' /><br />
  <textarea name='text'></textarea><br />
  <input type='submit' name='send' value='submit' /><br />
 </form>
</body>
</html>
"
;    

if (
$send) {
 
$email = new Email($_POST['subject'], $_POST['text']);
 print 
$email->_sendEmail();
}

?>

bitte nicht wegen dem statischen html im echo Befehl nörgeln ;).

hier die Email Klasse in Email.php

PHP-Code:

<?php
$to 
'*********';
$header "MIME-Version: 1.0\n";
 
$header .= "Content-type: text/html; charset=iso-8859-1\n";
 
$header .= "From: ".$_POST['from']."\n";


class 
Email 
{
    var 
$subject '';
    var 
$text '';
    
    function 
Email($subject$text
    {
        
$this->subject $subject;
        
$this->text $text;
        return 
Email::_sendEmail();
    }
    
    function 
_sendEmail()
    {
        global 
$to;
        global 
$header;
        if (isset(
$to$subject$text)) {
            
mail($to$subject$text$header);
            return 
'Successful';
        } else {
            return 
'Not successful';
        }
    }
}

?>

Jetzt habe ich das Problem, dass mir sobald ich den submit Button in dem Formular betätige, mir ein "Not successful" ausgegeben wird, obwohl ich alle Felder gesetzt habe.
Außerdem hätte ich noch eine Frage: Funktioniert der Konstruktor wie ich ihn möchte überhaupt?
Wäre für Hilfe dankbar :)
MfG Matze


$to wegen Spamgefahr/angst ^^ geändert.



/* --------------------------------------------------------------------------------------------------------------------------------------- */
Ich habe es jetzt soweit hinbekommen, dass die Email versendet wird:
PHP-Code:

<?php
require_once 'Email.php';
echo 
"
<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN'
    'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>

<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='de' lang='de'>
<head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />
    <title>Email.php Test</title>
</head>

<body>
 <form action='"
.$PHP_SELF."' method='POST'>
  <input type='text' name='from' /><br />
  <input type='text' name='subject' /><br />
  <textarea name='text'></textarea><br />
  <input type='submit' name='send' value='submit' /><br />
 </form>
</body>
</html>
"
;    

if (
$send) {
 
$email = new Email($_POST['subject'], $_POST['text']);
}

?>

PHP-Code:

<?php
$to 
'**********';
$header "MIME-Version: 1.0\n";
 
$header .= "Content-type: text/html; charset=iso-8859-1\n";
 
$header .= "From: ".$_POST['from']."\n";


class 
Email 
{
    var 
$subject '';
    var 
$text '';
    
    function 
Email($subj$txt
    {
        
$this->subject $subj;
        
$this->text $txt;
        return 
Email::_sendEmail();
    }
    
    function 
_sendEmail()
    {
        global 
$to;
        global 
$header;
        if (
$this->subject !== '' && $this->text !== '') {
            
mail($to$this->subject$this->text$header);
            return 
'Successful';
        } else {
            return 
'Not successful';
        }
    }
}

?>

Ich musste print $email->_sendEmail(); löschen da sonst das script zweimal ausgeführt werden würde.
Dennoch verstehe ich nicht warum ich meine klasseninternen Variablen $subject und $text nicht in dieser Form verwenden kann - sondern nur mittels $this->subject bzw. $this->text!???
Außerdem wird mir jetzt der Return von _sendEmail() nicht mehr zurückgeben!? Wenn ich print $email schreibe wird nur "Object" ausgegeben. Wie bekomme ich den Return "ausgegeben"?

Vielen Dank schon im Voraus! :)
MfG Matze

(ist !== richtig?)

heartdisease 31.08.2007 16:38

Zitat:

Zitat von ct2oo4 (Beitrag 347709)
Dennoch verstehe ich nicht warum ich meine klasseninternen Variablen $subject und $text nicht in dieser Form verwenden kann - sondern nur mittels $this->subject bzw. $this->text!???

Damit PHP nicht mit Klassen- und Methodenvariablen durcheinander kommt.
In Java ist es prinzipiell kein Problem, in PHP muss man allerdings hierbei strikt unterscheiden. Dafür darf man ansonsten eh schlampen wie man will xD

Zitat:

Wenn ich print $email schreibe wird nur "Object" ausgegeben. Wie bekomme ich den Return "ausgegeben"?
Tja, das liegt ganz klar auf der Hand :D
Ein Konstruktor liefert NIE einen Wert zurück! Er dient lediglich dazu ein Objekt (in diesem Fall die Klasse Email) zu instanziieren! Hier schlägt auch wieder die schlampige Syntax von PHP zurück, da es keine strikte Trennung der Datentypen gibt!

Vergleich zu Java:
Code:

// "Normale" Methode die einen String zurückgibt
// Syntax: Sichtbarkeit - Typ des Rückgabewerts - Methodenname
public String methode() {
        return new String();
}

// Konstruktor
// Syntax: Sichtbarkeit - Methodenname
public Klassenname() {}

Zitat:

(ist !== richtig?)
Nein! Es ist nur === zulässig. Du müsstest schreiben:
PHP-Code:

if ( !($this->subject === '') && !($this->text === '') ) 

Ich würde dir allerdings diese Syntax nahelegen:
PHP-Code:

if ( !empty($this->subject) && !empty($this->text) ) 

Zitat:

Wie bekomme ich den Return "ausgegeben"?
Mal sicher nicht über den Konstruktor wie wir ja jetzt wissen ;)
Es ist allerdings erschreckend dass du innerhalb der Klasse auf diesselbe Klasse statisch zugreifen möchtest ... oÔ ( Email::_sendEmail() )

Probier doch mal das:
PHP-Code:

if ($send) {
    
$email = new Email($_POST['subject'], $_POST['text']);
    
$email->_sendEmail();


Und schmeiß endlich
PHP-Code:

return Email::_sendEmail(); 

aus dem Konstruktor ^^'

Hoffe ich konnte dir OOP hiermit etwas näher bringen. Viel Spaß noch beim Programmieren 8)

ct2oo4 31.08.2007 16:59

Ahh... ja danke! Du hast mir sogar sehr geholfen! Jetzt funktioniert es :).
Das mit dem Return im Konstruktor habe ich aus einem PEAR Package (Text_Password). Ich dachte damit könnte man erzwingen, dass die komplette Klasse "abgearbeitet" wird. So in der Art, dass sobald man $irgendwas = new Email(wert, wert, ...); schreibt, es diese auch sofort versendet, ohne erst eine weiter Funktion à la $irgendwas->_sendEmail aufrufen zu müssen. Aber nun weis ich ja, dass dies nicht möglich ist ;).

auszug aus dem PEAR Package "Text_Password":
Author: Martin Jansen und Olivier Vanhoucke

PHP-Code:

class Text_Password {
    function 
create($length 10$type 'pronounceable'$chars '')
    {
        switch (
$type) {
        case 
'unpronounceable' :
            return 
Text_Password::_createUnpronounceable($length$chars);

        case 
'pronounceable' :
        default :
            return 
Text_Password::_createPronounceable($length);
        }
    }
// (...)
    
function _createPronounceable($length)
    {

        global 
$_Text_Password_NumberOfPossibleCharacters;
        
$retVal '';

        
/**
         * List of vowels and vowel sounds
         */
        
$v = array('a''e''i''o''u''ae''ou''io',
                   
'ea''ou''ia''ai'
                   
);

        
/**
         * List of consonants and consonant sounds
         */
        
$c = array('b''c''d''g''h''j''k''l''m',
                   
'n''p''r''s''t''u''v''w',
                   
'tr''cr''fr''dr''wr''pr''th',
                   
'ch''ph''st''sl''cl'
                   
);

        
$v_count 12;
        
$c_count 29;

        
$_Text_Password_NumberOfPossibleCharacters $v_count $c_count;

        for (
$i 0$i $length$i++) {
            
$retVal .= $c[mt_rand(0$c_count-1)] . $v[mt_rand(0$v_count-1)];
        }

        return 
substr($retVal0$length);
    }

// (...) 

Dort funktioniert das einwandfrei ^^. Dass das natürlich nun gerade beim Konstruktor nicht funktioniert habe ich nicht gewusst. :roll: ;)


Kann es sein das du JAVA "liebst"? :p

Danke nochmal!!!
MfG

heartdisease 31.08.2007 17:25

Bitte gerne :)

Zitat:

Kann es sein das du JAVA "liebst"?
Oh ja, Objektorientierung in ihrer vollen Pracht :lol:
Kann ich dir nur empfehlen wenn du auch mal "richtige" Software programmieren möchtest.

ct2oo4 31.08.2007 17:32

Ich möchte demnächst eher mit C++ anfangen und mich bereits jetzt auf mein Studium vorbereiten (Elektrotechnik)

netspy 31.08.2007 18:57

Zitat:

Zitat von heartdisease (Beitrag 347732)
Hier schlägt auch wieder die schlampige Syntax von PHP zurück, da es keine strikte Trennung der Datentypen gibt!

Mit dem passenden Error-Level erkennt auch PHP das und bring den Fehler: Object of class Test could not be converted to string

Zitat:

Zitat von heartdisease (Beitrag 347732)
Nein! Es ist nur === zulässig.

Natürlich ist auch !== zulässig. Bei empty() ist noch zu beachten, dass '0' auch empty ist.

Mario

PS: Bitte kein weiteren PHP-Bashing. Mit PHP 5 hat sich in Sachen OO viel getan, auch wenn man schon vorher "richtige" Software damit programmieren konnte.

ct2oo4 31.08.2007 19:08

Würdest du das mit dem "Error-Level" etwas ausführlicher beschreiben? die Docu (php.net) weis dazu nix.
Könnte mir auch jmd nochmal erklären warum ich === und nicht == schreiben muss? Ich hatte das schon mal irgendwo gelesen, den Link dazu habe ich leider verlegt.
Danke schon im Voraus.
MfG

netspy 31.08.2007 19:15

Ach doch, die Doku kennt das schon :)

PHP: error_reporting - Manual

Zum Testen setz ich es meist so:
PHP-Code:

error_reporting(E_ALL);
ini_set('display_errors''On'); 

Mario

ArcVieh 31.08.2007 21:37

Zitat:

Zitat von Jason (Beitrag 347781)
Wenn wir schon beim Php erklären sind:
Kann mir bitte einer erzählen, was das kleine & in dem Code bringt? Ein Link auf dem das halbwegs erklärt ist würde mir auch reichen. Danke schonmal!
PHP-Code:

    function trim_value(&$value)
    {
        
$value trim($value);
    } 


Referenz.
PHP-Code:

$wert 1;
function 
ehoeheWert(&$var) {
   
$wert++;
}
erhoeheWert($wert);
// Ausgabe: 2
echo $wert

So wird die Referenz auf die Variable in die Funktion übergeben.

netspy 31.08.2007 22:23

Hier auch noch ein Link zur Doku: PHP: Funktionsparameter

Mario


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:04 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2022, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2022