php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.02.2005, 10:02  
Benutzer
 
Registriert seit: 30.10.2004
Beiträge: 92
DannyD
Standard [Klassen] Untereintrag für Objekt erzeugen?

Hallo zusammen,

ich habe mir eben eine kleine Klasse gebastelt, die verschiedene Waren beschreiben soll.

PHP-Code:
<?php
class ware{
    
    var 
$db            string;
    var 
$name        string;
    var 
$produktion    int;
    var 
$kosten        string;
    
    function 
add($db$name$produktion$kosten){
        
$this->db             $db;
        
$this->name         $name;
        
$this->produktion     $produktion;
        
$this->kosten         $kosten;
    }
    
    function 
gibKosten(){
        return 
$this->kosten;
    }

}

?>

Jetzt wollte ich ein Objekt "waren". Also:

PHP-Code:
<?php
$waren 
= new ware();
?>
Und als nächstes die einzelnen Waren hinzufügen ($waren soll als eine Art Datenbank agieren):

PHP-Code:
<?php
$tisch 
$waren->add("tisch""Holztisch"2"eur » 80");
$stuhl $waren->add("stuhl""Holzstuhl"8"eur » 30");
?>
Aber dort werden ja, wenn ich mir das Objekt $waren ausgeben lasse, alle Inhalte überschrieben.

Wie könnte ich das realisieren, dass in etwa eine Anordnung wie $waren->stuhl->gibKosten(); herauskommt?

Normalerweise habe ich soetwas immer in Arrays gemacht. Da waren die Abfragen sehr simpel ($waren["stuhl"]["kosten"];). Aber man will sich ja weiterbilden.

Ich wäre also dankbar für Ansätze oder Lösungen.

Grüße,
DannyD
DannyD ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 16.02.2005, 10:27  
Erfahrener Benutzer
 
Registriert seit: 08.02.2005
Beiträge: 224
lomtas
lomtas eine Nachricht über ICQ schicken
Standard

ich löse das in meinen klasse immer mit arrays
also übergebe ich auch array
z.b.
$waren->add(array("name"=>"stuhl","material"=>"holz","kos ten"=>"30"));
vielleicht ist das für dich ein denkbarer ansatz?
lomtas ist offline  
Alt 16.02.2005, 10:55  
Benutzer
 
Registriert seit: 30.10.2004
Beiträge: 92
DannyD
Standard

Ich habe es mal so probiert, wie du es gesagt hast. Hier mein Ansatz:

PHP-Code:
<?php
class ware{
    
    var 
$data$name;
    
    function 
add($data){
        
$this->eval($data["name"])->db            $data["db"];
        
$this->eval($data["name"])->produktion    $data["produktion"];
        
$this->eval($data["name"])->kosten        $data["kosten"];
    }
    
    function 
gibKosten($name){
        return 
$this->eval($name)->kosten;
    }

}

$waren = new ware();
$tisch $waren->add(array("db"=>"tisch""name"=>"Holztisch""produktion"=>2"kosten"=>"eur » 80"));
$tisch $waren->add(array("db"=>"stuhl""name"=>"Holzstuhl""produktion"=>8"kosten"=>"eur » 30"));

echo 
$waren->gibKosten("tisch");

?>
Jedoch gibt er mir diese Fehlermeldung aus:

Parse error: parse error, unexpected T_OBJECT_OPERATOR in C:\xampp\htdocs\cerdo_mercari\php\includes\klassen \waren.php on line 8


Hab ich das Array falsch eingesetzt, oder hat die Klasse ein Problem mit "eval"?
DannyD ist offline  
Alt 16.02.2005, 11:43  
Benutzer
 
Registriert seit: 30.10.2004
Beiträge: 92
DannyD
Standard

So, ich habe es jetzt selbst hinbekommen. Man musste das Objekt nur nicht in der Klasse deklarieren.

Hier nochmal das Script:

PHP-Code:
<?php
class ware{
    
    var 
$db$name$produktion$kosten;
    
    function 
ware($db$name$produktion$kosten){
        
$this->db            $db;
        
$this->name            $name;
        
$this->produktion    $produktion;
        
$this->kosten        $kosten;
    }
    
    function 
gibKosten(){
        return 
$this->kosten;
    }

}

$waren->tisch = new ware("tisch""Holztisch"2"eur » 80");
$waren->stuhl = new ware("stuhl""Holzstuhl"8"eur » 30");

print_r(get_object_vars($waren));

?>
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit (Mark Twain).
DannyD ist offline  
Alt 16.02.2005, 18:10  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

guck dir das hier mal an:
ich meine, du brauchst einen rekursiven ansatz, um objektkomposition sauber verwenden zu können. das design pattern dazu heißt aggregat.
PHP-Code:
<?php
class Komponente {

    var 
$_kinder = array();
    var 
$_name;
    var 
$_preis;
    
    function 
Komponente($name,$preis 0) {
        
$this -> _name $name;
        
$this -> _preis $preis;
    }

    function 
add(&$eineKomponente) {
         
$this -> _kinder[] = & $eineKomponente;
    }

    function 
getPreis() {
        
$summe 0;
        for(
$i=0,$m=count($this -> _kinder);$i<$m;$i++) {
            
$kind = & $this -> _kinder[$i];
            
/* @var $kind Komponente */
            
$summe += $kind -> getPreis();
        }
        return (
$summe $this -> _preis);
    }
    
    function 
getName() {
        return 
$this -> _name;
    }
}

// testing...
$tisch = new Komponente('tisch',80);
$stuhl = new Komponente('stuhl',30);

