Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 1 PEAR – Einführung
  gp 1.1 Objektorientierung in PHP
    gp 1.1.1 Spezielle Methoden
    gp 1.1.2 Erweitern von Klassen
    gp 1.1.3 Statische Methoden
    gp 1.1.4 Factory-Methoden
    gp 1.1.5 Zuweisen von Objekten
    gp 1.1.6 Objektorientierung in PHP 4
  gp 1.2 PEAR – ein Überblick
    gp 1.2.1 Die PEAR-Website
    gp 1.2.2 Auswahl von Paketen
  gp 1.3 Installation von PEAR-Paketen
    gp 1.3.1 Installation über die Kommandozeile
    gp 1.3.2 Installation über eine grafische Oberfläche
    gp 1.3.3 Nutzung auf einem Shared Server
    gp 1.3.4 Allgemeines zur Nutzung von Paketen
    gp 1.3.5 Fehlerbehandlung
    gp 1.3.6 Unterstützung
    gp 1.3.7 Bugs
  gp 1.4 Der PEAR-Coding Standard
    gp 1.4.1 Aufbau der Dateien
    gp 1.4.2 Klammersetzung
    gp 1.4.3 Namenskonvention

1 PEAR – Einführung

Auch wenn dieses Kapitel mit »Einführung« überschrieben ist, sollten Sie es nicht einfach überspringen. Sie finden hier einige Hilfestellungen und Tipps und Tricks im Umgang mit PEAR. Insbesondere die Informationen zum Coding-Standard und zur Fehlerbehandlung können sehr hilfreich sein.


Rheinwerk Computing

1.1 Objektorientierung in PHP  downtop

Alle PEAR-Pakete sind objektorientiert programmiert. Sollten Sie noch nie objektorientiert gearbeitet haben, ist das nicht weiter schlimm. Auf den folgenden Seiten finden Sie eine kleine Einführung in die objektorientierte Programmierung. Es ist keine komplette Einführung, sondern soll Ihnen nur die Grundzüge vermitteln, so dass PEAR und die Beispiele im Buch verständlich sind.

Ein Objekt fasst alle Informationen und Operationen zusammen, die für einen bestimmten Vorgang notwendig sind. Gehen Sie beispielsweise von einem Shop-System aus: Jeder der Kunden legt seine Waren in einem Einkaufswagen ab. Jeder Einkaufswagen benötigt bestimmte Funktionalitäten. Er muss Waren speichern können und sie auf dem Bildschirm ausgeben können. Des Weiteren muss es auch möglich sein, Waren hinzuzufügen und sie wieder zu entnehmen. Diese Funktionalitäten benötigt jedes Einkaufswagen-Objekt.

Daher wäre es wenig sinnvoll, diese Funktionalitäten für jeden Einkaufswagen neu zu programmieren. Es wäre viel sinnvoller, eine »Schablone« zu erstellen, die als Grundlage für jeden Einkaufswagen herangezogen wird.

Und genau das wird in der objektorientierten Programmierung gemacht. Es wird eine so genannte Klasse erstellt. Diese beinhaltet alle Definitionen, die jeder einzelne Einkaufswagen benötigt. Um einen Einkaufswagen nutzen zu können, wird ein Objekt aus der Klasse abgeleitet. Man spricht auch davon, dass es instanziiert wird. Ist die Klasse selbst noch sehr abstrakt, so bezieht sich ein Objekt immer auf einen konkreten Vorgang oder Datenbestand.

// Definition der Klasse 
class shoppingCart 
{ 
   // Definitionen 
} 
 
// Ableiten eines konkreten Objekts, um damit zu arbeiten 
$myCart = new shoppingCart();

Die Definition einer Klasse wird immer mit dem Schlüsselwort class eingeleitet. Danach folgt der Name der Klasse, der frei wählbar ist. Hierbei gelten dieselben Vorschriften wie für die Wahl eines Variablennamens. Zwischen dem Paar geschweifter Klammern, das sich danach öffnet, folgt die eigentliche Definition der Klasse.

Um mit der Klasse arbeiten zu können, muss ein konkretes Objekt genutzt werden. Dieses wird dadurch abgeleitet, dass Sie einer Variable das Objekt zuweisen. Das Objekt erhalten Sie dadurch, dass Sie das Schlüsselwort new nutzen und dahinter den Namen der Klasse notieren.

