Klasse in Funktion bekannt machen?
Benjamin
- php
Ich hätte eben folgende Frage:
Muß ich eine Klasse in einer Funktion bekannt machen?
hier ein minimalsistisches Script:
class test
{
public $testvar=true;
}
function ausgabe
{
print($test->testvar); //Beschwehrt sich wegen einem Zugriff
// auf eine nichtdeklarierte Variable
global $test; //initilalisiert nur eine neue Variable
}
$test = new test;
ausgabe();
----------------
Kann das jemand nachvollziehen oder habe ich etwas elementares übersehen?
Gruß Benjamin
Hi,
Ich hätte eben folgende Frage:
Muß ich eine Klasse in einer Funktion bekannt machen?
Mit Klassen hat das erst mal gar nichts zu tun.
hier ein minimalsistisches Script:
class test
{
public $testvar=true;
}function ausgabe
{
print($test->testvar); //Beschwehrt sich wegen einem Zugriff
// auf eine nichtdeklarierte Variable
Natuerlich, eine Variable $test gibt es im Geltungsbereich deiner Funktion ja auch nicht.
global $test; //initilalisiert nur eine neue Variable
}
Nach dem versuchten Zugriff ist ja auch ein bisschen spaet ...
MfG ChrisB
Ich habe meine Frage fast selbst beantwortet. Das Problem war, dass ich mir eine Funktion zum Errorhandling gebastelt habe. Die Funktion habe ich dann als Fehlerbehandlung getriggert. So konnte ich "nichts" übergeben.
Meine Erste Lösung war dann, dass ich über den Kontext (Sämtliche Variablen zur Laufzeit) meine "globale" Klasseninstanz angesprochen habe. Das war aber sehr "dirty".
Dann bin ich darauf gekommen, dass ich mein Hauptprogramm als Funktion aufgerufen habe und mir dadurch ne Menge "Spass" und Sucharbeit aufgehalst habe.
Nun gut.
PHP funktioniert schon so, wie man es eigentlich erwarten sollte. ;-) Auch das mit den Variablen in einer Funktion. Blöd ist nur, wenn man sein Script als Funktion konstruiert hat.
Vielen Dank für Eure Angregungen. Welche Arten der Fehlerbehandlung setzt Ihr denn so ein?
Gruß Benjamin
echo $begrüßung;
Welche Arten der Fehlerbehandlung setzt Ihr denn so ein?
Arten, Fehler zu behandeln, gibt es wohl so viele wie Fehler auftreten können und wie sich die Anwendung gegenüber dem Anwender verhalten soll. Am besten ist es wohl, alle möglichen Fehler an Ort und Stelle zu behandeln, denn nur da kann man realistisch einschätzen, welche Reaktion in dem Fall angemessen ist. Dass einem dabei immer noch unbedachte Fehler auftreten können, ist ein weiteres Thema. Vermutlich geht es dir nur um diese. Das ist dann aber keine Behandlung sondern nur eine Aufzeichnung in einem Logfile, eine Benachrichtigung an den Betreiber oder ein Ignorieren (nicht unbedingt die beste Idee). Je nach Anwendungsfall wäge ich alle mir bekannten Methoden ab und nehme die, die mir am besten geeignet erscheint.
echo "$verabschiedung $name";
{...} Am besten ist es wohl, alle möglichen Fehler an Ort und Stelle zu behandeln, denn nur da kann man realistisch einschätzen, welche Reaktion in dem Fall angemessen ist.{...}
Schon klar. Ich arbeite im Code selber auch überwiegend mit
switch $zu_verwendente_variable
{
case erwartung_1:
tu_was();
case erwartung_n:
tu_was_anderes();
default:
verwerfen_und_fehler();
}
Usereingaben werden auch zuerst (als Feature) mit Javascript und dann auf jeden Fall in PHP geprüft - auch klar.
Fehler werden auch in ein eigenes Fehlerhandling geleitet und nicht dem Benutzer dem Seite zugemutet - auch klar.
{...}Dass einem dabei immer noch unbedachte Fehler auftreten können, ist ein weiteres Thema. Vermutlich geht es dir nur um diese.{...}
Ja genau. Ich arbeite immer mit set_error_handler("my_handler_function");
Die Funktion läd per require_once(); "mein Errorhandling" nach (weitere Funktionen, etc.). Und dann geht eben los.
Anfänglich wollte ich eine eigene Klasse für mein Fehlernehandlung anlegen. Das fand ich dann doch etwas überzogen, da das Script nach einem Fehler im Praxisbetrieb eh nicht weiterläuft und ich deshalb keinen wirklich Sinn in Fehler-Stacks sehe. Ich breche auch nach ner E_NOTICE ab, da diese "nicht erwarteteten" Fehler immer problematisch sind. Alles ander fange ich ja im Script schon ab.
Falsche eingaben, Datei nicht gefunden, etc. So etwas bekommt ja dann auch ein schönes handling drumherum. (User=zu_blöd-Meldung)
So arbeite ich zumindest immer. Wie ist da so die Vorgehensweise bei Euch?
foreach ($array_world_knowledge['language']['courtesies'] as $be_nice)
{
print($be_nice);
}
print($array_world_knowledge['language']['final_passage'].$my_name
;-)
echo $begrüßung;
{...} Am besten ist es wohl, alle möglichen Fehler an Ort und Stelle zu behandeln, denn nur da kann man realistisch einschätzen, welche Reaktion in dem Fall angemessen ist.{...}
Schon klar. Ich arbeite im Code selber auch überwiegend mit [...]
Wieso gehst du nach einem Schema F vor? Findest du dieses Prinzip für die "überwiegende" Anzahl der Anwendungsfälle verwendbar oder hast du (zufälligerweise) immer nur solche Anwendungsfälle? Was ist mit den anderen?
Sicher wäre es schön, wenn es einen goldenen Weg gäbe. Das wünscht sich vermutlich so manch einer, der eine Fremdsprache lernt. Doch Regeln sind nur dafür da, den Anwender mit ihren Ausnahmen zur Verzweiflung zu bringen. Genau wie ein Sprachlernender es früher oder später im Gefühl hat, wann man welches Konstrukt einsetzt, ist es beim Verwenden bestimmter Konstrukte beim Programmieren.
{...}Dass einem dabei immer noch unbedachte Fehler auftreten können, ist ein weiteres Thema. Vermutlich geht es dir nur um diese.{...}
Ja genau. Ich arbeite immer mit set_error_handler("my_handler_function");
Die Funktion läd per require_once(); "mein Errorhandling" nach (weitere Funktionen, etc.). Und dann geht eben los.
Kann man machen. Man kann auch error_log verwenden, oder was auch immer man für sein Projekt angemessen findet.
Anfänglich wollte ich eine eigene Klasse für mein Fehlernehandlung anlegen. Das fand ich dann doch etwas überzogen, da das Script nach einem Fehler im Praxisbetrieb eh nicht weiterläuft und ich deshalb keinen wirklich Sinn in Fehler-Stacks sehe.
Hast du dir das Exceptions-Konzept mal angesehen?
Wenn eine Routine, die Daten abrufen soll, einen von ihr nicht behebbaren Fehler feststellt ist es nicht ihre Aufgabe, das komplette Script sterben zu lassen. Sie kann den Fehler an die aufrufenden Programmteile weitermelden. Dort kann vielleicht angemessener auf den Fehler reagiert werden. Woher will denn die Datenroutine auch wissen, ob es aus Sicht der kompletten Anwendung nur ein Nice-To-Have-Feature war oder ein essentieller Bestandteil der zu erfüllenden Aufgabe?
echo "$verabschiedung $name";
Hello,
wir wäre es so?
#-----------------------------------
<?php ### classvar.php ###
class test
{
public $testvar='Self HTML';
public function put()
{
echo $this->testvar;
}
}
#-----------------------------------
function ausgabe($cl1)
{
print($cl1->testvar.'<br>');
if (isset($cl1->notdef))
{
print($cl1->notdef);
}
else
{
print('Forums-Dummy<br>');
}
$cl1->put();
}
#-----------------------------------
$test = new test;
ausgabe($test);
?>
Harzliche Grüße vom Berg und Frohe Weihnachtszeit
Tom
echo $begrüßung;
Muß ich eine Klasse in einer Funktion bekannt machen?
Klassen sind immer überall sichtbar, du willst aber eine Variable sichtbar haben. Wann immer du eine Variable in einer Funktion verwenden willst, muss diese in der Funktion bekannt sein. Wenn du diese Variable nicht als Parameter übergeben kannst/willst, überdenke den Sinn der Funktion. global verwenden zu wollen zeugt von zu wenig Erfahrung. Eine ideale Funktion ist ein Programmteil, der aus nichts weiter als den Parametern einen Rückgabewert erzeugt. Wenn deine Variable eine zentrale Instanz darstellt, die es nur einmal geben darf, dann schau dir das Singleton-Muster an.
echo "$verabschiedung $name";