$wohnzimmer = new Komponente('wohnzimmer',0);
$wohnzimmer -> add($tisch);
$wohnzimmer -> add($stuhl);


$wohnung = new Komponente('wohnung',0);
$wohnung -> add($wohnzimmer);

$kueche = new Komponente('küche',0);
$herd = new Komponente('herd',800);
$kueche -> add($herd);

$wohnung -> add($kueche);

echo 
$wohnung -> getPreis();
?>
ich habe mal die kommentare weggelassen, damit das wichtige am code sichtbar wird.
du definierst dir eine oberklasse 'Komponente' oder 'Ware', die grundsätzlich erstmal sich selbst beschreibt.

dann kann eine komponente auch 'kinder' haben, die mit add() hinzugefügt werden.

dadurch, dass die kinder selbst ebenfalls komponenten sind, 'verhalten' sie sich alle gleich.
du kannst also beliebig komponenten verschachteln.

das schöne folgt aber erst, wenn du mit vererbung arbeitest.

PHP-Code:
<?php

class Tisch extends Komponente {

    function 
Tisch() {
      
$this -> _name 'tisch';
      
$this -> _preis 80;
    }
}

class 
Stuhl extends Komponente {
    function 
Stuhl() {
      
$this -> _name 'stuhl';
      
$this -> _preis 30;
    }
}

class 
Kueche extends Komponente {

    function 
Kueche() {
      
$this -> _name 'kueche';
      
$this -> _preis 0;
    }
    
}

class 
Wohnzimmer extends Komponente {

    function 
Wohnzimmer() {
    
        
$this -> _name 'wohnzimmer';
        
$this -> _preis 200// grundausstattung
        
$stuhl = new Stuhl();
        for(
$i=0;$i<6;$i++) {   // einfach mal annehmen, dass das Wohnzimmer standardmäßig 6 stühle hat.
            
$this -> add($stuhl);
        }
        
$tisch = new Tisch();
        
$this -> add($tisch);
    }
}






//// usage:

$wohnung = new Komponente('wohnung',0);
$wohnzimmer = new Wohnzimmer();
$kueche = new Kueche();
$stuhl = new Stuhl();
$kueche -> add($stuhl);

$wohnung -> add($wohnzimmer);
$wohnung -> add($kueche);

echo 
$wohnung -> getPreis();
?>
... wie du siehst, kannst du damit dann beliebig unterklassen bauen, die ihr komplettes sonstiges verhalten verändern - sie könnten theoretisch sogar ihren preis anders berechnen etc...
dadurch aber, dass sie alle Komponenten sind, kannst du beliebig damit rechnen.

das einzige was du nicht machen darfst, sind ring-referenzen:

also niemals:
Code:
$wohnung = new Wohnung('hallo',0);
$wohnung -> add($wohnung);
sonst gibt's 'ne wunderbare endlosschleife


grüße
axo
axo ist offline  
Alt 17.02.2005, 18:13  
Benutzer
 
Registriert seit: 30.10.2004
Beiträge: 92
DannyD
Standard

Danke für das Script. Ich werde es mal durcharbeiten und versuchen es im ganzen zu verstehen.
__________________
Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit (Mark Twain).
DannyD 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
Objekt im GET-Query wird nicht übertragen Ralpho PHP-Fortgeschrittene 10 05.05.2008 10:03
Objekt als ComboBox behandeln Nalincah PHP Tipps 2008 2 08.11.2007 03:52
Tool um (Spiel)Klassen zu erzeugen Martin13 PHP-Fortgeschrittene 6 05.09.2007 02:25
SQL Abfrage erzeugen/ string bearbeitung easy PHP Tipps 2007 20 28.03.2007 22:12
Objekt wird auf einem Server akzptiert auf anderem nicht nieselfriem PHP Tipps 2006 3 10.07.2006 01:46
PHP-Object (klasseninstanz) als Objekt an WS übergeben. joni1980 PHP-Fortgeschrittene 2 10.05.2006 11:25
Zugriff auf verschachteltes Objekt aus Funktion FloMX PHP-Fortgeschrittene 10 28.03.2006 17:01
Objekt in Session übergeben jacos PHP Tipps 2006 2 21.02.2006 00:11
[Erledigt] PHP5 OOP Zugriff aus einem Objekt auf ein externes Objekt PHP Tipps 2006 5 28.01.2006 16:05
Objekt übergeben Fatal Error PHP Tipps 2007 5 28.12.2005 14:43
Objekt in Array ablegen PHP-Fortgeschrittene 9 18.08.2005 14:35
kann sich ein Objekt selbst serialisieren? ajo_silent PHP Tipps 2005-2 24 27.06.2005 09:13
Uploadfelder dynamisch erzeugen und abfragen PHP Tipps 2005-2 1 03.06.2005 23:01
objekt und collection PHP Tipps 2004-2 2 17.11.2004 08:46
[Erledigt] variable Tabellen erzeugen PHP Tipps 2004 1 14.06.2004 09:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php objekt erzeugen, php object erzeugen, php object erstellen, php objekt erstellen, object erzeugen php, php objekte erzeugen, objekt erstellen php, objekt erzeugen php, objekte erzeugen php, object erstellen php, objektkomposition php, was bedeutet untereintrag, php klasse erzeugen, objekttyp ändern php, objektkomposition, objekt konstruieren php, php seite als objekt erstellen, object in einer funktion erzeugen php, php objekt in einer klasse erzeugen, php objekte verwalten

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:01 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.