Eine Klasse besteht aus verschiedenen Teilen, die das Objekt erbt. Hierbei wird zwischen Eigenschaften und Methoden unterschieden.

Eigenschaften sind Variablen, die in dem Objekt Werte speichern können. Bezogen auf den Einkaufswagen könnte es sich beispielsweise um die Kundennummer oder die Anzahl der Artikel in dem Einkaufswagen handeln.

Bei Methoden handelt es sich um Funktionen, die zu der Klasse gehören und etwas mit dem Objekt tun oder damit kommunizieren können. Daher werden Methoden auch schon mal als Member-Funktionen bezeichnet. Das nachfolgende Beispiel verdeutlicht das:

// Definition der Klasse 
class shoppingCart 
{ 
   // Definition von Eigenschaften 
   public $kundennummer; 
   protected $artikel_liste = array(); 
 
   // Definition von Methoden 
   // Definition des Konstruktors 
   public function __construct($kundennummer) 
   { 
      $this->kundennummer=$kundennummer; 
   } 
 
   // Methode, um einen Artikel hinzuzufuegen 
   public function addArticle ($nummer, $bezeichnung, $anzahl, 
                                                       $preis) 
   { 
      if (true == isset ($this->artikel_liste[$nummer])) 
      { 
         $this->artikel_liste[$nummer]['anzahl']+=$anzahl; 
      } 
      else 
      { 
         $this->artikel_liste[$nummer]['bezeichnung']= 
                                                 $bezeichnung; 
         $this->artikel_liste[$nummer]['anzahl']=$anzahl; 
         $this->artikel_liste[$nummer]['preis']=$preis; 
      } 
   } 
 
   //Methode zum Ausgeben des Warenkorbs 
   public function showCart() 
   { 
      if (0== count ($this->artikel_liste)) 
      { 
         echo "keine Waren enthalten"; 
      } 
      else 
      { 
         $summe=0; 
         echo "<table border='1'>"; 
         foreach ($this->artikel_liste as $daten) 
         { 
            echo "<tr><td>$daten[bezeichnung]</td>"; 
            echo "<td>$daten[anzahl]</td>"; 
            echo "<td>$daten[preis]</td>"; 
            $gesamt = $daten['preis']*$daten['anzahl']; 
            echo "<td>$gesamt</td></tr>"; 
            $summe+=$gesamt; 
         } 
         echo "<tr><td colspan='3'> 
                       Summe</td><td>$summe</td></tr>"; 
         echo "</table>"; 
      } 
   } 
 
   // Weitere Methoden 
} 
 
// Ableiten eines konkreten Objekts und 
// Setzen der Kundennummer 
$myCart = new shoppingCart(1262); 
 
// Artikel hinzufuegen 
$myCart->addArticle(2,'Schuhe', 3, 64.80); 
$myCart->addArticle(1,'Jacke', 5, 52.79); 
 
// direkte Ausgabe einer Eigenschaft 
echo "Kundennummer: $myCart->kundennummer<br />"; 
// Ausgabe des Einkaufswagens 
$myCart->showCart();

Listing 1.1 Definition einer Klasse mit PHP 5

In Listing 1.1 wurden bei der Definition der Klasse zwei Eigenschaften definiert:

public $kundennummer; 
protected $artikel_liste = array();

$kundennummer dient dazu, die Kundennummer zu speichern, und in $artikel_liste werden die Artikel gespeichert, die der Kunde in seinen Einkaufswagen gelegt hat. Die Eigenschaften sind mit den Zugriffs- bzw. Sichtbarkeitsmodifikatoren protected und public versehen. Hiermit wird sichergestellt, dass der Programmierer nur auf bestimmte Teile des Objekts zugreifen kann. Im Hauptprogramm findet sich beispielsweise diese Zeile:

echo "Kundennummer: $myCart->kundennummer<br />";

Der Zugriff auf eine Eigenschaft, die zu einem Objekt gehört, erfolgt dadurch, dass der Name des Objekts notiert wird, worauf ein -> und der Name der Eigenschaft folgen. Auch wenn eine Eigenschaft eine Art Variable ist, darf direkt vor dem Namen der Eigenschaft kein Dollarzeichen stehen. In diesem Fall wird die Kundennummer direkt ausgegeben. Das ist aber nur deswegen möglich, weil die Eigenschaft als public deklariert ist. Wäre sie protected, würde diese Vorgehensweise zu einer Fehlermeldung führen. Eine Eigenschaft, die als public deklariert ist, kann wie eine normale Variable genutzt werden. Somit können Sie ihr auch einen neuen Wert zuweisen:

