zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden OOP Problem - class Email

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 31.08.2007, 15:59
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 07.04.2007
Beiträge: 311
ct2oo4 befindet sich auf einem aufstrebenden Ast
Unglücklich 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?)
__________________

Geändert von ct2oo4 (31.08.2007 um 20:13 Uhr)
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 31.08.2007, 17:38
Neuer Benutzer
neuer user
 
Registriert seit: 29.08.2007
Ort: /home/heartdisease
Beiträge: 19
heartdisease befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von ct2oo4 Beitrag anzeigen
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
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
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 31.08.2007, 17:59
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 07.04.2007
Beiträge: 311
ct2oo4 befindet sich auf einem aufstrebenden Ast
Standard

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.


Kann es sein das du JAVA "liebst"?

Danke nochmal!!!
MfG
__________________
Mit Zitat antworten
  #4 (permalink)  
Alt 31.08.2007, 18:25
Neuer Benutzer
neuer user
 
Registriert seit: 29.08.2007
Ort: /home/heartdisease
Beiträge: 19
heartdisease befindet sich auf einem aufstrebenden Ast
Standard

Bitte gerne

Zitat:
Kann es sein das du JAVA "liebst"?
Oh ja, Objektorientierung in ihrer vollen Pracht
Kann ich dir nur empfehlen wenn du auch mal "richtige" Software programmieren möchtest.
Mit Zitat antworten
  #5 (permalink)  
Alt 31.08.2007, 18:32
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 07.04.2007
Beiträge: 311
ct2oo4 befindet sich auf einem aufstrebenden Ast
Standard

Ich möchte demnächst eher mit C++ anfangen und mich bereits jetzt auf mein Studium vorbereiten (Elektrotechnik)
__________________
Mit Zitat antworten
  #6 (permalink)  
Alt 31.08.2007, 19:57
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von heartdisease Beitrag anzeigen
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 anzeigen
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.
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #7 (permalink)  
Alt 31.08.2007, 20:08
Erfahrener Benutzer
XHTMLforum-Mitglied
Thread-Ersteller
 
Registriert seit: 07.04.2007
Beiträge: 311
ct2oo4 befindet sich auf einem aufstrebenden Ast
Standard

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
__________________

Geändert von ct2oo4 (31.08.2007 um 20:15 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 31.08.2007, 20:15
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
  #9 (permalink)  
Alt 31.08.2007, 22:37
Benutzerbild von ArcVieh
//
XHTMLforum-Kenner
 
Registriert seit: 19.12.2006
Ort: Gütersloh
Beiträge: 1.844
ArcVieh sorgt für eine eindrucksvolle AtmosphäreArcVieh sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von Jason Beitrag anzeigen
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.
__________________
CSS-FAQ beantwortet die meisten Fragen | Retro coding gegen Divitis | Code validieren & posten für Hilfe
Mit Zitat antworten
Sponsored Links
  #10 (permalink)  
Alt 31.08.2007, 23:23
Benutzerbild von netspy
Erfahrener Benutzer
XHTMLforum-Kenner
 
Registriert seit: 13.08.2004
Ort: Leipzig
Beiträge: 1.953
netspy sorgt für eine eindrucksvolle Atmosphärenetspy sorgt für eine eindrucksvolle Atmosphäre
Standard

Hier auch noch ein Link zur Doku: PHP: Funktionsparameter

Mario
__________________
AppDev Blog · AppDev Forum
Mit Zitat antworten
Sponsored Links
Antwort

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mitwachsender Content und Footer Problem Bentham CSS 5 19.09.2010 12:49
IE 7: Zoom Problem, Höhen Problem, Text problem Cu Chullain CSS 4 02.09.2010 14:56
Class Variablen Problem rs-web Serveradministration und serverseitige Scripte 5 04.06.2010 11:49
Ein kleines OOP Problem mit Klassen etc. ct2oo4 Serveradministration und serverseitige Scripte 24 06.08.2007 17:29
Problem mit JavaScript und OOP DoktorW Javascript & Ajax 4 11.11.2006 21:27


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