 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
23.06.2004, 12:25
|
#1
|
|
TP-Insider
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
|
Startwerte von Klassenvariablen?
Hi
Ich programmiere mittlerweile immer mehr Klassen in PHP und musste mich mehrmals fragen, ob ich jetzt eine Variable einfach in der Klasse per $variable = "Startwert" setzen möchte oder sie per Konstruktor übergeben lassen soll.
Wie macht ihr das so?
Also momentan mache ich es immer so, dass solche Variablen, die Userspezifisch (MySQL Datenbank, Passwort etc.) sind und nicht Objektspezifisch, die muss man in der Klasse selbst setzen (eben per $db = "Test"). Alles andere das widerum von Objekt zu Objekt ändert per Konstruktor.
Aber wie siehts bei euch aus? Immer alles in den Konstruktor packen? Derw ird einfach manchmal wesentlich zu gross, besonders wenn gewisse Klassenvariablen Arrays sind...
__________________
http://www.exploreourplanet.net - Ladet eure schönsten Urlaubsbilder hoch!
|
|
|
23.06.2004, 12:58
|
#2
|
|
Guest
Registriert seit: Aug 2002
|
Deine Lösung ist für mich, einen OOP-Freak zu schmutzig. Ich würde da schon eine Klasse für MySQL erstellen, die Referenz oder Objekt dieser Klasse übergibst du dann an den Konstruktor der Klasse für die User.
PHP-Code:
class MySQL { function MySQL(/* Hier die Daten eingeben */) {} }
class User { function User(&$mysql_ref) { /* Hier arbeite ich mit dem MySQL-Objekt */ } }
Warum es besser ist? Du kannst nur ein Objekt vom Typ MySQL haben, um weitere Klassen damit zu füttern, ohne jedes mal die Daten erneut zu vergeben.
|
|
|
23.06.2004, 15:28
|
#3
|
|
TP-Insider
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
|
hm schnall ich noch nicht ganz...das heisst:
Klasse MySQL
var tabelle
var passwort
etc.
Klasse User
Alle Funktionen mit diesen Variablen?
__________________
http://www.exploreourplanet.net - Ladet eure schönsten Urlaubsbilder hoch!
|
|
|
23.06.2004, 15:43
|
#4
|
|
Guest
Registriert seit: Aug 2002
|
Nee, so meine ich es:
PHP-Code:
class MySQL
{
var $host;
var $user;
var $passw;
//...
function MySQL($host, $user, $passw) { /* Initialisieren von Klassenelementen */ }
function Query($query_str) {}
function Close() {}
}
class User
{
var $mysql; // Enthällt alles als MySQL-Objekt
function User(&$mysql) { $this->mysql =& $mysql; }
function User_anlegen() { $this->mysql->Query("INSERT INTO..."); }
}
// Und nun benutzen wir das ganze:
$mysql = &new MySQL('localhost', 'Admin', 'Geheim');
$user = &new User($mysql); // Braucht jetzt nichts mehr, was MySQL-Objekt schon hat
|
|
|
24.06.2004, 14:46
|
#5
|
|
TP-Insider
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
|
hm kapiere das schon besser danke  aber..
was bewirkt $irgendwas = &new ...
das & ist doch normalerweise dass etwas per ref und nicht per val übergeben wird. aber bei new kapiere ich das nicht so..weil wenn man da etwas an den konstruktor übergeben müsste könnte man doch nur
$irgendwas = new objekt(&$übergabevariable)
schreiben?
__________________
http://www.exploreourplanet.net - Ladet eure schönsten Urlaubsbilder hoch!
|
|
|
24.06.2004, 16:10
|
#6
|
|
Guest
Registriert seit: Aug 2002
|
Nein, da verstehst du was falsch. new gibt in PHP(!) automatisch ein Objekt zurück, wir machen ohne & also eine Kopie daraus, mit & bei der Zuweisung wird dagegen eine Referenz erzeugt.
Bei der Übergabe der Referenz an eine Funktion, die nicht mit &$arg (in dem Funktionsrumpf) gekennzeichnet wurde kann es übrigens sein, daß man falsche Ergebnisse bekommt, weil die Funktion diese Werte nicht an die Referenz angepasst hat, sondern die Argumente anders (lokal) verwaltet:
PHP-Code:
function foo($arg) { $lokal = $arg; ++$lokal; }
// Aufruf:
$var = 5;
foo(&$var);
echo $var; // immer noch 5... he???
Von daher ist es eher ein schlechter Stil, besser wäre es wenn man gleich eine Funktion schreibt, die Referenzen als Argumente erwartet:
PHP-Code:
function foo(&$arg) { ++$arg; } // Man sieht schon hier, daß die Funktion mit Referenzen arbeiten soll
// Aufruf:
$var = 5;
foo($var); // Gibt 6 aus
|
|
|
24.06.2004, 17:28
|
#7
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
Zitat:
|
Zitat von Strogij
PHP-Code:
function foo($arg) { $lokal = $arg; ++$lokal; }
// Aufruf:
$var = 5;
foo(&$var);
echo $var; // immer noch 5... he???
|
alles andere als eine 5 würde mich auch sehr stark verwundern 
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
24.06.2004, 18:43
|
#8
|
|
Guest
Registriert seit: Aug 2002
|
Mich nicht. 
Naja das war natürlich vereinfacht, sollte die Funktion viele Operationen durchführen, wäre es wieder eine Suche... besonders wenn die Funktion jemand anders geschrieben hat und man gerne eine Referenz übergeben will. Daher lieber sowas vermeiden.
|
|
|
24.06.2004, 18:58
|
#9
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
äh. die funktion KANN nur 5 zurückgeben, da sie imho falsch (stichwort Variablescope) ist. however.
Für alle: http://www.php.net/manual/de/languag...rences.whatare
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
24.06.2004, 19:18
|
#10
|
|
TP-Veteran
Registriert seit: Jan 2002
|
Strogij hat schon recht.
Natürlich kann das Beispiel so wegen der verschiedenen Variablenscopes von Hauptscript und Funktion nur 5 ausgeben.
Aber es geht ja gerade darum, dass man mit dem '&'-Zeichen bei Variablenzuweisungen ein 'pass by reference' erzwingt, d.h. dass statt des Variablenwertes selbst nur die Speicheradresse auf den anderen Variablenbezeichner übertragen wird, wodurch die normalen Gültigkeitsbereiche für Variablen überbrückt werden.
PHP-Code:
function foo($arg) { $lokal = & $arg; ++$lokal; } // man beachte das & hier
// Aufruf:
$var = 5;
foo(&$var);
echo $var;
Gibt tatsächlich '6' aus.
Geändert von seb (24.06.2004 um 19:21 Uhr).
|
|
|
24.06.2004, 19:41
|
#11
|
|
Guest
Registriert seit: Aug 2002
|
Ja, eben - die kann nur 5 ausgeben. Aber ich habe das gerade deswegen angesprochen, weil NicNac die Sache erwähnt hat und wahrscheinlich es falsch mit Referenzen verstanden hat. Denn nicht jede Funktion eignet sich für Referenzen, wenn in der Definition kein & steht. Es ist zwar in PHP erlaubt, die Argumente so zu übergeben: Aufruf: foo(&$arg) aber falls der Programmierer dieser Funktion mit einer Referenz nicht gerechnet hat, kann es sein, daß man etwas falsches wieder kriegt. Das ist doof wie ich finde, jede Änderung an einer Funktion kann alle Aufrufe mit Bugs versehen.
|
|
|
25.06.2004, 09:28
|
#12
|
|
TP-Insider
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
|
Hm, aber jetzt wo ich das mit den Referenzen schnalle wirkt für mich das mti deinen beiden Klassen bisschen komisch. Denn grundsätzlich hast du die Daten ja trotzdem in der (unveränderbaren) mysql klasse. Wäre es nciht besser die Daten in User zu tun und die methoden in MySQL zu lassen?
__________________
http://www.exploreourplanet.net - Ladet eure schönsten Urlaubsbilder hoch!
|
|
|
25.06.2004, 09:47
|
#13
|
|
TP-Specialist
Registriert seit: Jan 2002
Ort: TP/Dynamik
|
@seb, strogij: passt schon. Ich hab einfach keinen Sinn in der Funktion auf den Thread bezogen gesehen, da selbst die richtige Schlussfolgerung, dass Pass by Reference Variablen immer im Funktionskopf deklariert werden sollten, keine Änderung des Ergebnisses hervorgebracht hätte (Variablenscope)
Generell ist einfach festzuhalten, dass PHP NICHT C oder so ist und Referenzen KEINE Zeiger sind.
mit dem = wird immer eine Kopie erzeugt, selbst wenn es sich um eine Referenzadresse handelt. Um das zu demonstrieren ist dann die Funktion wieder perfekt
Zitat:
|
Es ist zwar in PHP erlaubt, die Argumente so zu übergeben: Aufruf: foo(&$arg) aber falls der Programmierer dieser Funktion mit einer Referenz nicht gerechnet hat, kann es sein, daß man etwas falsches wieder kriegt. Das ist doof wie ich finde, jede Änderung an einer Funktion kann alle Aufrufe mit Bugs versehen.
|
tja, php is halt anders
peace 
__________________
Gehelft? Hier kannst du dich bedanken.
mike
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 09:02 Uhr.
|
 |