$myCart->kundennummer=12111;

Ist sie als protected deklariert, so können nur Methoden der eigenen Klasse auf sie zugreifen. Das würde übrigens auch gelten, wenn private davor stehen würde. Dazu später mehr. Die Member-Funktion addArticle() greift beispielsweise auf die Eigenschaft artikel_liste zu. Sie dient dazu, dem Warenkorb einen Artikel hinzuzufügen. Sie bekommt die notwendigen Daten wie Artikelnummer, Bezeichnung, Preis etc. übergeben und legt den Datensatz in der Eigenschaft artikel_liste ab. Um aus einer Methode heraus auf eine Eigenschaft zuzugreifen, kann nicht der Name des Objekts genutzt werden, da die Namen der Objekte ja noch nicht bekannt sind, wenn die Klasse deklariert wird. Um dieses Problem zu umgehen, ist die Pseudovariable $this deklariert. Nutzen Sie in einer Methode $this, so wird damit das Objekt (nicht die Klasse) bezeichnet, zu dem die Methode gehört.

Auch bei der Deklaration der Methoden finden Sie die Modifikatoren private und protected. Damit werden die Zugriffsberechtigungen auf die Methoden gesteuert. Nach dem Modifikator folgen das Schlüsselwort function, der Name der Funktion und die Parameterliste. Auch hier ist protected ein möglicher Zugriffsmodifikator. Die Deklaration einer Methode ist der Deklaration einer normalen Funktion also sehr ähnlich. Um eine Methode aufzurufen, nutzen Sie dieselbe Notation wie beim Zugriff auf Eigenschaften.

$myCart->addArticle(2,'Schuhe', 3, 64.80);

Rheinwerk Computing

1.1.1 Spezielle Methoden  downtop

Ihnen ist vielleicht aufgefallen, dass ich eine Methode namens __construct() deklariert habe, sie aber nicht aufrufe. Nein, das habe ich nicht vergessen. Vielmehr handelt es sich hierbei um den Konstruktor. Diese Methode wird automatisch aufgerufen, wenn ein neues Objekt instanziiert, also abgeleitet, wird. Die Parameter, die der Konstruktor erwartet, in diesem Fall also die Kundennummer, werden beim Ableiten des Objekts direkt übergeben.

$myCart = new shoppingCart(1262);

Der Konstruktor wird klassischerweise dazu genutzt, Objekte zu initialisieren, eine Datenbankverbindung aufzubauen oder Konfigurationsdaten auszulesen.

Verwandt mit dem Konstruktor ist der Destruktor. Hierbei handelt es sich um eine Methode, die den Namen __destruct() hat. Ihr können keine Parameter übergeben werden, und sie wird automatisch ausgeführt, wenn die Lebenszeit des Objekts endet, das heißt, wenn es mit unset() »zerstört« wird oder wenn das Script endet. [Dass ein Destruktor bei Ende des Scripts automatisch ausgeführt wird, ist erst seit PHP 5.0.2 implementiert. ]

Zwei weitere spezielle Methoden, die im Verlauf dieses Buches benutzt werden, sind __get() und __set(). Hierbei handelt es sich um so genannte Interceptor-Methoden. __set() wird dann aufgerufen, wenn Sie eine Eigenschaft, die nicht definiert ist, mit einem Wert belegen wollen, und __get() wird ausgeführt, wenn eine solche nicht deklarierte Eigenschaft ausgelesen werden soll. Die Nutzung dieser Methoden erscheint auf den ersten Blick sicher nicht sonderlich sinnvoll. Sie sind aber gut zu gebrauchen, wenn Sie Objekte nutzen, bei denen anfangs nicht bekannt ist, wie viele Werte sie aufnehmen sollen oder welche Struktur diese Werte haben.

class myClass 
{ 
   private $data; 
   public function __set($name, $wert) 
   { 
      $this->data[$name]=$wert; 
   } 
 
   public function __get($name) 
   { 
      return $this->data[$name]; 
   } 
} 
 
$myObj = new myClass; 
$myObj->eigenschaft=10; 
echo $myObj->eigenschaft;

Listing 1.2 Nutzung von __get(  ) und __set(  )

Die Methode __set() muss zwei Parameter akzeptieren. Der erste ist der Name der Eigenschaft und der zweite der dazugehörige Wert. __get() hingegen bekommt nur den Namen der Eigenschaft als Parameter übergeben.


