Portal > Foren > PHP > PHP-Programmierung > [OOP] Kettenaufrufe von Objekten
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 30.06.2007, 19:27 Nach oben    #1
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 207
Standard [OOP] Kettenaufrufe von Objekten

Hi,

ich sehe immer öfters (z.B. in Frameworks) Aufrufe wie:
PHP-Code:
$class = new Class;
$class->do()->some($foo)->thing($bar, array(0,1)); 
Ich kann mir aber keinen Reim darauf machen. Werden da die Aufrufe aufgeteilt und jeweils Instanzen zurückgegeben, die dann den weiteren Teil der Kette ausführen? Also wäre der Code ja äquivalent zu:
PHP-Code:
$class = new Class;
$a $class->do();
$b $a->some($foo);
$b->thing($bar, array(0,1)) 
Ich habe keine Ahnung was das ist und wie das funktioniert!
FloB ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.06.2007, 20:11 Nach oben    #2
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 459
Standard

Hi!

Funktionieren tut das so:
PHP-Code:
<?php
class SomeClass
{
    public function 
d0() {
        return new 
SomeClass2;
    }
}

class 
SomeClass2
{
    public function 
some($foo) {
        echo 
$foo;
        return new 
SomeClass3;
    }
}

class 
SomeClass3
{
    public function 
thing($bar) {
        echo 
$bar;
        return 
true;

    }
}

$foo "foo";
$bar "bar";
$class = new SomeClass;
$class->d0()->some($foo)->thing($bar);  
?>
Das hat den Vorteil, dass man, der Übersicht halber, größere Aufgaben auf mehere verschiedene Klassen auslagern und das dann alles über eine Klasse steuern kann.
Schau dir einfach mal den Code der Frameworks genauer an und versuch zu verstehen, was genau da gemacht wird.
__________________
Corvin ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.06.2007, 20:50 Nach oben    #3
Erfahrener Benutzer
 
Registriert seit: 12.06.2006
Beiträge: 207
Standard

Ah, wars also doch das, was ich dachte..

In den Frameworks habe ich versucht es nachzuschauen, aber bei dem einen Aufruf, bei dem ich es gemacht habe, habe ich noch nich mal die erste Methode gefunden . Das ist ja immer ein unübersichtlicher Stammbaum ..

Aber es gibt doch noch die Möglichkeit, die ganze Kette per __call() auszulesen und dann damit weiterzuarbeiten, oder?
FloB ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.06.2007, 21:14 Nach oben    #4
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 307
Standard

Nein. Aber du kannst $this zurückgeben und dann Stück für Stück auswerten.
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.06.2007, 21:48 Nach oben    #5
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

@Corvin:
Wieso sollten da unterschiedliche Klassen zurückgegeben werden?

Wie Bleistift sagt macht das eher Sinn, wenn da das aktuelle Objekt, quasi $this zurückgegeben wird, damit man mit der bearbeiteten Instanz weiterarbeiten kann.

Ich bin da allerdings nicht so der Freund von, da ich lieber klare Strukturen habe.
Mir widerstrebt es irgendwie, wenn eine set-Methode etwas zurückgibt, wenn es auch nur die veränderte Instanz der Klasse ist!

Fachbegriff ist "fluent interface".
Hier steht z.B.
Zitat:
This is much more readable [..]
Ich halte das aber für eine Geschmackssache.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 30.06.2007, 22:18 Nach oben    #6
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.209
Standard

Muss es immer $this sein ?

Ich nutze das in dieser Form aktuell:
Zitat:
$results = $this->tableNameModel->find($id)->toArray();
Basis ist das Zend-Framkework, genauer ein Model auf Basis von Zend_Db_Table, das find() liefert dann ein Objekt vom Typ: Zend_Db_Table_Rowset zurück und das wird direkt über toArray() direkt als Array zurückgegeben.

Ich finde das so okay und übersichtlich, hab auf anhieb grad kein längeres Beispiel gefunden.

mfg
robo47
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.07.2007, 00:21 Nach oben    #7
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.517
Standard

Hi,
Zitat:
Zitat von robo47 Beitrag anzeigen
Muss es immer $this sein ?
nein. Natürlich kann es auch eine Instanz einer anderen Klasse sein. Also quasi das, was Corvin oben schon geschrieben hatte.

Dein Beispiel ist da eigentlich prädestiniert für.

Zitat:
Zitat von robo47 Beitrag anzeigen
Model auf Basis von Zend_Db_Table, das find() liefert dann ein Objekt vom Typ: Zend_Db_Table_Rowset zurück und das wird direkt über toArray() direkt als Array zurückgegeben.
Gut, ist halt wirklich Geschmackssache.
Ich bin nicht so der Propel-Fan und auch kein Fan dieser DB-Abstraktionssachen.

Dein Beispiel zielt ja genau auf so etwas hinaus.

Um aber beim Thema zu bleiben.
Ich bin eher dafür, dass man im Quelltext klar und deutlich sieht, was gemacht wird und das ist für mich eben in der expliziten Form à la
PHP-Code:
$obj->doX();
$obj->setValue($var);
$obj->setProperty(true);
$result $obj->getResult(); 
einfacher.

Vielleicht fehlen mir auch einfach Anwendungsbeispiele, wo es mir wirklich Vorteile bringt. Who knows?

Die Beispiele im Zend Framework setze ich allesamt in der expliziten Form um ..
Nunja, egal.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 01.07.2007, 01:45 Nach oben    #8
Christian W. Achatz
 
Benutzerbild von dr.e.
 
Registriert seit: 05.02.2007
Ort: München
Beiträge: 150
Standard

Zitat:
Zitat von Ben Beitrag anzeigen
Vielleicht fehlen mir auch einfach Anwendungsbeispiele, wo es mir wirklich Vorteile bringt. Who knows?
Ich stimme hier zu. Verschachtelte Aufrufe sind intransparent und bringen meiner Ansicht nach auch keinen wirklichen Vorteil. Performance-Technisch müssen die Return-Werte ohnehin im Speicher gehalten und von der CPU verarbeitet werden...
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> http://adventure-php-framework.org)!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[OOP] read-only per __set() geht nicht FloB PHP-Programmierung 8 01.07.2007 19:58
Grundsatzfrage zu Objekten Julied64 JavaScript und AJAX 1 09.03.2007 14:39
[OOP] News extends Kommentar ? WarrenFaith PHP-Programmierung 33 16.05.2006 12:25
Liste mit Objekten einer Klasse nach Property sortieren Michael.Schmuck Allgemeine Java-Programmierung 4 22.02.2005 18:26


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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