PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : var in globaler klasse verschwindet - weg :(


h4ze
17.08.2007, 14:33:31
hallo liebe community,

ich habe eine frage bezüglich php5 und hoffe, dass ihr mir da helfen könnt. es geht darum, dass ich eine klasse für fehler habe, diese hat public funktionen und mit vielen dateien gebe ich mögliche fehler in die klasse ein, an einer stelle lass ich das dann auslesen.

ich glaub das war nen bisschen unverständlich, daher hier mal nen paar codeschnipsel ;)

hier die ganze class error:

<?php

class Error {

var $out;
var $err;

public function add($in) {
foreach($in as $in) {
$this->err[] = $in;
}
}

public function get() {
if(isset($_POST['send'])) {
if(count($Error->err) >= 1) {
$Error->out .= '<div class=\'report_error\'>'."\n";
$Error->out .= '<b>Folgende Fehler sind aufgetreten:</b>'."\n";
$Error->out .= '<ul>'."\n";
foreach($Error->err as $err) {
$Error->out .= '<li>'.$err.'</li>'."\n";
}
$Error->out .= '</ul>'."\n";
$Error->out .= '</div>'."\n";
} else {
$Error->out .= '<div class=\'report_ok\' style=\'text-align: center;\'>'."\n";
$Error->out .= 'Die Aktion wurde erfolgreich ausgeführt.';
$Error->out .= '</div>'."\n";
}
}
return $Error->out;
}

}

?>

und hier, wie ich mögliche fehler eingebe:

$err[] = 'Bitte geben Sie Ihren Namen ein.';
Error::add($err);

und auslesen tu ichs (später im code) so:

echo Error::get();

kann mir vlt. einer sagen, was ich falsch gemacht hab? in public function add kann ich alles ausgeben, aber in public function get ist irgendwie alles weg...

c4
17.08.2007, 14:54:13
Schön wär's, ginge es so einfach.

Du musst die Klasse instanzieren und dann die Methoden add() und get() aufrufen. Natürlich vom gleichen Objekt.

Oder Du sammelst die Daten in $GLOBALS oder einem anderen globalen Speicher. Vllt. ist ja eine Session-Verwaltung vorhanden?

Carsten

h4ze
17.08.2007, 15:21:59
vielen dank für die antwort.

aber wenn ich jedes mal ne instanz eröffnen muss, dann verlier ich doch die vorteile von public funktionen, oder?

hast du vlt. nen guten link zu $GLOBALS, wo nen paar sätze erklärt werden? bzw. ist $GLOBALS so zu handeln wie $_SESSION im etwa?

c4
17.08.2007, 15:29:47
aber wenn ich jedes mal ne instanz eröffnen muss, dann verlier ich doch die vorteile von public funktionen, oder?

hast du vlt. nen guten link zu $GLOBALS, wo nen paar sätze erklärt werden? bzw. ist $GLOBALS so zu handeln wie $_SESSION im etwa?
Zu ersterem: Public Funktionen sind dafür gedacht, damit Du sie mittels $ojekt->methode() aufrufen kannst.
Was Du machst ist, die Methoden statisch aufzurufen: Klasse::Methode() Du müsstest sie genau genommen daher auch nicht als public deklarieren sondern als static.
Details hierzu gibt's da:
--> http://de.php.net/manual/de/language.oop5.basic.php

$GLOBALS solltest Du wenn möglich nicht nutzen, weil dann später nicht mehr wirklich klar ist, woher die Daten kommen.
Die Doku dazu:
--> http://de2.php.net/manual/de/language.variables.predefined.php
Es ist einfach ein riesiges Sammelsorium von allem. Eine Notfalllösung eher.

feuervogel
17.08.2007, 15:59:47
Error::get();

ginge, wäre get() statisch, ist es aber nicht. stichwort: static :-)

c4
17.08.2007, 16:02:05
Error::get();

ginge, wäre get() statisch, ist es aber nicht. stichwort: static :-)
Was "ginge" dann?
Error::get(); kannst Du auch mit public Methoden machen.

rambi
17.08.2007, 17:48:38
var und public in einer Klasse.. igitt igitt..
Eine unglückliche Durchmischung von PHP4 und PHP5 Syntax!

Hier mal ein Vorschlag:
final class Log
{
protected static $log = array();

public function __construct()
{
die(__CLASS__.' ist nur statisch!!');
}

public static function add($meldung)
{
self::$log[] = $meldung;
}

public static function get()
{
$meldungen = '';
foreach(self::$log as $meldung)
$meldungen .= $meldung.'<br>';
return $meldungen;
}
}

// testcode
Log::add('bli');
Log::add('bla');
Log::add('blub');
Log::add('trari');

echo Log::get();

c4
17.08.2007, 20:22:47
Da bin ich ja mal platt. Hätte nicht, gedacht, dass sowas geht.

Wie geht das denn? Man kann also Werte von statischen Variablen in einer Klasse setzen, in dem man mittels self:: auf diese zugreift? Find ich geil. :)

rambi
17.08.2007, 22:05:31
Tja.. mit PHP5 hat sich einiges in der OOP getan...

Eigendlich kann man nur von solchen statischen Geschichten abraten. Selbst Singletons sind oft genug nur ein (schwacher)Ersatz für Globale Variablen...
OK, manchmal ist es eine echte Vereinfachung. Aber oft genug führen diese einschränkenden Sprach- oder Design- Mittel zu mehr Problemen, als sie lösen.
Man macht sich die Vererbung damit, mehr oder weniger, kaputt.

c4
18.08.2007, 10:25:18
Okay, dann vergesse ich es wieder.

rambi
18.08.2007, 11:24:55
:-) Bitte nicht vergessen.... nur sparsam einsetzen :-)

h4ze
19.08.2007, 22:44:13
danke, danke, danke an euch drei.

ich hab das jetzt alles entsprechend umgeschrieben und es funktioniert.

weil ich aber gerne etwas dazu lerne und neugierig bin, hätte ich noch nen paar technische fragen:

final class, protected static, public protected static, etc...
ich hab danach gegoogelt und hab gute antworten gefunden, nur weiss ich nicht genau, warum man das so deklariert.
ist das aus sicherheitsgründen oder damit man eine klarere entwicklung hat?
und kennt einer von euch ne kleine liste mit allen möglichen deklarationen und ner kurzen erklärung.
und wann sollte man etwas protected machen, wann mit var, etc...


ich bin für jede antwort dankbar!

rambi
19.08.2007, 23:01:12
Einfach weiter lesen.. dann klärt sich das irgendwann :D
z.B. http://www.peterkropff.de/site/oop/oop.htm
Den Link ins Handbuch hast du ja schon bekommen!

>>wann mit var
Unter PHP5 niemals!!