Rheinwerk Computing

1.1.2 Erweitern von Klassen  downtop

In einigen Fällen ist es nötig, eine Klasse zu erweitern. Das heißt, eine bereits deklarierte Klasse wird als Grundlage genutzt, und darauf aufbauend wird eine neue Klasse erstellt. Man spricht auch an dieser Stelle davon, dass eine Klasse aus einer anderen abgeleitet wird.

Möchten Sie beispielsweise die bestehende Klasse für den Einkaufswagen aus Listing 1.1 um eine zusätzliche Eigenschaft erweitern, könnte das so aussehen:

class newCart extends shoppingCart 
{ 
   // Zusaetzliche Eigenschaft 
   private $istMitarbeiter; 
 
   // Neuer Konstruktor 
   public function __construct($mitarbeiter, $nummer) 
   { 
      $this->istMitarbeiter=$mitarbeiter; 
      parent::__construct($nummer); 
   } 
}

Die Klasse newCart stellt also wirklich nur eine Erweiterung der Klasse shoppingCart dar. Sie erbt alle Eigenschaften und Methoden der Klasse shoppingCart. shoppingCart ist die Elternklasse, die auch als Superklasse bezeichnet wird, und newCart ist die Kind- oder Subklasse.

Die Eigenschaften und Methoden werden allerdings nur dann vererbt, wenn sie als public oder protected deklariert sind. Ist etwas als private deklariert, so wird es nicht vererbt.

Der Konstruktor von shoppingCart wird in der Kindklasse überschrieben. Der Sinn dahinter ist, dass die neu hinzugefügte Eigenschaft beim Ableiten eines Objekts direkt mit einem Wert belegt werden soll. Würde hier kein Konstruktor deklariert, würde der Konstruktor der Elternklasse genutzt.

Um zu verhindern, dass Code doppelt geschrieben werden muss, wird der Konstruktor der Elternklasse allerdings mithilfe von parent::__construct() aufgerufen. Das Schlüsselwort parent stellt immer einen Bezug zur Elternklasse her.


Rheinwerk Computing

1.1.3 Statische Methoden  downtop

Eine statische Methode ist eine Methode, die aufgerufen werden kann, ohne dass ein Objekt abgeleitet wird. Es gibt einige Klassen innerhalb des PEAR-Projekts, die viel mit statischen Methoden arbeiten. Diese Vorgehensweise wird häufig genutzt, wenn nur eine einzelne Methode genutzt wird. In dem Fall wäre der Aufwand, ein Objekt abzuleiten, unter Umständen zu groß. Würde es beispielsweise eine Klasse Math geben, in der eine Methode definiert wäre, die Ihnen die Zahl p zurückliefert, könnte der Aufruf so aussehen:

$pi = Math::pi();

Es wird also erst der Name der Klasse angegeben, danach folgt der Scope-Operator. Dieser doppelte Doppelpunkt, der in PHP auch als Paamayim Nekudotayim [Es handelt sich dabei um den hebräischen Namen des Operators. Hebräisch deswegen, weil Zeev Suraski und Andi Gutmans Israelis sind. ] bezeichnet wird, teilt PHP mit, dass die nachfolgende Methode in der vorgenannten Klasse deklariert ist.

Da die Klasse aufgerufen wird, ohne dass ein Objekt instanziiert wurde, ist es bei statischen Methoden natürlich auch nicht möglich, auf die Pseudo-Variable $this zuzugreifen.


Rheinwerk Computing

1.1.4 Factory-Methoden  downtop

Eine spezielle Form eines statischen Methodenaufrufs ist die Nutzung von Factory-Methoden. Eine Factory-Methode wird meistens dann genutzt, wenn nicht von vornherein klar ist, welche Art von Objekt Sie benötigen. Auch das mag sich ein wenig kurios anhören, aber es passiert öfter, als Sie vielleicht denken werden.

Wenn Sie beispielsweise eine Klasse nutzen, die mit verschiedenen Arten von Datenbanken arbeiten soll, wäre es natürlich möglich, die Quelltexte für die Datenbanken in einer einzelnen großen Klasse abzulegen. Das hätte allerdings den Nachteil, dass immer der gesamte Code geladen werden muss. Darin wäre dann natürlich auch der Code für die Datenbanken enthalten, die nicht genutzt werden. Daher finden Sie in PEAR häufig Konstrukte wie diese:

// Klasse mit allgemeinen Datenbank-Funktionen 
class DbCommon 
{ 
   // Eigenschaft zum Speichern der Verbindung 
   protected $con=0; 
 
   //Methode zum Testen, ob eine Verbindung vorhanden ist 
   public function isConnected() 
   { 
      return is_resource($this->con); 
   } 
} 
 
// Klasse fuer die Arbeit mit MySQL 
class DbMysql extends DbCommon 
{ 
   public function __construct($server, $user, $password) 
   { 
      $this->con=mysql_connect($server,$user,$password); 
      return $this->isConnected(); 
   } 
   // Weitere Methoden 
} 
 
// Klasse fuer die Arbeit mit MSSQL 
class DbMssql extends DbCommon 
{ 
   public function __construct($server, $user, $password) 
   { 
      $this->con=mssql_connect($server,$user,$password); 
      return $this->isConnected(); 
   } 
   // Weitere Methoden 
} 
 
// Klasse mit der Factory-Methode 
class DB 
{ 
   // Factory-Methode 
   public function factory ($db, $server, $user, $password) 
   { 
     //Konstruktion des Klassennamens und Ableiten des Objekts 
      $class = "Db{$db}"; 
      if (class_exists($class)) 
      { 
         return new $class ($server, $user, $password); 
      } 
      else 
      { 
         die ("Klasse existiert nicht"); 
      } 
   } 
} 
 
// Nutzung der Factory-Methode 
$db = DB::factory('Mysql','localhost','user','geheim');

Listing 1.3 Nutzung einer Factory-Methode

Mit Listing 1.3 wird eine Klasse implementiert, die mit zwei unterschiedlichen Datenbank-Architekturen arbeiten kann. Beim Aufruf der Methode factory() wird als erster Parameter der Name des Datenbanktyps übergeben, mit dem gearbeitet werden soll. In der Factory-Methode wird der Name der zu verwendenden Klasse dann dynamisch konstruiert, und es wird ein entsprechendes Objekt abgeleitet und zurückgegeben. Die Klassen DbMssql und DbMysql stellen beide Kindklassen von DbCommon dar. In DbCommon sind in diesem Fall Methoden und Eigenschaften definiert, die alle Kindklassen benötigen. In den eigentlichen Datenbankklassen müssen identische Methoden deklariert sein. In diesem Fall handelt es sich dabei nur um __construct(). Diese Methode ist in beiden Klassen mit identischem Verhalten deklariert, so dass es »nach außen« keinen Unterschied macht, mit welcher Klasse gearbeitet wird. Wären hier noch weitere Methoden deklariert, müssten diese auch in beiden Klassen identisch sein, wobei natürlich mit unterschiedlichen Datenbanken gearbeitet wird.

Durch diese Vorgehensweise kann es Ihnen als Anwender eines Pakets egal sein, welche Klasse im Hintergrund ihr Werk verrichtet. Sie teilen einfach nur der Factory-Klasse mit, welche Datenbank Sie nutzen möchten, und der Rest passiert im Verborgenen.

Bei den meisten PEAR-Paketen ist jede der Klassen noch in eine eigene Datei ausgelagert. Somit muss nur die Klasse eingebunden werden, die Sie gerade benötigen, und es wird kein Speicherplatz verschwendet.


Rheinwerk Computing

1.1.5 Zuweisen von Objekten  downtop

Bitte betrachten Sie die folgenden Zeilen:

$obj = new meineKlasse(); 
$obj->wert = 3; 
$obj2 = $obj; 
$obj2->wert = 42; 
echo $obj->wert; 
// Gibt 42 aus

Der Eigenschaft wert, die in der Klasse meineKlasse definiert ist, wird der Wert 3 zugewiesen.

Danach wird der Variable $obj2 das Objekt $obj zugewiesen, und in $obj2 wird die Eigenschaft wert mit der Zahl 42 belegt. Wenn Sie jetzt die Eigenschaft wert von $obj ausgeben lassen, sollte man erwarten, dass die Zahl 3 ausgegeben wird. Das ist aber nicht der Fall. Es wird 42 ausgegeben. Der Grund dafür liegt darin, dass die Zeile

$obj2 = $obj;

in $obj2 keine Kopie ablegt, sondern nur eine Referenz. Das heißt, es wird nur ein Verweis auf das ursprüngliche Objekt abgelegt. Somit verweisen $obj und $obj2 beide auf dasselbe Objekt im Arbeitsspeicher.

Möchten Sie unter PHP 5 ein Objekt kopieren, um wirklich zwei voneinander unabhängige Instanzen zu erhalten, müssen Sie das Schlüsselwort clone vor das Ursprungsobjekt setzen. Mit

$obj2 = clone $obj;

wären im obigen Code also zwei komplett unabhängige Objekte vorhanden, und die Ausgabe in der letzten Zeile würde auch 3 und nicht 42 ausgeben.


Rheinwerk Computing

1.1.6 Objektorientierung in PHP 4  toptop

Alle Beispiele in diesem Buch basieren auf PHP 5 und wurden unter PHP 5 getestet. Sollten Sie noch PHP 4 nutzen, sollte das momentan noch kein Problem darstellen. Fast alle PEAR-Klassen sind noch PHP 4-kompatibel.

Da es aber gerade bei der Objektorientierung einige Änderungen beim Wechsel von PHP 4 nach PHP 5 gab, möchte ich kurz darauf eingehen.

Sichtbarkeit

In PHP 4 waren die Schlüsselwörter public, private und protected noch nicht definiert. Möchten Sie eine Eigenschaft deklarieren, so wird die Deklaration mit dem Schlüsselwort var eingeleitet. Bei der Deklaration von Methoden entfällt das Schlüsselwort einfach, so dass nur function und der Name der Funktion übrig bleiben. Die Eigenschaften und Methoden werden dann als public betrachtet.

class myClassPhp4 
{ 
   var $eigenschaft; 
   function tuWas() 
   {} 
}

Um deutlich zu machen, dass einige Methoden oder Eigenschaften nicht direkt genutzt werden sollen, haben die Entwickler die entsprechenden Namen meist mit einem Unterstrich eingeleitet. _tuWas() könnte also beispielsweise der Name einer Methode sein, die als private bzw. protected eingestuft werden soll.

Besondere Methoden

PHP 4 kennt nur Konstruktoren, aber keine Destruktoren und auch nicht die magischen Interceptor-Methoden __get() und __set(). Das stellt glücklicherweise aber kein großes Problem dar. Destruktoren werden an keiner Stelle dieses Buchs zwingend benötigt. Sie machen das Leben nur hier und da einfacher. Sie können fast immer auch ohne __get() und __set()auskommen. Sollten Sie eine der beiden Interceptor-Methoden zwingend benötigen, gibt es in PHP 4 leider keine Alternative.

Konstruktoren sind in PHP 4 auch definiert. Allerdings haben diese nicht den vereinheitlichten Namen __construct(), sondern sie müssen den Namen der Klasse tragen. Existiert eine Methode, die den gleichen Namen hat wie die Klasse, wird sie automatisch bei der Instanziierung eines Objekts ausgeführt.

Kopien

Der vielleicht wichtigste Unterschied zwischen PHP 4 und 5 besteht in diesem Fall darin, dass PHP 4 beim Zuweisen eines Objekts an eine Variable standardmäßig eine Kopie erstellt hat und keine Referenz übergeben hat. Das heißt, in dem Beispiel

$obj = new meineKlasse(); 
$obj->wert = 3; 
$obj2 = $obj; 
$obj2->wert = 42;

hätten die Eigenschaften der $obj- und $obj2-Objekte wirklich unterschiedliche Werte, weil es sich um unterschiedliche Objekte handelt. In PEAR wird allerdings oft eine Referenz auf ein Objekt benötigt. Das hat in den meisten Fällen den Grund, dass eine Arbeit mit Kopien deutlich mehr Arbeitsspeicher benötigt. Dazu kommt aber noch, dass in vielen Fällen wirklich ein Zugriff auf das ursprüngliche Objekt möglich sein muss und eine Kopie zu einem Fehlverhalten führen würde. Um einer Variable eine Referenz auf ein bestehendes Objekt zuzuweisen, nutzen Sie nicht nur ein einfaches Gleichheitszeichen, sondern Sie setzen noch ein Et-Zeichen (kaufmännisches Und) vor das Ursprungsobjekt. Mit

$obj2 = &$obj;

wäre also wieder nur ein Objekt vorhanden, und beide Variablen würden dasselbe Objekt bezeichnen.

 <<   zurück
     
  Zum Katalog
Zum Katalog: PHP PEAR
PHP PEAR
Jetzt bestellen!
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de