php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.07.2006, 17:31  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard Objekte

Ich hab gerade zum ersten mal objekte benutzt (eigentlich komme ich auch ohne sie gut aus) und hab jetzt eine frage:

wie kann man aus einem objekt a deine eigenschaft aus einem objekt b ändern (sie haben die selbe klasse)

ich hab es einfach mal so versucht (vereinfachtes beispiel):

PHP-Code:
$b->zahl += 2
aber da wird ausgegeben, dass die variable b nicht definiert ist...

ich hab es als zwischenlösung über eine zweite methode gelöst, aber diese lösung gefällt mir nicht so gut (ist recht umständlich)
moose ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.07.2006, 17:51  
¯\_(ツ)_/¯
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.814
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Zeig doch mal die Klasse sonst können wir doch auch nix sehen!
__________________
▇█▓▒░◕‿‿◕░▒▓█▇
Flor1an ist offline  
Alt 25.07.2006, 18:13  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard

ok, ich vereinfache es mal und schreibs so, wie ich es gerne hätte:

PHP-Code:
$attacker = new Player("nemesis");
$defender = new Player("moose");
$attacker->deal_damage();

class 
Player {
    var 
$name;
    function 
Player($name){
        
$this->name$name;
        
$this->hp10;
    
$result mysql_query("SELECT * FROM spieler WHERE s_name='".$name."';");
    
$row mysql_fetch_assoc($result);    
    
$this->id $row['id'];
    }
    function 
deal_damage(){
    
$damage 1;
    
$defender->hp -= $damage;
    }

da das nicht funktioniert hab ich ne zweite methode get_damage angelegt, und der $damage übergebe ich mit return.
moose ist offline  
Alt 25.07.2006, 18:21  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.150
Guradia befindet sich auf einem aufstrebenden Ast
Standard

Aus dem gezeigten würde ich schlussfolgern, dass es auch mit get_damage() nicht funktionieren kann.

Wo soll $defender auch herkommen?!
Guradia ist offline  
Alt 25.07.2006, 18:39  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard

$defender ist ein objekt und doch, mit der 2. funktion klappts, jedoch müsste ich so noch einiges schreiben und wenn es nur über eine get_damage() klappt, kann ich eigentlich arrays benutzen und objekte ganz weglassen, schlicht weil es einfacher ist. sollte es jedoch mit objekten klappen, wäre der quelltext wesentlich übersichtlicher.
__________________
http://www.martin-thoma.de
moose ist offline  
Alt 25.07.2006, 18:44  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.150
Guradia befindet sich auf einem aufstrebenden Ast
Standard

Dann zeig mal dein ominöses get_demage()

Ausserdem erscheint es mir auch völlig unlogisch dem $attacker zu sagen deal_damage() ohne ihm aber mitzuteilen wemgegenüber ...

$attacker->deal_damage($defender);

Und tadaaa ... schon macht das ganze auch sinn
Guradia ist offline  
Alt 25.07.2006, 18:47  
Erfahrener Benutzer
 
Registriert seit: 21.01.2005
Beiträge: 444
stf.stream
stf.stream eine Nachricht über ICQ schicken
Standard

Sieht nach Browsergame aus... hehe

Also, da php die durch player X verursachten damage-information eh nicht zur laufzeit für player Y bekannt macht, sondern erst nach dessen (player Y's) reload, würde ich die damage-information für alle betroffenen player-objekte in der DB speichern und bei reload entsprechend laden:
PHP-Code:
class Player {
    var 
$name;
    function 
Player($name){
        
$this->name$name;
        
$this->hp10;
        
// selektiere nur benötigte felder!
        
$result mysql_query("SELECT id, damage  FROM spieler WHERE s_name='".$name."';");
        
$row mysql_fetch_assoc($result);    
        
$this->id $row['id'];
        
$this->damage $row['damage'];
    }
    
    function 
deal_damage(){
        
$damage 1;
        
mysql_query("UPDATE spieler SET  damage-".$damage." WHERE s_id=".$beroffene_id);
        
// oder so ähnlich...
        // Statement abfeuern, fertsch 
    
}

    
// etc, etc

stf.stream ist offline  
Alt 25.07.2006, 18:54  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard

ok, ich glaub es ist leichter euch das ganze zu zeigen
PHP-Code:
editviel zu langer code... 
@stf.stream: Würdest du das ganze wirklich so in einer datenbank machen? ich komm dann mit einm mal skript ausführen auf ca 200 querys... verkraftet so was der server? vor allem wenn das mehrere machen?
ach ja, das ziel kann ich auch noch übergeben, aber darum gehts mir nicht.

Das ist meine eigentliche frage, nur neu formuliert (ich hoffe mein problem ist nun klar)
Zitat:
ich will mit einer methode "eins", die in einem objekt "a" aufgerufen wird eine variable in einem objekt "b" ändern. gibt es da eine möglichkeit, das direkt zu machen, oder muss ich den umweg über eine zweite methode gehen
moose ist offline  
Alt 25.07.2006, 19:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
ich habe mir den Code nicht so detailiert angeschaut, aber ich möchte ein paar Anmerkungen machen.

Die Klasse Player sollte ihren Zustand nach Möglichkeit nicht selbst aus der Datenbank lesen bzw. ihn dorthineinschreiben. Wenn du pro Skript-Ausführung mehrere Player erzeugst, würde ich dir eine Manager-Klasse empfehlen, die dir die Player erzeugt.
Der Vorteil ist: Statt bei x Playern x Datenbank-Abfragen, nurnoch eine Datenbankabfrage.
Außerdem kannst du die Art der Datenspeicherung (Datei, Datenbank, Datenbank-Art, Datenbank-Layout) dann dort festlegen. Anders hättest du aufgeblähte Player-Objekte, die alles können aber auch fett Speicher fressen, und das pro Instanz.

PHP-Code:
<?php
$db 
DatabaseConnector::factory('mysql://user:password@localhost/browsergame'); // Datenbank-Klasse
$manager Manager::factory($db'players''Player'); // erzeugt aus MySQL-Tabelle 'players' einen Array von Objekten der Klasse 'Player'
$players $manager->get('id', array(517)); // players mit ID 5 und 17 holen
echo $players[5]->getName();
?>
Jetzt kannst du die beiden gegeneinander kämpfen lassen:
PHP-Code:
<?php
$players
[5]->attack($players[17]); // Parameter als &$referenz
// ..
$players $manager->save($players); // Änderungenen übernehmen und $players aktualisieren
// oder wieder als Referenz und damit ohne Rückgabewert
?>
Nun übernimmt die Manager-Klasse wieder die Speicherung des Schadens in der DB und stellt die aktualisierten Datensätze wieder zur Verfügung.

Da wird gerade auch schon die Persistenz(Datenspeicherungs)- von Applikations-Logik getrennt hätten, wäre es nur konsequent auch die Darstellungs-Logik aus der Klasse Player zu verbannen.
Sprich jegliche HTML-Formatierungen aus der Klasse rausschmeissen und stattdessen entweder über Templates die Player-Werte anzeigen lassen, oder eine eigene Darstellungs-Klasse (die von Player) erbt, erzeugen und die die Details von Player oder ähnliches anzeigt.
Zergling-new ist offline  
Alt 25.07.2006, 19:41  
Erfahrener Benutzer
 
Registriert seit: 14.01.2006
Beiträge: 111
moose
Standard

Ok, vielen dank Zerling.
ich hab zwar noch nicht genau verstanden wie es gemacht werden muss, doch ich glaube, das ist das was ich gesucht habe.

nur noch 2 kurze zwischenfragen:
PHP-Code:
$db =DatabaseConnector::factory('...'
sagt mir nix, ich habs hier mal nachgelesen. ist da DatabaseConnector die classe, factory eine funktion dieser klasse und man hat kein objekt mit dieser klasse erstellt?

was ist eine &$referenz?

Ich glaub ich muss die letzten kapitel im tutorial noch mal machen.
__________________
http://www.martin-thoma.de
moose ist offline  
 


Themen-Optionen
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
Referenzen auf Objekte innerhalb eines Arrays PHP-Fortgeschrittene 6 31.08.2009 17:06
[Erledigt] objekte mit bilddaten serialisieren lumo PHP Tipps 2008 1 17.07.2008 12:25
[Erledigt] Objekte übergeben Felix PHP Tipps 2008 23 18.06.2008 12:21
Sortierbare Objekte Zergling-new PHP-Fortgeschrittene 5 27.11.2007 23:19
Objekte zur Laufzeit Vererbung anhängen Zergling-new PHP-Fortgeschrittene 8 17.11.2007 17:31
2 AJAX Objekte GSJLink HTML, Usability und Barrierefreiheit 6 15.08.2007 16:05
Rekursives durchlaufen meiner Objekte GELight PHP Tipps 2006 2 01.07.2006 23:21
Objekte sortieren Fatal Error PHP Tipps 2006 4 13.04.2006 14:24
[Erledigt] Objekte vergleichen PHP-Fortgeschrittene 4 08.12.2005 16:20
objekte und klassen notyyy PHP Tipps 2005-2 2 24.10.2005 17:44
Objekte PHP Tipps 2005-2 12 09.10.2005 18:20
[Erledigt] Verständnisfrage OOP - Objekte in MySQL Datenbank schreiben? PHP Tipps 2005 2 19.05.2005 21:40
Ganze Objekte an Script weitergeben dreamingof8a PHP Tipps 2004-2 6 23.11.2004 12:17
[Erledigt] Referenzen auf Objekte PHP-Fortgeschrittene 2 17.08.2004 11:08
Anonyme Objekte? PHP-Fortgeschrittene 18 25.07.2004 22:19


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.