Antwort
 
Themen-Optionen Thema durchsuchen
Alt 21.05.2008, 01:19 Nach oben    #1
Der Student
 
Benutzerbild von Flor1an
 
Registriert seit: 03.01.2007
Ort: München
Beiträge: 86
Standard [php] Method chaining

Method chaining

Einleitung
Das folgende Tutorial handelt vom so genannten "Method chaining".
Das Tutorial richtet sich an alle PHP Nutzer die bereits mit Klassen gearbeitet haben.
Method chaining funktioniert nur mit PHP5!

Nun was bedeutet Method chaining überhaupt?
Eine "Method" ist eine Methode einer Klasse. Nur zur kurzen Info: eine einfache function() in PHP nennt sich Funktion. Eine function() in einer Klasse wird Methode genannt. "chaining" bedeutet übersetzt Verkettung. Method chaining ist also das verketten von Methoden.


normale Anwedung von Methoden
Erstmal möchte ich ein Beispiel bringen wie Methode normalerweise angewendet werden.

PHP-Code:
<?php
class Person {

   private 
$name$age;

   public function 
setName($name) {
      
$this->name $name;
   }

   public function 
setAge($age) {
      
$this->age $age;
   }

   public function 
displayPerson() {
      echo 
'My Name is ' $this->name '! And I am ' $this->age ' years old!<br />';
   }
}

$person = new Person();
$person->setName('Flo');
$person->setAge(21);
$person->displayPerson();
Code:
My Name is Flo! And I am 21 years old!
Dieses Beispiel dürfte klar sein.



Anwendung von Method chaining
Folgendes Beispiel ist genau die selbe Situation allerdings verwende ich hier Method chaining.

PHP-Code:
<?php
class Person_chaining {

   private 
$name$age;

   public function 
setName($name) {
      
$this->name $name;
      return 
$this;
   }

   public function 
setAge($age) {
      
$this->age $age;
      return 
$this;
   }

   public function 
displayPerson() {
      echo 
'My Name is ' $this->name '! And I am ' $this->age ' years old!<br />';
   }

}

$person = new Person_chaining();
$person->setName('Flo')->setAge(21)->displayPerson();
Code:
My Name is Flo! And I am 21 years old!
Wie man sehen kann erfolgt genau die selbe Ausgabe. Aber das schöne ist dass wir die Methoden einfach aneinanderketten (chaining) können. Hat nicht nur den Vorteil dass wir weniger schreiben müssen, sondern ergibt auch einen logischen Sinn beim lesen vom Code.

Doch warum können wir diese Methoden hintereinander aufrufen?
Ein Aufruf funktioniert so:
$object->method();
Wir haben ein Objekt und wir rufen eine Methode dieses Objekts auf. Der Rückgabewert wird durch return in der Methode definiert. Das kann z.B. ein String, ein Integer oder ein Array sein. Oder, wie im ersten Beispiel, kann auch nichts zurückgegeben werden. Man könnte sich vorstellen das bei folgendem Aufruf
$x = $number->getValue(); eine Zahl zurück gegeben wird und dann
$x = 5; da steht!
5 ist also der Rückgabewert der aus $number->getValue() kommt. Daher definiere ich jetzt $object->method() als "Rückgabewert".

Im zweiten Beispiel rufen wir für den Rückgabewert nochmal eine zweite Methode auf.
Rückgabewert->method2();
Wie gesagt kann z.B. der Rückgabewert ein String sein. Aber auf einen String können wir keine Methode aufrufen. Deshalb brauchen wir wieder ein Objekt. Wir geben also mit return einfach das Objekt selbst zurück auf das wir die Methode angewendet haben.

PHP-Code:
<?php
public function setName($name) {
   
$this->name $name;
   return 
$this// hier geben wir das Objekt selbst zurück
}
Jetzt kann für das zurück gegebene Objekt wieder eine Methode aufgerufen werden.

Um Method chaining zu nutzen muss also nur return $this; in die Methoden die aneinander gekettet werden sollen. Die letzte Methode die aufgerufen wird sollte dann das Ergebnis verwerten. Also z.B. eine Ausgabe machen, einen Wert zurück geben oder etwas speichern.

Eine weitere Frage die ich mir stelle, wird das Objekt $person nur von der Methode verändert die als erstes Aufgerufen wird oder verändern die weiteren Methoden auch das Objekt?
Wie im ersten Beispiel verändern alle Methoden das Objekt $person! Hier noch ein kurzes Beispiel mit der zweiten Klasse die Method chaining verwendet!

PHP-Code:
<?php
$person 
= new Person();
$person->setName('Flo')->setAge(21)->displayPerson();

// Objekt $person hat sich verändert
$person->setName('Julia')->displayPerson();
Code:
My Name is Flo! And I am 21 years old!
My Name is Julia! And I am 21 years old!
Die Änderung von setAge() hat sich also ebenfalls auf das Objekt $person ausgewirkt. Mit setName() wird dann der Name überschrieben, das Alter bleibt allerdings noch das alte!



