Shop-Hilfe.com
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 23.06.2004, 12:25   #1
TP-Insider
 
Benutzerbild von NicNac
 
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
NicNac macht alles soweit korrekt

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!
NicNac ist offline   Mit Zitat antworten


Alt 23.06.2004, 12:58   #2
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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.
Strogij ist offline   Mit Zitat antworten
Alt 23.06.2004, 15:28   #3
TP-Insider
 
Benutzerbild von NicNac
 
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
NicNac macht alles soweit korrekt
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!
NicNac ist offline   Mit Zitat antworten
Alt 23.06.2004, 15:43   #4
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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 
Strogij ist offline   Mit Zitat antworten
Alt 24.06.2004, 14:46   #5
TP-Insider
 
Benutzerbild von NicNac
 
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
NicNac macht alles soweit korrekt
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!
NicNac ist offline   Mit Zitat antworten
Alt 24.06.2004, 16:10   #6
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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 
Strogij ist offline   Mit Zitat antworten
Alt 24.06.2004, 17:28   #7
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
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
mike ist offline   Mit Zitat antworten
Alt 24.06.2004, 18:43   #8
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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.
Strogij ist offline   Mit Zitat antworten
Alt 24.06.2004, 18:58   #9
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
ä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
mike ist offline   Mit Zitat antworten
Alt 24.06.2004, 19:18   #10
seb
TP-Veteran
 
Registriert seit: Jan 2002
seb bringt sich richtig einseb bringt sich richtig ein
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).
seb ist offline   Mit Zitat antworten
Alt 24.06.2004, 19:41   #11
Guest
 
Registriert seit: Aug 2002
Strogij hilft, wo's gehtStrogij hilft, wo's geht
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.
Strogij ist offline   Mit Zitat antworten
Alt 25.06.2004, 09:28   #12
TP-Insider
 
Benutzerbild von NicNac
 
Registriert seit: Apr 2001
Ort: Zürich, Schweiz
NicNac macht alles soweit korrekt
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!
NicNac ist offline   Mit Zitat antworten
Alt 25.06.2004, 09:47   #13
TP-Specialist
 
Benutzerbild von mike
 
Registriert seit: Jan 2002
Ort: TP/Dynamik
mike bringt sich richtig ein
@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
mike ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
Startwerte von Klassenvariablen? Startwerte von Klassenvariablen?
« picture of the day | Cc: fürzweites@mail im Header? »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
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.

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Tragbaren MP3 Player von Creative (30GIG!) BSE Royal TP Flohmarkt 3 10.01.2004 23:18
Auch Web.de trennt sich von Google PortalNews Suchmaschinen 0 08.01.2004 11:57
Symantec erstreitet Schadensersatz-Zahlungen von Spam-Versender PortalNews Traum-News 0 26.12.2003 15:04
Rechtslage gefährdet Existenz von Suchmaschinen PortalNews Suchmaschinen 0 24.08.2002 12:13


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:02 Uhr.

Powered by: vBulletin Version 3.7 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. / Search Engine Friendly URLs by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Traum-Projekt.com | Suchen | Archiv | Impressum | Kontakt | | | Nach oben |



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67