php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.04.2005, 20:42  
Gast
 
Beiträge: n/a
Standard [Erledigt] Kommunikation zwischen Objekten - Wie geht es richtig?

Wie kann ich Objekte miteinander am besten Kommunizieren lassen?

Vielleicht das ganze mit einem Beispiel. Wir haben zwei Klassen. Die eine ist Ich und die andere ist der Pizzaservice. Ich beschriebt meinen Hunger und den Hunger auf die entsprechende Pizza. Der Pizzaservice handelt die Pizza-Lieferung.

Hier mal der Code:
PHP-Code:
<?php
class Ich
{
private 
Hunger=100//Hungergefühl auf Pizza in Prozent
privat HungerAuf="Spezial";
function 
setHunger($RealerHunger)
{
$this->Hunger=$RealerHunger;
}

function 
bestellen($Typ)
   {
         if (
$this-> Hunger>80)
    {
    
$result=PizzaService::pizzaLieferung($Typ);
    
$this->Hunger=$this->Hunger-$result;
    }
 }
}

class 
PizzaService
{
private 
Typ[]=........//Hier kommen alle Pizzasorten rein
privat pizzenAufLager=7;

     function 
pizzaLieferung($Typ)
        {
            if (
$Typ=="SchinkenPilzeMitDoppeltKäseundTabasco")
           {
               
$this->pizzenAufLager -= $this->pizzenAufLager;
               return 
20;
           }
           if (
$Typ=="Spezial und Gross")
           {
               
$this->pizzenAufLager -= $this->pizzenAufLager;
               return 
40;
           }
     }
}


$Manfred=new Ich;
$Manfred->Hunger=90;
$Manfred->bestellen("Spezial und Gross");



  
?>

Das ist meine momentane Vorstellung von Kommunikation zwischen Objekten. Manfred hat Hunger und bestellt eine grosse Spezial. Der Pizzaservice liefert ihm eine Spezial, was sein Hungergefühl um 40 verringert. Dabei passiert im Pizzaservice ja auch dann einiges - sie haben dann weniger Pizzen zur auf Lager.

Meine Frage ist nun - Funktioniert so die Kommunikation zwischen Objekten wirklich? Oder funktioniert das noch mal anders? Kann man das einfacher machen? Hier meine ich besonders den Aufruf der Klasse Pizzaservice in der Klasse Ich.

Also die Zeile:
PHP-Code:
<?php
$result
=PizzaService::pizzaLieferung($Typ);
?>
Thx4Help
Unien
 
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.04.2005, 21:37  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja. statisches aufrufen von methoden ist nicht gerade sinnvoll. also sinnvoll ist es schon in bestimmten fällen, aber nicht in diesem fall.
wie du auch sicher bemerkt hast, kannst du, wenn du die methode pizzalieferung so aufrufst, gar nicht auf $this -> zugreifen.
besser:
PHP-Code:
<?php
function bestellen($Typ)
   {
         if (
$this-> Hunger>80)
    { 
           
$ps = & new PizzaService();
           
$result = & $ps -> pizzaLieferung($Typ);
           
$this -> Hunger -= $result;
    }
}
?>
... was noch nicht ganz der käse der pizza ist.
ein pizzaService könnte ja nicht nur 'ich' beliefern, sondern auch weitere leute - weswegen es sinnvoll ist, nicht jedes mal den pizzaservice mit new zu initialisieren.


PHP-Code:
<?PHP
class Ich {
     var 
$Hunger=100//Hungergefühl auf Pizza in Prozent
    
var $HungerAuf="Spezial";

    function 
setHunger($RealerHunger)    {
        
$this->Hunger=$RealerHunger;
    }

    function 
bestellen($Typ,&$lieferant)    {
        if (
$this-> Hunger>80)    {
            
$this -> Hunger -= $lieferant -> pizzaLieferung($Typ);
        }
    }
}

class 
PizzaService    {
    var 
$pizzaTypen = array('ding','dong','Spezial und Gross');
    var 
$pizzenAufLager 7;

     function 
pizzaLieferung($Typ,$adresse,$anzahl) {
         if(
$this -> istLieferbar($Typ)) {
             
$this -> pizzenAufLager --;
             return 
$this -> pizzaSaettigung($Typ);
         }
         return 
0
     }
     
     function 
pizzaSaettigung($Typ) {
         if (
$Typ=="SchinkenPilzeMitDoppeltKäseundTabasco")    {
               return 
20;
         }
         if (
$Typ=="Spezial und Gross")    {
               return 
40;
         }
         return 
10;
     }
     
     function 
istLieferbar($typ) {
         return 
in_array($typ,$this -> pizzaTypen) && $this -> pizzenAufLager 0;
     }
     
}

$pizzaService = & new PizzaService();
$pizzaService -> pizzenAufLager 2;

$Manfred=new Ich();
$Manfred->setHunger(90);
$Manfred->bestellen("Spezial und Gross",$pizzaService);
echo 
$Manfred -> Hunger// 
$Karl = & new Ich();
$Karl -> setHunger(100);
$Karl -> bestellen('dong',$pizzaService);
echo 
$karl -> Hunger// 90% 
$Karl -> bestellen('dong',$pizzaService); // hoppla - pizzaService kann nicht mehr liefern...
echo $karl -> Hunger// immer noch 90%

?>
axo ist offline  
Alt 10.04.2005, 22:02  
Gast
 
Beiträge: n/a
Standard

Beschreibt dieses Beispiel schon die Kommunikation zwischen Objekten ganz gut, oder gibt es hier noch andere Möglichkeiten?


Weiter heisst das ja auch, dass die Klasse entsprechend für die Kommunikaton angepasst werden muss. Sie muss sozusagen sprechen lernen, oder?

Danke schon mal für die tolle Antwort

Gruss
Unien

PS: Hab gerade vorhin erst mal ne Pizza bestellt $RealerHunger=100;
 
Alt 10.04.2005, 23:42  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

naja, OOP macht nicht wirklich sinn, wenn objekte nicht miteinander kommunizieren, oder? und ja, es gibt noch eine unendliche menge von anderen lösungsmöglichkeiten. im grunde kannst du das ganze gestalten wie du willst, wie hoch dein kreativitätsgrad ist, und wie es die anforderungen wollen. solange du dich an ein paar grundregeln hälst:

1. globals sind evil
2. keine magischen zahlen im code
3. kommentiere in einfachen worten, was eine methode tut.
3.1. besser noch, gib der methode einen sinnvollen namen, der bereits dokumentiert, was die methode tut.
4. guck dir unit tests und die gedankengänge dahinter an.

... die eigentlich auch für nicht-oop gelten,
dann wird schon alles gut gehen.

das hier: http://www.amazon.de/exec/obidos/ASIN/3827321999/ beschreibt so ziemlich vollständig die komplette palette von kommunikationsmöglichkeiten zwischen objekten und ist gleichzeitig _die_ bibel für OOP, allerdings nichts für anfänger. und man sollte sich vor augen halten, dass php nicht java ist und man nicht für alles sinnvoll OOP-lösungen verwenden kann und sollte.
axo ist offline  
Alt 10.04.2005, 23:55  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

übrigens, um dir noch ein wenig bei den gedankgengängen weiterzuhelfen:

ein 200-kilo-mann ist nich gleich schnell sattzukriegen wie ein zweijähriges 11-kilo-mädchen . ersterer braucht z.b. 3 pizzen um sein $Hungergefühl von 100% auf 60% zu senken, das 11-kilo-mädchen braucht gerade mal die salamistückchen auf einer pizza, um satt zu sein.

... womit die methode pizzaSaettigung() nicht mehr in die klasse 'PizzaService' gehört, sondern in die klasse 'Ich', die sinnvollerweise 'Person' genannt werden sollte.

dadurch wird die klasse 'Person' nun etwas autonomer, denn jede Person verwaltet ihr Hungergefühl jetzt selbst. womit dann auch das problem, dass die Person, wenn sie hunger hat, nur beim pizzaservice bestellen kann, auch bereits löst.

... und so weiter. nur mal so als gedankengänge, wie kommunikation erweitert, eingeschränkt und entfernt wird.

genauso kannst du die steuerung des essens erweitern:
wer steuert wie das essen?
- ist Person autonom und isst, wenn er/sie hunger hat?
- gibt es eine 'mama', die alle zu tisch holt, wenn essenszeit ist?
- was isst die person wann? evtl. billige spaghetti mit tomatensauce ab dem 15. des monats, wenn das geld langsam knapp wird? pizzaservice am 1.? es soll ja auch veganer geben - wo kriegen die was zum essen her?
axo ist offline  
Alt 11.04.2005, 00:01  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von axo
das hier: http://www.amazon.de/exec/obidos/ASIN/3827321999/ beschreibt so ziemlich vollständig die komplette palette von kommunikationsmöglichkeiten zwischen objekten und ist gleichzeitig _die_ bibel für OOP, allerdings nichts für anfänger.
Meine Meinung. Habe das Buch hier auch ständig offen neben mir liegen
Es erfordert aber natürlich die Fähigkeit abstrakt zu denken .. aber wenn die nicht gegeben ist, dann wird OO auch sehr schwer

Zitat:
Zitat von axo
und man sollte sich vor augen halten, dass php nicht java ist
Dazu sei gesagt, dass obiges Buch nicht auf OO in Java eingeht.

Und jetzt bin ich ruhig
imported_Ben ist offline  
Alt 11.04.2005, 00:06  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Ben
Zitat:
Zitat von axo
und man sollte sich vor augen halten, dass php nicht java ist
Dazu sei gesagt, dass obiges Buch nicht auf OO in Java eingeht.
lol... ich war noch am überlegen, ob ich obigen beitrag noch mit einer bemerkung dahingehend erweitern sollte.
axo ist offline  
Alt 11.04.2005, 00:32  
Erfahrener Benutzer
 
Registriert seit: 14.01.2004
Beiträge: 2.543
fantast
fantast eine Nachricht über ICQ schicken
Standard

schoenes beispiel gemeinhin funktioniert ebendie kommunikation zwischen objekten so. in speziellen faellen kann man sich dann pipes einrichten, aber das ist fuer dich nicht so interessant glaub ich.

inwiefern unterscheidet sich den oop in java von der in php ? mal von der syntax abgesehn ?
__________________
Was ist validität?
fantast ist offline  
Alt 11.04.2005, 00:48  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von fantast
inwiefern unterscheidet sich den oop in java von der in php ? mal von der syntax abgesehn ?
naja, in java ist OOP sozusagen die einzige möglichkeit, sinnvoll zu programmieren. mit php nicht. mit php kann man schnell laufende skripte schreiben, mit ein paar wenigen funktionen und fertig ist die laube. und schön schnell ist das ganze dann auch.

OOP ist mit java wunderbar schnell, denn der compiler regelt die meiste referenzierung und das durchschleifen durch endlos lange zuständigkeitsketten zur compile time, d.h. selbst wenn ein objekt erstmal durch hunderte von anderen objekten durchgeschleift wird, bleibt das ganze nach erfolgreichem kompilieren relativ schnell. bei php ist ab ca. 8-10 referenzierungsstufen erstmal bugfixing angesagt - da kann man böse überraschungen erleben.

grundsätzlich programmiert man, wenn man ordentliches refactoring betreibt, mit java auf leichtgewichtige, hauptsächlich aus 1-3-zeiligen methoden bestehende klassen hin. wenn man das mit php machen würde (und ja, ich hab das auch schon gemacht) wird's übel.

außerdem muss man mit php4 ganz konsequent darauf achten, was passiert, wenn man NULL referenziert - gerade laufzeit-NULL-referenzen können zu ganz ganz schwer zu debuggenden fehlern führen - weil der interpreter anscheinend null-referenzen global teilt und bei überlast nicht mehr ordentlich entscheidet. so etwas passiert mit java deutlich seltener. ich hatte grad gestern einen bug (php4.3.10), der nur auftauchte, nachdem ich mit einer künstlich hervorgerufenen endlosschleife erstmal den speicher gefüllt habe und den apachen und php an leichte leistungsgrenzen geschickt habe und dann das testskript laufen ließ - plötzlich war PEAR :: DB kein objekt mehr und hatte einen parse error in zeile 305...

als ursache hat sich herausgestellt, dass ich ein defaultmäßig auf NULL gesetztes klassenattribut per referenz geholt habe. der aufruf hat genügt, um alles zu schießen. wenn sowas mit java passiert, laufen bei SUN die telefone heiß...
axo ist offline  
Alt 11.04.2005, 00:57  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.818
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

... allerdings nehme ich diese nachteile (längere laufzeiten, höhere performancelast etc) mit php trotzdem auf jeden fall in kauf, weil es mir in 98% der fälle eher auf robustheit, erweiterbarkeit, übersichtlichkeit und testbarkeit der skripte ankommt und es meistens nicht darauf ankommt, ob sie alle benchmarks schlagen. ich weiß aber auch, was zu tun ist und wie ein skript auszusehen hat, wenn es mal wirklich benchmarks schlagen muss oder vielen anfragen auf einmal standhalten soll.
axo 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
PHP richtig lernen! TeazY PHP Tipps 2008 5 01.02.2008 21:50
Kommunikation zwischen IFRAME und Hauptseite R4v3r HTML, Usability und Barrierefreiheit 1 02.04.2007 13:57
Kommunikation zwischen Javascript und php!? Funky_ PHP Tipps 2006 7 06.08.2006 17:16
zeit zwischen 2 datetime jens76 Datenbanken 13 08.06.2006 14:15
[Erledigt] Modularisierung: Wie macht man es richtig? PHP-Fortgeschrittene 1 12.03.2006 16:00
[Erledigt] Abstände zwischen Tabellen HTML, Usability und Barrierefreiheit 1 11.10.2005 14:55
Text zwischen zwei zechen löschen PHP Tipps 2005-2 2 08.07.2005 19:21
Seite zwischen URL und Download Zangelo PHP Tipps 2005-2 0 16.06.2005 22:22
PHP funktioniert nicht richtig?! PHP Tipps 2005-2 26 11.06.2005 09:05
abstrakte unterschiede zwischen ie und opera HTML, Usability und Barrierefreiheit 8 12.03.2005 19:54
Ist der Code richtig? PHP Tipps 2005 13 24.02.2005 13:11
Variable wird nicht richtig übergeben PHP Tipps 2005 17 16.01.2005 16:51
[Erledigt] imap_body RICHTIG ausgeben (mit allen Sonderzeichen usw.) PHP-Fortgeschrittene 3 08.09.2004 02:33
[Erledigt] Perl richtig installiert oder falsch ? testen aber wie ? c01001 Server, Hosting und Workstations 2 31.08.2004 22:37
Formular, welches prüft, ob eingegebene Antwort richtig.... PHP Tipps 2004 10 15.08.2004 22:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
kommunikation zwischen objekten, java kommunikation zwischen klassen, kommunikation zwischen klassen, java kommunikation zwischen objekten, kommunikation zwischen objekten java, wie kommunizieren objekte untereinander, java objekte kommunizieren, kommunikation von objekten, objekte kommunizieren, kommunikation zwischen klassen java, kommunikation objekte java, java kommunikation objekte, java kommunikation von objekten, java kommunikation zwischen zwei klassen, php objekt klasse bestellung, java objekt kommunikation, java objekte kommunikation, wie kommunizieren objekte, kommunikation zwischen 2 klassen, wie kommunizieren objekte miteinander

Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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.