Anwendungsgebiete
Jetzt wissen wir was Method Chaining ist und wie es funktioniert. Doch wofür können wir es sinnvoll einsetzen? Hier möchte ich noch zwei Beispiele aufzeigen bei dennen man Method chaining nutzen kann.

Datenbank
Möglich wäre eine Klasse zu erstellen die Datenbank Querys generiert. Dies hat den Vorteil dass man einfach von einem Datenbanksystem auf ein anderes wechseln kann. Es muss dann nur die Klasse die die Querys generiert bearbeitet werden, alle Datenbankabfragen im Quellcode, die über diese Klasse abgehandelt werden, können so bestehen bleiben wie sie sind und müssen nicht extra bearbeitet werden.

PHP-Code:
<?php
$db
->select()
   ->
from('user')
   ->
where('age > 10')
   ->
order_by('username')
   ->
limit(10)
   ->
execute();
Die Methoden from(), where(), order_by() und limit() geben in diesem Fall return $this; zurück.
Die Methode execute() fügt den Query zusammen und schickt ihn an die Datenbank und gibt das Resultat zurück.

Auf die Klasse selber verzichte ich in diesem Beispiel da es doch eine recht komplexe Angelegenheit ist ein Query richtig zu generieren und alle Möglichkeiten einzubauen.

Validierung
Um z.B. Formulareingaben zu überprüfen könnte man eine Klasse schreiben die die Validierung vornimmt.

PHP-Code:
<?php
$valid 
$validator->value($username)
   ->
isRequired()
   ->
setLength(620)
   ->
isValid();

// oder
$valid $validator->value($birthday)
   ->
isDate()
   ->
isValid();

// oder
$valid $validator->value($postleitzahl)
   ->
isNumeric()
   ->
numRange(1000099999)
   ->
isValid();
   
// dann kann überprüft werden ob die entsprechende Eingabe erfolgreich validiert wurde
if ($valid) {
   
// validiert
} else {
   
// nicht validiert
}
Mit value() wird der zu überprüfende Wert übergeben, dann kann mit weiteren Methoden überprüft werden ob die Werte bestimmten Kriterien entsprechen und mit isValid() wird dann true oder false zurück gegeben jenachdem ob die Validierung erfolgreich oder fehlgeschlagen ist. Nützlich ist eine Validierung wenn es um komplexe Überprüfungen geht. Z.B. wenn ein Username nicht doppelt vorkommen darf, dann könnte es die Methode geben isUnique() in der dann in der Datenbank abgefragt wird ob so ein Username schon existiert.

Eine Klasse zur Validierung könnte so aussehen.

PHP-Code:
<?php
class Validator {

   private 
$value$error 0;

   public function 
value($value) {
      
$this->value $value;
      return 
$this;
   }

   public function 
isRequired() {
      if (empty(
$this->value)) {
         
$this->error++;
      }
      return 
$this;
   }

   public function 
setLength($min$max false) {
      if (
$min !== false AND strlen($this->value) < $min) {
         
$this->error++;
      }
      if (
$max !== false AND strlen($this->value) > $max) {
         
$this->error++;
      }
      return 
$this;
   }

   public function 
isDate() {
      
$date explode('.'$this->value); // deutsches Datum (tt.mm.jjjj)
      
if (!checkdate($date[1], $date[0], $date[2])) {
         
$this->error++;
      }
      return 
$this;
   }

   public function 
isNumeric() {
      if (!
is_numeric($this->value)) {
         
$this->error++;
      }
      return 
$this;
   }

   public function 
numRange($a$b false) {
      if (
$a !== false AND $this->value $a) {
         
$this->error++;
      }
      if (
$b !== false AND $this->value $b) {
         
$this->error++;
      }
      return 
$this;
   }

   public function 
isValid() {
      if (
$this->error == 0) {
         return 
true;
      }
      return 
false;
   }

}


Schluss
Method chaining ist also eine interessant Art wie man mit Methoden umgehen kann. Bei sinnvoller Verwendung kann es so die Lesbarkeit erhöhen und den Aufwand für den Programmierer senken.

Ein Beispiel wo Method chaining viel eingesetzt wird wäre das Zend Framework!

Ich würde mich freuen wenn ihr ein paar Kommentare zu diesem Tutorial schreibt. Kritik ist willkommen! Aus Übersichtsgründen habe ich auf große Fehlerbehandlungen verzichtet, dies obliegt dem Nutzer.

Viel Spass Flor1an

Geändert von Flor1an (21.05.2008 um 16:19 Uhr).
Flor1an ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen 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 are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Referenz auf ein Array ohne mein Wissen? ex³ PHP-Programmierung 5 12.09.2007 18:57
Frage zum Tut: [PHP] Fremde Webseiten auslesen the_cRu PHP-Programmierung 27 10.02.2007 19:59
[PHP] Eine Einführung in die Rekursion Jojo Tutorials 8 11.03.2006 22:11
[PHP] Ein einfaches Template-System MrNiceGuy Tutorials 0 09.10.2005 18:30
Drag and Drop? Java17 Desktop-Applikationen und Grafik 15 05.05.2005 10:59


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:31 Uhr.


Powered by vBulletin® Version 3.7.3 (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