Problem mit Tutorial
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzeichen
aufruf
context
ecken
fehler
funktion
klasse
methode
modul
objekt
package
referenz
statische funktion
statischen funktion
status
tutorial
variable
verschachtelung
verstehe
zugreifen
-
Hallo Leute,
Ich hab den Code aus diesem Tutorial genommen:
http://www.lima-city.de/tutorials.php?m=show&id=571
Funktioniert auch wunderbar, nur wenn ich den Code auf meinem lokalen Server ausf?hre bekommen ich einen Fehler:
Fatal error: Using $this when not in object context [...]
Ich hab den Code hier mal zusammengechnitten, die Verschachtelung stimmt. Der gleicht Code l?uft auf lima einwandfrei:
php [...] class smtp{ [...] var $status; [...] function &connect($params = array()){ if(!isset($this->status)){ // das ist die Zeile [...] } [...] } [...] } [...] if(is_object($smtp = smtp::connect($params)) AND $smtp->send($send_params)){ [...] } [...]
Gibt es irgendwelche Einstellungen am Server, die zu diesem Unterschied f?hren k?nnen?
Danke schon mal
Constantin
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Diese Fehlermeldung tritt auf, wenn die Variable $this au?erhalb einer Klasse benutzt wird. Da das Script auf Lima funktionieren soll, sehe im Moment nur eine Ursache:
Du hast eine modernere PHP-Version auf deinem lokalen Server als die PHP-Version vom Lima-Webspace. Und zwar PHP5 oder h?her. Dort ?ndert sich intern einiges beim Zuweisen von Werten. Da hier auch mit Referenzen hantiert wird (das "&" ist ein Anzeichen daf?r), kann es sein, dass das eben so unter PHP4 funktioniert, aber unter PHP5 nicht. -
Danke Alopex.
Ja richtig. Ich habe php5.1.4 auf meinem Server.
Ich versuche zur Zeit die Socket-Kommunikation (wenn das so hei?t) zu verstehen. Die ist in dem Tutorial recht ausf?hrlich.
Ich m?chte aber nicht immer jede kleine ?nderung auf lima laden und w?rde gerne bei php5 bleiben.
Gibt es daf?r eine einfache Umbaum?glichkeit?
Wie wird der &-Operator denn anders interpretiert?
Kann man das so umbauen, da? es auf beiden Versionen l?uft?
Ich besch?ftige mich noch nicht lange mit php. Ich suche gerne selbst nach L?sungen, m?chte aber gerne wissen ob es prinzipiell geht und wie ich den Aufwand einsch?tzen mu?.
---
Ich habe mich gerade noch etwas mit dem Code besch?ftigt und verstehe jetzt noch weniger.
Die Funktion:
&connect([...])
wird unten aufgerufen mit
smtp::connect([...])
hei?t das nicht, da? es sich eigentlich um eine statische Funktion handeln m??te? Dann verstehe ich aber nicht wie in php4 der Zugriff auf die Membervariablen mit $this-> m?glich ist.
edit: erg?nzt
Beitrag ge?ndert am 27.07.2006 14:18 von noll -
Umbaum?glichkeit? Sicher, aber ich bin im allgemeinen zu faul, mich durch fremde Quellcodes zu fressen -- noch dazu, wenn sie so schlecht formatiert sind wie im Tutorial.
Aber vielleicht hilft dir das Original weiter:
http://www.baseboard.net/forums/showthread.php?s=&threadid=1995
Das scheint mir besser formatiert und auch besser kommentiert. Allerdings ist es schon ziemlich alt (von 2001), daher k?nnte es die gleichen Probleme machen.
Was garantiert unter PHP5 l?uft, ist das PEAR-Modul zum Mailen:
http://pear.php.net/package/Net_SMTP
(ben?tigt IMHO Net_Socket: http://pear.php.net/package/Net_Socket )
Und dann w?re da noch der PHP-Mailer:
http://phpmailer.sourceforge.net/
*nachtr?glich_einf?g*
Ich habe mich gerade noch etwas mit dem Code besch?ftigt und verstehe jetzt noch weniger.
Die Funktion:
&connect([...])
wird unten aufgerufen mit
smtp::connect([...])
hei?t das nicht, da? es sich eigentlich um eine statische Funktion handeln m??te? Dann verstehe ich aber nicht wie in php4 der Zugriff auf die Membervariablen mit $this-> m?glich ist.
Jaja, PHP und seine OO-Schnittstelle ...
Soweit ich das verstanden habe, enth?lt $this lediglich eine Referenz auf die Objektvariable (also eine bestimmte Instanz der Klasse). Ob sich dahinter jetzt was verbirgt, h?ngt davon ab, ob der Konstruktor aufgerufen wurde. In PHP4 ist das die Funktion, die genauso hei?t wie die Klasse. Dieser Konstruktor wird aufgerufen, wenn ein Objekt mit "new" erstellt (instanziiert?) wird.
Setzt der Konstruktor nun Variablen oder ?hnliches, so sind diese nicht von statischen Methoden erreichbar.
Mal im Qu?ltext:
class blubb { // Konstruktor function blubb() { $this->variable = 'hallo!'; } function bla() { printf('variable-statisch:', $this->variable); } } // ende_der_Klasse //blubb::bla(); // hier gibts noch keine ->variable, daher Fehler $mein_blubb = new blubb; $mein_blubb->bla(); // hier schon; blubb::bla(); // hier wieder nicht; exit();
Unter PHP5 aufgerufen ergibt das die gleiche Fehlermeldung wie im Tutorial-Script. Vielleicht kannst du es ja so umstellen, dass statt "::" eben "->" beim Aufruf der Methoden benutzt wird.
Es macht auch irgendwie keinen Sinn, in einer Methode $this zu verwenden und dann diese Methode statisch aufzurufen ...
Ich habe momentan leider gerade kein PHP4 laufen (ich bin zu doof, mir ein Modul zu kompilieren, dass gemeinsam mit PHP5 im Apache l?uft ...), daher wei? ich nicht, wie PHP4 da reagiert.
Beitrag ge?ndert am 27.07.2006 14:35 von alopex -
Danke, damit bin ich erstmal bedient.
Ich hab auch erstmal ne Weile geraucht bis ich den Code umformatiert hatte. Und war froh, da? der dann auf lima noch funktionierte .
Ich geb mir mal M?he das umzubauen und wenn es funktioniert mach ich vielleicht mal ein neues Tutorial draus - mit Kommentaren . -
Danke, damit bin ich erstmal bedient.
Ich hab auch erstmal ne Weile geraucht bis ich den Code umformatiert hatte. Und war froh, da? der dann auf lima noch funktionierte .
http://pear.php.net/package/PHP_Beautifier
macht dir aus wilden Qu?lcodes sch?n formatierte Meisterwerke ...
Ich geb mir mal M?he das umzubauen und wenn es funktioniert mach ich vielleicht mal ein neues Tutorial draus - mit Kommentaren .
Das ist eine gute Idee, denn die PHP-Ecke scheint in letzter Zeit ziemlich vernachl?ssigt zu sein -- au?erdem find ich ordentlich kommentierte Quellcodes immer gut. Man kann so besser nachvollziehen, was der Programmierer erreichen wollte. -
Was mich etwas verwundert.
Die Abfrage
php function &connect($params = array()){ if(!isset($this->status)){ //hier wird ein smtp Objekt erstellt, im //Konstruktor die $this->status Variable //gesetzt und die Funktion rekursiv //aufgerufen. } else{ [...] } }
wird benutzt um zu erfragen ob bereits ein smtp Objekt instanziiert wurde, denn die Variable $this->status wird erst im Konstruktor gesetzt. Ist das nicht der Fall wird es an dieser Stelle erstellt. d.h. es gibt beim ersten Aufruf der Funktion auf keinen Fall ein smtp Objekt aber egal wie, einer statischen Funktion ist das doch vollkommen egal.
Aber da ich gerade die ganze Zeit von 'statischer Funktion' rede. Wird so etwas in php nicht auch durch static gekennzeichnet oder gibt es das nur bei Variablen? -
Ich glaube, auf deine Fragen w?rdest du im SELFFORUM kompetentere Antworten bekommen ...
Sei's drum.
"static" benutzt man in PHP(4) um eine Variable innerhalb einer Funktion "haltbar" zu machen. Wird die Funktion erneut aufgerufen, hat die Variable, die mit "static" definiert wurde, den gleichen Wert wie zu dem Zeitpunkt, an dem die Funktion das letzte Mal beendet wurde. Das ist also ein Zwischending zwischen einer globalen Variable und einer lokalen Variable. Ich benutze sowas nach M?glichkeit nicht, da es dabei zu Seiteneffekten kommen k?nnte -- man wei? nicht immer, welchen Wert die Variable haben k?nnte.
Was das "if(!isset($this->status)){ " angeht: Was passiert, wenn du es wegl?sst? So wie es aussieht, ist es eine ziemlich unn?tige Abfrage ... Oder es hat was mit der Rekursion zu tun, dass er es so komisch gel?st hat ... -
Ah ok, ich erinnere mich. Bei mir mischt sich Java immer wieder ein. Da hat static ja eine andere Bedeutung.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage