PHP Handbuch

Stig Sæther Bakken
Alexander Aulbach
Egon Schmid
Jim Winstead
Lars Torben Wilson
Rasmus Lerdorf
Andrei Zmievski
Jouni Ahto

Herausgegeben von

Egon Schmid
Bei der Übersetzung wirkten mit:
Sebastian Bergmann
Friedhelm Betz
Cornelia Boenigk
Wolfgang Drews
Ralf Ebert
Thomas Fromm
Stefan Hanauska
Johann-Peter Hartmann
Hartmut Holzgraefe
Martin Jansen
Michael Kaiser
Mark Kronsbein
Hakan Kücükyilmaz
Sven Lauer
Jan Lehnardt
Sebastian Nohn
Tobias Orterer
Catharina Paulsen
Peter Petermann
Sebastian-H. Picklum
Georg Richter
Stefan Saasen
Martin Samesch
Egon Schmid
Thomas Schöfbeck
Holger Schranz
Thomas Schürmann
Uwe Steinmann
Christian Ullrich
Mark Wiesemann

18-04-2003

Copyright

This manual is © Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 by the PHP Documentation Group. Dieses Handbuch ist urheberrechtlich geschützt. Die Mitglieder der PHP-Dokumentationsgruppe sind auf dem Titelblatt aufgeführt.

Dieses Handbuch kann unter den Bedingungen der GNU General Public License, welche von der Free Software Foundation veröffentlicht wurde, weiterverteilt werden. Es ist entweder die Version 2 oder eine neuere Version der Lizenz zu benutzen.

Das Kapitel 'Extending PHP 4.0' ist © 2000 by Zend Technologies, Ltd. Dieses Material kann unter den Bedingungen der Open Publication License, v1.0 oder neuer (die aktuellste Version ist unter http://www.opencontent.org/openpub/ erhältlich) verteilt werden.


Inhaltsverzeichnis
Vorwort
I. Einführung
1. Einleitung
2. Kleines Tutorial
3. Installation
4. Konfiguration
5. Sicherheit
II. Sprachreferenz
6. Grundlagen der Syntax
7. Typen
8. Variablen
9. Konstanten
10. Ausdrücke
11. Operatoren
12. Kontroll-Strukturen
13. Funktionen
14. Klassen und Objekte
15. Referenzen in PHP
III. Features
16. HTTP-Authentifizierung mit PHP
17. Cookies
18. Steuerung von Dateiuploads
19. Zugriff auf entfernte Dateien
20. Verbindungssteuerung
21. Persistente Datenbankverbindungen
22. Safe Mode
23. Using PHP from the command line
IV. Funktionsreferenz
I. Apache-spezifische Funktionen
II. Array Funktionen
III. Aspell Funktionen [veraltet]
IV. Mathematische Funktionen mit beliebiger Genauigkeit
V. Bzip2 Komprimierungsfunktionen
VI. Kalender-Funktionen
VII. CCVS API Funktionen
VIII. COM Support Funktionen für Windows
IX. Klassen- und Objekt-Funktionen
X. ClibPDF Funktionen
XI. Crack Funktionen
XII. CURL, Client URL Library Functions
XIII. Cybercash Bezahl Funktionen
XIV. Crédit Mutuel CyberMUT functions
XV. Cyrus IMAP administration functions
XVI. Character type functions
XVII. dba Datenbank (dbm-style) Abstraktions-Funktionen
XVIII. Datums- und Zeit-Funktionen
XIX. dBase Funktionen
XX. DBM Datenbankfunktionen
XXI. dbx Funktionen
XXII. DB++ Functions
XXIII. Direkte Ein-/Ausgabe Funktionen
XXIV. Verzeichnis-Funktionen
XXV. DOM XML Funktionen
XXVI. .NET Funktionen
XXVII. Error Handling and Logging Functions
XXVIII. FrontBase Funktionen
XXIX. filePro Funktionen
XXX. Funktionen des Dateisystems
XXXI. Forms Data Format Funktionen
XXXII. FriBiDi Funktionen
XXXIII. FTP-Funktionen
XXXIV. Function Handling functions
XXXV. GNU Gettext
XXXVI. GMP functions
XXXVII. HTTP functions
XXXVIII. Hyperwave functions
XXXIX. Hyperwave API functions
XL. iconv Funktionen
XLI. Grafik-Funktionen
XLII. IMAP, POP3 und NNTP Funktionen
XLIII. Informix Funktionen
XLIV. InterBase-Funktionen
XLV. Ingres II Funktionen
XLVI. IRC Gateway Funktionen
XLVII. Java
XLVIII. LDAP Funktionen
XLIX. Mail Funktionen
L. mailparse functions
LI. Mathematische Funktionen
LII. Multi-Byte String Functions
LIII. MCAL Funktionen
LIV. Mcrypt Encryption Functions
LV. MCVE Payment Functions
LVI. Hash Funktionen
LVII. Mimetype Functions
LVIII. Microsoft SQL Server Funktionen
LIX. Ming functions for Flash
LX. Sonstige Funktionen
LXI. mnoGoSearch Funktionen
LXII. mSQL Funktionen
LXIII. MySQL Funktionen
LXIV. Mohawk Software Session Handler Funktionen
LXV. muscat functions
LXVI. Netzwerk Funktionen
LXVII. Ncurses terminal screen control functions
LXVIII. Lotus Notes functions
LXIX. ODBC Funktionen
LXX. Object Aggregation/Composition Functions
LXXI. Oracle 8 Funktionen
LXXII. OpenSSL Funktionen
LXXIII. Oracle Funktionen
LXXIV. Ovrimos SQL functions
LXXV. Funktionen zur Ausgabesteuerung
LXXVI. Object property and method call overloading
LXXVII. PDF Funktionen
LXXVIII. Verisign Payflow Pro Funktionen
LXXIX. PHP Optionen und Informationen
LXXX. POSIX Funktionen
LXXXI. PostgreSQL Funktionen
LXXXII. Process Control Functions
LXXXIII. Funktionen zur Programmausführung
LXXXIV. Printer functions
LXXXV. Pspell Funktionen
LXXXVI. GNU Readline
LXXXVII. GNU Recode Funktionen
LXXXVIII. Regular Expression Functions (Perl-Compatible)
LXXXIX. qtdom functions
XC. Reguläre Ausdrücke Funktionen (POSIX erweitert)
XCI. Semaphor und Shared Memory Funktionen
XCII. SESAM Datenbankfunktionen
XCIII. Session Funktionen
XCIV. Shared Memory Funktionen (Gemeinsamer Speicher)
XCV. Shockwave Flash Funktionen
XCVI. SNMP Funktionen
XCVII. Socket Funktionen
XCVIII. Stream functions
XCIX. String-Funktionen
C. Sybase functions
CI. Tokenizer functions
CII. URL Funktionen
CIII. Variablen-Funktionen
CIV. vpopmail functions
CV. W32api functions
CVI. WDDX Funktionen
CVII. XML parser functions
CVIII. XML-RPC functions
CIX. XSLT Funktionen
CX. YAZ functions
CXI. YP/NIS Funktionen
CXII. ZIP Funktionen (Lesezugriff)
CXIII. Zlib Komprimierungsfunktionen
V. Zend API
24. Overview
25. Extension Possibilities
26. Source Layout
27. PHP's Automatic Build System
28. Creating Extensions
29. Using Extensions
30. Troubleshooting
31. Source Discussion
32. Accepting Arguments
33. Creating Variables
34. Duplicating Variable Contents: The Copy Constructor
35. Returning Values
36. Printing Information
37. Startup and Shutdown Functions
38. Calling User Functions
39. Initialization File Support
40. Where to Go from Here
41. Reference: Some Configuration Macros
42. API Macros
VI. PHP API: Schnittstellen für Programmierer
43. Streams API for PHP Extension Authors
VII. FAQ: Frequently Asked Questions
44. Allgemeine Informationen
45. Mailing-Listen
46. Obtaining PHP
47. Database issues
48. Installation
49. Probleme bei der Compilierung
50. PHP benutzen
51. PHP und HTML
52. PHP and COM
53. PHP und andere Sprachen
54. Von PHP 2 auf PHP 3 umsteigen
55. Von PHP 3 auf PHP 4 umsteigen
56. Verschiedene Fragen
VIII. Anhang
A. Die Geschichte von PHP und verwandten Projekten
B. Migrating from PHP 3 to PHP 4
C. Migration von PHP/FI 2.0 zu PHP 3.0
D. Der PHP-Debugger
E. Extending PHP
F. Liste der Funktion Aliase
G. Reservierte Schlüsselwörter in PHP
H. Liste von Ressourcentypen
I. List of Supported Protocols/Wrappers
J. List of Parser Tokens
K. Über das Handbuch
L. Fehlendes

Vorwort

PHP ist die Abkürzung für "PHP: Hypertext Preprocessor", eine weitverbreitete Open Source Skriptsprache speziell für Webentwicklungen. PHP läßt sich in HTML einbinden. Seine Syntax erinnert an C, Java und Perl und es ist einfach zu erlernen. Das Hauptziel dieser Sprache ist es, Webentwicklern die Möglichkeit zu geben, schnell dynamisch generierte Webseiten zu erzeugen. Aber PHP kann noch mehr.

Dieses Handbuch besteht vorranging aus einer Funktionsreferenz, enthält aber zusätzlich auch eine Sprachreferenz, Erklärungen zu den wichtigsten Features und anderen ergänzenden Informationen.

Sie können dieses Handbuch in verschiedenen Formaten unter http://www.php.net/docs.php herunterladen. Die Downloads werden aktualisert sobald sich der Inhalt verändert. Weitere Informationen wie dieses Handbuch erstellt wird finden Sie im Anhang unter dem Kapitel 'Über dieses Handbuch'.

I. Einführung


Kapitel 1. Einleitung

Was ist PHP?

PHP PHP (Akronym für "PHP: Hypertext Preprocessor") ist eine weit verbreitete und für den allgemeinen Gebrauch bestimmte Open Source Skriptsprache, welche speziell für die Webprogrammierung geeignet ist, und in HTML eingebettet werden kann.

Hört sich einfach an, aber was heißt es genau? Ein Beispiel:

Beispiel 1-1. Ein einleitendes Beispiel

<html>
    <head>
        <title>Beispiel</title>
    </head>
    <body>

        <?php 
        echo "Hallo, ich bin ein PHP-Skript!"; 
        ?>

    </body>
</html>

Beachten Sie den Unterschied zu einem Skript, welches in anderen Sprachen wie Perl oder C geschrieben wurde -- anstatt ein Programm mit vielen Anweisungen zur Ausgabe von HTML zu schreiben, schreibt man einen HTML-Code mit einigen eingebetteten Anweisungen, um etwas auszuführen (z.B. um - wie oben - Text auszugeben). Der PHP-Code steht zwischen speziellen Anfangs- und Schlusstags, mit denen man in den PHP-Modus und zurück wechseln kann.

Was PHP von clientseitigen Sprachen wie Javaskript unterscheidet, ist dass der Code auf dem Server ausgeführt wird. Sollten Sie ein Skript wie das obige auf ihrem Server ausführen, würde der Besucher nur das Ergebnis empfangen, ohne die Möglichkeit herauszufinden, wie der zugrundeliegende Code aussieht. Sie können ihren Webserver auch anweisen, alle ihre HTML-Dateien mit PHP zu parsen, denn dann gibt es wirklich nichts, das dem Benutzer sagt, was sie in petto haben.

Das Beste an der Verwendung von PHP ist, dass es für Neulinge extrem simpel ist, aber auch einen riesigen Funktionsumfang für den professionellen Programmierer bietet. Scheuen Sie sich nicht, die lange Liste der PHP-Funktionen zu lesen. Sie können einsteigen, und binnen weniger Stunden bereits mit dem Schreiben von einfachen Skripten beginnen.

Auch wenn die Entwicklung von PHP auf serverseitige Skripte fokussiert ist, können Sie mit PHP weitaus mehr anstellen. Lesen Sie mehr im Abschnitt Was kann PHP?


Was kann PHP?

Alles. PHP ist hauptsächlich auf serverseitige Skripte fokussiert, weshalb Sie alles tun können, was auch ein anderes CGI Programm kann, wie z.B. Formulardaten sammeln, dynamische Inhalte für Websites generieren oder Cookies senden und empfangen. Aber PHP kann noch viel mehr.

Es gibt drei Hauptgebiete, in denen PHP Skripte genutzt werden.

  • Serverseitige Skripte. Dies ist traditionelle und auch Hauptfeld von PHP. Sie benötigen dazu drei Dinge. Den PHP Parser (CGI oder Server-Modul), einen Webserver und einen Webbrowser. Sie müssen den Webserver, verbunden mit einer PHP Installation laufen lassen. Sie können Sich Ausgabe der PHP Programme über den Server mit einem Webbrowser ansehen. Für weitere Informationen lesen Sie bitte im Abschnitt Installation weiter.

  • Skripte auf der Kommandozeile. Sie können auch PHP Skripte schreiben, um sie ohne einen Server oder einen Browser laufen zu lassen. Hierfür benötigen Sie nur den PHP Parser. Diese Art der Verwendung ist für die regelmäßig auszuführende Skripte mittels cron (unter *nix oder Linux) oder dem Task Scheduler (unter Windows). Diese Skripte können auch für einfache Aufgaben zur Verarbeitung von Text verwendet werden. Weitere Informationen dazu finden Sie im Abschnitt Using PHP from the command line.

  • Schreiben clientseitiger GUI Applikationen. PHP ist wahrscheinlich nicht die allerbeste Sprache um GUI-Applikationen zu schreiben, aber wenn Sie PHP sehr gut kennen und einige weiterführende Funktionen in Ihren clientseitigen Applikationen nutzen möchten, können Sie PHP-GTK nutzen, um derartige Programme zu schreiben. Auf diese Art haben Sie auch die Möglichkeit, Plattformübergreifende Applikationen zu schreiben. PHP-GTK ist eine Erweiterung von PHP, welche in der Hauptdistribution nicht enthalten ist. Sollten Sie daran interessiert sein, besuchen Sie die PHP-GTK Website.

PHP kann auf allen gängigen Betriebssystemen verwendet werden, inkl. Linux, vielen Unix-Varianten (inkl. HP-UX, Solaris und OpenBSD), Microsoft Windows, Mac OS X, RISC OS, und wahrscheinlich anderen. PHP unterstützt auch die meisten der heute gebräuchlichen Webserver. Dies umfasst Apache, Microsoft Internet Information Server, Personal Web Server, Netscape und iPlanet Server, Oreilly Website Pro Server, Caudium, Xitami, OmniHTTPd, und viele andere. Für den Großteil der Server bietet PHP ein eigenes Modul, für die anderen, welche den CGI Standard unterstützen, kann PHP als CGI Prozessor arbeiten.

So haben Sie Freiheit, PHP auf dem Betriebssystem und dem Webserver Ihrer Wahl laufen zu lassen. Weiters können Sie je nach Vorliebe prozedural, objektorientiert, oder gemischt programmieren. Auch wenn in der derzeitigen Version von PHP nicht jedes Standard OOP Feature realisiert ist, sind viele Bibliotheken und große Applikationen (inklusive der PEAR Bibliothek) exklusiv unter Verwendung von OOP Code geschrieben worden.

Mit PHP sind Sie nicht auf die Ausgabe von HTML beschränkt. Seine Fähigkeiten umfassen auch das dynamische Generieren von Bildern, PDF Dateien und Flash Animationen (mittels libswf und Ming). Sie können auch leicht jede Art von Text, wie XHTML oder irgendeine andere XML Datei ausgeben. PHP kann diese Dateien automatisch generieren und im Dateisystem speichern, anstatt diese nur auszugeben bzw. auszudrucken, und formt auch serverseitigen Zwischenspeicher Ihrer dynamischen Inhalte.

Vielleicht die größte und bemerkenswerteste Stärke von PHP ist seine Unterstützung für eine breite Masse von Datenbanken. Eine datenbankgestützte Website zu erstellen ist unglaublich einfach. Die folgenden Datenbanken werden zur Zeit unterstützt:

Adabas DIngresOracle (OCI7 und OCI8)
dBaseInterBaseOvrimos
EmpressFrontBasePostgreSQL
FilePro (nur Lesezugriff)mSQLSolid
HyperwaveDirect MS-SQLSybase
IBM DB2MySQLVelocis
InformixODBCUnix dbm

Wir haben auch die Erweiterung DBX zur Datenbankabstraktion, welche Ihnen die transparente Verwendung irgendeiner von dieser Erweiterung unterstützten Datenbank erlaubt. Weiters unterstützt PHP ODBC, den Open Database Connection Standard, mit welchem Sie sich zu jeder anderen diesen Weltstandard unterstützenden Datenbank verbinden können.

PHP unterstützt auch die Kommunikation mit anderen Services, welche Protokolle wie LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (auf Windows) und unzählige andere unterstützen. Sie können auch einfache Netzwerk Sockets öffnen, und unter Verwendung irgendeines Protokolls kommunizieren. PHP unterstützt auch WDDX (Web Distributed Data Exchange) zum Austausch komplexer Daten zwischen Programmiersprachen. Da wir gerade vom Zusammenwirken sprechen: PHP bietet auch Unterstützung zur Instantiierung von Java Objekten, und deren transparente Verwendung als PHP Objekte. Sie können auch unsere CORBA Erweiterung verwenden, um auf entfernte Objekte zuzugreifen.

PHP verfügt über äußerst hilfreiche Textverarbeitungsfunktionen, von den regulären Ausdrücken (POSIX erweitert oder Perl) bis zum Parsen von XML Dokumenten. Für den Zugriff und das Parsen von XML Dokumenten unterstützen wir die Standards SAX und DOM. Sie können unsere XSLT Erweiterung verwenden, um XML Dokumente zu transformieren.

Wenn Sie PHP im Bereich des E-Commerce nutzen, werden Sie Funktionen für Cybercash Payment, CyberMUT, VeriSign Payflow Pro und CCVS für Ihre Onlineprogramme zur Zahlungsabwicklung zu schätzen lernen.

Wir haben viele andere interessante Erweiterungen, wie mnoGoSearch für Suchmaschinen, die IRC Gateway Funktionen, viele Komprimierungswerkzeuge (gzip, bz2), Kalenderumrechnung, Übersetzung...

Wie Sie sehen können, reicht diese Seite nicht aus, um alle Möglichkeiten und Vorteile von PHP aufzulisten. Lesen Sie im Abschnitt Installation weiter, und konsultieren Sie auch die Funktionsreferenz für weitere Erläuterungen der einzelnen hier erwähnten Erweiterungen.


Kapitel 2. Kleines Tutorial

Auf diesen Seiten möchten wir Ihnen die Grundlagen von PHP in einem kleinen Tutorial vorstellen. Dieser Text behandelt nur das Erstellen von dynamischen Web-Seiten, obwohl PHP natürlich nicht nur dafür geeignet ist. Weitere Informationen finden Sie im Abschnitt Was kann PHP?.

Mit PHP erweiterte Web-Seiten werden wie normale HTML-Seiten behandelt. Sie können sie genauso wie normale HTML-Seiten erstellen und bearbeiten.


Was brauche ich?

In diesem Tutorial gehen wir davon aus, dass auf Ihrem Server die PHP-Unterstützung aktiviert ist und dass die Dateiendung .php PHP zugeordnet ist. Auf den meisten Servern ist dies die Standardeinstellung für PHP-Dateien, aber fragen Sie bitte Ihren Server-Administrator, um sicherzugehen. Wenn Ihr Server PHP unterstützt, müssen Sie nichts machen. Erstellen Sie einfach Ihre .php-Dateien und legen Sie diese in Ihr Web-Verzeichnis - der Server wird sie dann für Sie parsen. Sie müssen nichts kompilieren und auch keine Zusatz-Tools installieren. Stellen Sie sich diese PHP-erweiterten Dateien wie normale HTML-Seiten mit einer ganzen Familie von "magischen" Tags, die Sie verschiedenste Dinge tun lassen, vor.

Angenommen, Sie möchten Bandbreite sparen und lokal entwickeln. In diesem Fall müssen Sie einen Webserver wie z.B. Apache und natürlich PHP installieren. Sehr empfehlenswert ist auch die Installation einer Datenbank wie z.B. MySQL. Sie können diese Programm entweder eins nach dem anderen selbst installieren oder nach einem vorkonfigurierten Paket suchen, dass automatisch alle benötigen Programme mit einigen wenigen Mausklicks installieren kann. Es ist sehr einfach, einen Webserver mit PHP-Support unter jedem Betriebssystem, wie Linux oder Windows, zu installieren. Unter Linux ist rpmfind nützlich, um RPMs zu finden.


Ihre erste PHP-erweiterte Seite

Erstellen Sie eine Datei mit dem Namen hallo.php und speichern Sie sie im Root-Verzeichnis Ihres Webservers (DOCUMENT_ROOT) mit dem folgenden Inhalt:

Beispiel 2-1. Unser erstes PHP-Skript: hallo.php

<html>
 <head>
  <title>PHP-Test</title>
 </head>
 <body>
 <?php echo "<p>Hallo Welt</p>"; ?>
 </body>
</html>

Benutzen Sie Ihren Browser, um die Datei über den Webserver-URL aufzurufen. Der URL muss mit "/halle.php" enden. Wenn Sie lokal entwickeln, sieht der URL z.B. so aus: http://localhost/hallo.php oder http://127.0.0.1/hallo.php - andere Adressen sind aber, abhängig vom Webserver, auch möglich. Sie können sich auch die Direktiven DocumentRoot und ServerName in der Konfigurationsdatei Ihres Webservers für weitere Informationen anschauen (bei Apache lautet der Name dieser Datei httpd.conf). Wenn Sie alles korrekt installiert haben, wird die Datei von PHP geparst und Sie werden die folgende Ausgabe in Ihrem Browser sehen:

<html>
 <head>
  <title>PHP-Test</title>
 </head>
 <body>
 <p>Hallo Welt</p>
 </body>
</html>

Beachten Sie, dass dies nicht mit einem CGI-Skript vergleichbar ist. Die Datei muss nicht ausführbar oder sonst irgendwie speziell sein. Stellen Sie sich die Datei wie eine normale HTML-Datei vor, die eine spezielle Menge von Tags zur Verfügung stellt, mit denen Sie viele interessante Dinge machen können.

Das Beispiel ist extrem einfach und natürlich brauchen Sie PHP nicht, um eine Seite wie diese zu erstellen. Denn es macht nicht mehr, als Hallo Welt mit der echo()-Anweisung von PHP auszugeben.

Wenn Sie dieses Beispiel ausprobiert haben und Sie aber keine Ausgabe erhalten haben oder zum Download aufgefordert worden sind oder die komplette Datei als Text erhalten haben, dann ist es sehr wahrscheinlich, dass auf Ihrem Server PHP nicht aktiviert ist. Fragen Sie in diesem Fall Ihren Administrator und weisen Sie ihn auf das Installations-Kapitel hin. Wenn Sie lokal entwickeln, lesen Sie bitte das Installations-Kapitel, um festzustellen, ob alles richtig konfiguriert wurde. Sollten Ihre Probleme nach Lesen dieses Kapitels immer noch bestehen, zögern Sie nicht und nutzen Sie eines der vielen Support-Angebote.

Der wichtigste Punkt im Beispiel ist, Ihnen das spezielle PHP Tag-Format zu zeigen. Im Beispiel wurde <?php verwendet, um den Beginn eines PHP-Tags zu kennzeichnen. Anschließend folgte die PHP-Anweisung. Mit dem schließenden Tag, ?>, wurde der PHP-Modus wieder verlassen. Sie können an jeder Stelle und so oft Sie wollen, in den PHP-Modus wechseln und ihn wieder verlassen. Für weitere Details lesen Sie bitte den Abschnitt zu den Grundlagen der Syntax von PHP.

Anmerkung zu Text-Editoren: Es gibt eine ganze Reihe von Text-Editoren und Integrated Development Environments (IDEs), mit denen Sie Ihre PHP-Dateien erstellen, bearbeiten und managen können. Eine Liste solcher Programme finden Sie hier: PHP Editor's List. Wenn Sie einen Editor vorschlagen möchten, besuchen Sie bitte die genannte Seite und bitten Sie den Betreiber der Seite, dass er den Editor der Liste hinzufügt. Wir empfehlen Ihnen einen Editor zu benutzen, der Syntax-Highlighting bietet.

Anmerkung zu Textverarbeitungen: Textverarbeitungen wie StarOffice Writer, Microsoft Word und Abiword sind keine gute Wahl, um PHP-Dateien zu bearbeiten. Wenn Sie eines dieser Programme für dieses Test-Skript nutzen möchten, dann müssen Sie sicherstellen, dass die Datei als "Nur Text"-Datei gespeichert wird, da PHP sonst das Skript nicht lesen und nicht ausführen kann.

Anmerkung zu Notepad, dem Windows-Standard-Editor: Wenn Sie Ihre PHP-Skripte mit Notepad schreiben, müssen Sie sicherstellen, dass Ihre Dateien mit der Endung .php gespeichert werden. (Notepad fügt die Endung .txt automatisch an den Dateinamen an, wenn Sie das nicht mit einem der folgenden Schritte verhindern.) Wenn Sie die Datei speichern und einen Namen für die Datei eingeben sollen, dann setzen Sie den Dateinamen in Anführungszeichen (z.B. "hallo.php"). Alternativ können Sie auch im "Datei speichern"-Fenster in der Drop-Down-Liste "Dateityp" die Einstellung auf "Alle Dateien" ändern. Sie können dann den Dateinamen ohne Anführungszeichen eingeben.

Nachdem Sie jetzt erfolgreich ein einfaches, funktionierendes PHP-Skript geschrieben haben, wird es Zeit, das berühmteste PHP-Skript zu schreiben. Rufen Sie die Funktion phpinfo() auf und Sie bekommen viele nützliche Informationen über Ihr System und Ihre Installation wie z.B. die verfügbaren vordefinierten Variablen, die geladenen PHP-Module und die Konfigurations-Einstellungen. Nehmen Sie sich etwas Zeit und schauen Sie sich diese wichtigen Informationen an.


Nützliches

Kommen wir nun zu einem etwas nützlicheren Beispiel. Wir wollen prüfen, welchen Browser die Person, die die Seite besucht, benutzt. Um das zu tun, prüfen wir den "user agent"-String, den der Browser als Teil seiner HTTP-Anforderung sendet. Diese Information ist in einer Variablen abgelegt. In PHP beginnen Variablen immer mit einem Dollar-Zeichen. Die Variable, die uns jetzt interessiert, ist $_SERVER["HTTP_USER_AGENT"].

PHP Autoglobals-Anmerkung: $_SERVER ist eine speziell reservierte PHP-Variable, die alle Informationen über den Webserver enthält. Diese Variable wird auch als auto- oder superglobal bezeichnet. Mehr Informationen darüber Sie auf der Manual-Seite über Autoglobals. Diese speziellen Variablen wurden in PHP 4.1.0 eingeführt. Vorher wurden stattdessen die älteren $HTTP_*_VARS-Arrays benutzt, also z.B. $HTTP_SERVER_VARS. Auch wenn diese Variablen nicht mehr genutzt werden sollen - sie existieren weiterhin. (Beachten Sie auch die Seite Alten Code mit neuen PHP-Versionen benutzen.)

Um die Variable auszugeben, schreiben wir einfach:

Beispiel 2-2. Variable ausgeben (Array-Element)

<?php echo $_SERVER["HTTP_USER_AGENT"]; ?>

Die Ausgabe dieses Beispiel könnte so aussehen:
Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

Es gibt viele Typen von Variablen. Im obigen Beispiel haben wir ein Array-Element ausgegeben. Arrays können sehr nützlich sein.

$_SERVER ist nur eine von vielen Variablen, die Ihnen automatisch von PHP zur Verfügung gestellt werden. Eine Liste finden Sie auf der Seite Reservierte Variablen im Manual. Eine vollständige Liste können Sie auch bekommen, wenn Sie eine Datei wie die folgende erstellen:

Beispiel 2-3. Alle vordefinierten Variablen mit phpinfo() ausgeben

<?php phpinfo(); ?>

Wenn Sie diese Datei in Ihrem Browser öffnen, sehen Sie eine Seite mit vielen Informationen über PHP zusammen mit einer Liste aller für Sie verfügbaren Variablen.

Sie können mehrere PHP-Anweisungen innerhalb eines PHP-Tags platzieren und so kleine Code-Blöcke schreiben, die mehr als nur eine Ausgabe mit echo() enthalten. Wenn wir zum Beispiel prüfen möchten, ob es sich beim Browser des Besuchers um den Internet Explorer handelt, können wir folgenden Code benutzen:

Beispiel 2-4. Beispiel, das Kontrollstrukturen und Funktionen benutzt

<?php
if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) {
  echo "Sie benutzen Internet Explorer<br />";
}
?>

Die Ausgabe dieses Skripte könnte so aussehen:
Sie benutzen Internet Explorer<br />

Hier haben wir Ihnen eine ganze Reihe von neuen Konzepten vorgestellt. Wir haben hier zuerst eine if-Anweisung. Wenn Sie mit der Grundlagen-Syntax von der Programmiersprache C vertraut sind, sollte Ihnen dies logisch erscheinen. Wenn Sie C oder eine andere Sprache, die die obige Syntax benutzt, nicht gut genug kennen, dann sollten Sie sich ein Buch mit einer PHP-Einführung besorgen und die ersten Kapitel lesen. Sie können natürlich auch in die Sprachreferenz des Manuals schauen. Eine Liste von PHP-Büchern finden Sie unter http://www.php.net/books.php.

Das zweite hier vorgestellte Konzept ist der Aufruf der Funktion strstr(). strstr ist eine in PHP eingebaute Funktion, die nach einem String in einem anderen String sucht. In diesem Fall suchen wir nach "MSIE" in $_SERVER["HTTP_USER_AGENT"]. Wenn der String gefunden wird, gibt die Funktion TRUE zurück, wird er nicht gefunden, dann wird FALSE zurückgegeben. Wenn TRUE zurückgeben wird, wird die if-Anweisung zu TRUE ausgewertet und der Code innerhalb der geschweiften Klammern wird ausgeführt. Wenn aber FALSE zurückgegeben wird, wird der Code innerhalb der Klammern nicht ausgeführt. Probieren Sie weitere ähnliche Beispiele mit if, else und anderen Funktionen wie strtoupper() oder strlen(). Jede dieser Manual-Seiten enthält weitere Beispiele.

Wir können jetzt einen Schritt weitergehen und sehen, wie Sie innerhalb eines PHP-Blocks den PHP-Modus verlassen und wieder in ihn hinein gelangen können:

Beispiel 2-5. HTML- und PHP-Modus vermischt

<?php
if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) {
?>
<h3>strstr muss true zurückgegeben haben</h3>
<center><b>Sie benutzen Internet Explorer</b></center>
<?php
} else {
?>
<h3>strstr muss false zurückgegeben haben</h3>
<center><b>Sie benutzen nicht Internet Explorer</b></center>
<?php
}
?>

Die Ausgabe dieses Skripts könnte so aussehen:
<h3>strstr muss true zurückgegeben haben</h3>
<center><b>Sie benutzen Internet Explorer</b></center>

Anstatt die PHP echo-Anweisung für die Ausgabe zu benutzen, haben wir den PHP-Modus verlassen und normales HTML verwendet. Der wichtige Punkt hierbei ist, dass der logische Ablauf des Skripts dadurch nicht gestört wird. Nur einer der beiden HTML-Blöcke wird ausgegeben - abhängig davon, ob strstr() TRUE oder FALSE zurückgibt bzw. ob der String MSIE gefunden wird oder nicht.


Formulare verarbeiten

Eine der mächtigsten Funktionen von PHP ist die Art, wie HTML-Formulare verarbeitet werden. Sie sollten wissen, dass jedes Element eines Formulars automatisch in Ihren PHP-Skripts verfügbar ist. Bitte lesen Sie die Seite Variablen außerhalb von PHP für weitere Informationen und Beispiele über das Benutzen von Formularen mit PHP. Hier ist ein Beispiel-HTML-Formular:

Beispiel 2-6. Ein einfaches HTML-Formular

<form action="action.php" method="POST">
 Ihr Name: <input type="text" name="name" />
 Ihr Alter: <input type="text" name="alter" />
 <input type="submit">
</form>

An diesem Formular ist nichts Besonderes. Es ist ein normales HTML-Formular ohne irgendwelche speziellen Tags. Wenn der Benutzer das Formular ausfüllt und den Submit-Button anklickt, wird die Seite action.php aufgerufen. Diese Datei könnte so aussehen:

Beispiel 2-7. Daten des Formulars ausgeben

Hallo <?php echo $_POST["name"]; ?>.
Sie sind <?php echo $_POST["alter"]; ?> Jahre alt.

Die Ausgabe des Skripts könnte dann so aussehen:
Hallo Joe.
Sie sind 22 Jahre alt.

Es sollte einfach zu verstehen sein, was hier passiert. Die Variablen $_POST["name"] und $_POST["alter"] werden für Sie automatisch von PHP gesetzt. Weiter oben haben wir das autoglobale Array $_SERVER eingeführt, jetzt benutzen wir hier das - ebenfalls autoglobale - Array $_POST, dass alle POST-Daten enthält. Beachten Sie, dass die im Formular verwendete Methode POST ist. Hätten wir GET verwendet, dann wären die Daten unseres Formulars stattdessen im autoglobalen Array $_GET verfügbar. Sie können auch das autoglobale Array $_REQUEST benutzen, wenn die Quelle der Daten keine Rolle spielt. Dieses Array enthält die GET-, POST-, COOKIE- und FILE-Daten. Vgl. auch die import_request_variables()-Funktion.


Alten Code mit neuen PHP-Versionen benutzen

Dadurch dass PHP eine immer beliebtere Skriptsprache ist, gibt es immer mehr Quellen, die Ihnen Code-Listings zur Verfügung zu stellen. Die PHP-Entwickler haben versucht, den größten Teil der Sprache abwärtskompatibel zu halten. Das bedeutet, dass ein Skript, das für eine ältere PHP-Version geschrieben wurde, (im Idealfall) ohne Änderungen auch unter einer neueren PHP-Version läuft. In der Praxis sind aber meist einige Änderungen nötig.

Zwei der wichtigsten aktuellen Änderungen, die alten Code betreffen, sind:

  • Die Missbilligung der alten $HTTP_*_VARS-Arrays (die global gemacht werden mussten, wenn man sie innerhalb einer Funktion nutzen wollte). In PHP 4.1.0 wurden die folgenden autoglobalen Arrays eingeführt: $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST und $_SESSION. Die älteren $HTTP_*_VARS-Arrays, wie $HTTP_POST_VARS, existierten bereits seit PHP 3 und sind auch immer noch verfügbar.

  • Externe Variablen werden standardmäßig nicht mehr im globalen Namensraum registriert. Mit anderen Worten, seit PHP 4.2.0 ist off die Standard-Einstellung für die PHP-Direktive register_globals. Die empfohlene Methode, auf diese Werte zuzugreifen, ist, die oben genannten autoglobalen Arrays zu verwenden. Ältere Skripte, Bücher und Tutorials gehen eventuell davon aus, dass diese Einstellung auf on steht. Wäre die Einstellung on, wäre die Variable $id aus der URL http://www.example.com/foo.php?id=42 verfügbar. Unabhängig davon, ob on oder off, ist immer $_GET['id'] verfügbar.

Für weitere Details über diese Änderungen siehe die Seite über vordefinierte Variablen und die Links dort.


Und weiter?

Mit dem Wissen, das Sie jetzt haben, sollte es Ihnen möglich sein, das meiste aus diesem Manual und die vielen Beispiel-Skripte in den Beispiel-Archiven zu verstehen. Sie können weitere auf den php.net-Seiten verfügbare Beispiele auf der folgenden Seite finden: http://www.php.net/links.php.


Kapitel 3. Installation


Generelle Überlegungen zur Installation

Noch vor der Installation sollten Sie wissen, wofür Sie PHP einsetzen wollen. Es gibt drei Haupteinsatzbereiche von PHP, wie in dem Abschnitt Was kann PHP? beschrieben:

  • Serverseitige Skripte

  • Skripte auf der Kommandozeile

  • Clientseitige GUI Applikationen

Für den ersten und sehr weit verbreiteten Einsatzbereich benötigen Sie drei Dinge: PHP selbst, einen Webserver und einen Webbrowser. Sie haben wahrscheinlich bereits einen Webbrowser, und abhängig von Ihrer Betriebssystemkonfiguration haben Sie vielleicht auch schon einen Webserver (z.B. Apache auf Linux oder IIS auf Windows). Sie können Webspace bei einem Provider mieten. Dann benötigen Sie nichts selbst, sondern schreiben nur Ihre PHP Skripte, laden Sie zu dem gemieteten Server hoch, und sehen sich das Ergebnis in Ihrem Browser an.

Wenn Sie Ihren Server und PHP selbst installieren, können Sie zwischen zwei Methoden wählen, wie Sie PHP mit dem Server verbinden. PHP verfügt für viele Server über eine direkte Modulschnittstelle (auch SAPI genannt). Diese Server sind zum Beispiel Apache, Microsoft Internet Information Server, Netscape und iPlanet Server. Viele andere Server unterstützen die Microsoft Modulschnittstelle ISAPI (z.B. OmniHTTPd). Sollte PHP keine Modulschnittstelle für Ihren Webserver unterstützen, können Sie es immer über die CGI Schnittstelle betreiben. Das heißt, dass Sie Ihren Webserver so konfigurieren, dass bei jeder Anforderung von PHP Dateien an den Server das Kommandozeilenprogramm von PHP (php.exe auf Windows) zur Abarbeitung der Skripte benutzt wird.

Wenn Sie PHP auch für Skripte auf der Kommandozeile benutzen möchten (z.B. für Skripte, die offline entsprechend ein paar von Ihnen übergebenen Parametern automatisch Bilder erzeugen oder Textdateien verarbeiten), benötigen Sie das Kommandozeilenprogramm. Weitere Informationen hierzu finden Sie unter writing command line PHP applications. In diesem Fall benötigen Sie weder einen Server, noch einen Browser.

Sie können mit PHP und der PHP-GTK Erweiterung auch clientseitige GUI Applikationen erstellen. Dies ist ein völlig anderer Ansatz als das Schreiben von Webseiten, da Sie zwar kein HTML ausgeben, dafür aber Fenster und Objekte handhaben. Weitere Informationen zu PHP-GTK finden Sie auf der Webseite zu dieser Erweiterung. PHP-GTK ist nicht in offiziellen PHP Distribution enthalten.

Von nun an befasst sich dieser Abschnitt mit der Installation von PHP für Webserver auf Unix und Windows mit Servermodulen und CGI Schnittstellen.

Den Quellcode von PHP sowie die Binärdistributionen für Windows erhalten Sie unter http://www.php.net/. Wir empfehlen, den Download der Distributionen von dem Ihnen am nächsten liegenden Mirror durchzuführen.


Unix/HP-UX Installationen

Dieser Abschnitt enthält Anmerkungen und Hinweise zur Installation von PHP auf HP-UX Systemen.

Beispiel 3-1. Installationsanleitung für HP-UX 10

Von: paul_mckay@clearwater-it.co.uk

04-Jan-2001 09:49

(Diese Tipps sind für PHP 4.0.4 und Apache v1.3.9)



Sie wollen also PHP und Apache auf einer HP-UX 10.20 installieren? 



1. Sie brauchen gzip, holen Sie sich eine Binärdistribution von

http://hpux.connect.org.uk/ftp/hpux/Gnu/gzip-1.2.4a/gzip-1.2.4a-sd-10.20.depot.Z
dekomprimieren Sie die Datei, und installieren Sie sie mit swinstall



2. Sie brauchen gcc, holen Sie sich eine Binärdistribution von

http://gatekeep.cs.utah.edu/ftp/hpux/Gnu/gcc-2.95.2/gcc-2.95.2-sd-10.20.depot.gz 

gunzip, und installieren Sie gcc mit swinstall.



3. Sie brauchen die GNU binutils, holen Sie sich eine Binärdistribution von

http://hpux.connect.org.uk/ftp/hpux/Gnu/binutils-2.9.1/binutils-2.9.1-sd-10.20.depot.gz 
gunzip, und installieren Sie sie mit swinstall.



4. Nun benötigen Sie bison, holen Sie sich eine Binärdistribution von

http://hpux.connect.org.uk/ftp/hpux/Gnu/bison-1.28/bison-1.28-sd-10.20.depot.gz 
installieren Sie sie wie o.a.



5. Nun benötigen Sie flex, laden Sie sich den Sourcecode von einem der 

http://www.gnu.org Mirrors herunter. Er befindet sich in dem non-gnu 

Verzeichnis der FTP-Site.

Downloaden Sie die Datei, gunzip, dann tar -xvf 'en Sie sie. Gehen Sie in das erstellte 

Verzeichnis flex, und führen ./configure aus, dann make, und dann make install.



Sollten dabei Fehler auftreten liegt es vielleicht daran, dass gcc etc. 

nicht im PATH sind. Ist das der Fall, fügen Sie diese bitte dem PATH hinzu.



OK, nun zum schwierigen Teil:



6. Laden Sie die Sourcecodes von PHP und Apache herunter.



7. Führen Sie gunzip und tar -xvf an ihnen aus. 



Wir müssen einige Dateien ändern, damit sie richtig kompiliert werden können.



8. Erst muss die Konfigurationsdatei geändert werden, denn es scheint als 

würde sie aus den Augen verlieren, dass sie auf einer hpux Maschine ist. Es 

gibt sicher einen besseren Weg dies zu tun, aber einfacher Weg ist es, 

    lt_target=hpux10.20 

in die Zeile 47286 des configure Skriptes zu schreiben.



9. Als nächstes müssen wir die Apache GuessOS Datei ändern. Unter

apache_1.3.9/src/helpers ändern Sie die Zeile 89 von 

    "echo "hp${HPUXMACH}-hpux${HPUXVER}"; exit 0" 
auf: 

    "echo "hp${HPUXMACH}-hp-hpux${HPUXVER}"; exit 0" 
    

10. Sie können PHP nicht als Shared Object unter HP-UX installieren, weshalb Sie es 

statisch kompilieren müssen; folgen Sie einfach den Anweisungen auf der Apache Seite.



11. Das Kompilieren von PHP und Apache sollte OK gehen, aber Apache wird nicht starten. 

Sie müssen einen neuen User für Apache einrichten, z.B. www oder apache. Dann ändern 

Sie die Zeilen 252 und 253 der conf/httpd.conf in Apache so, dass statt

    User nobody 

    Group nogroup 

etwas ähnliches steht wie:

    User www 

    Group sys 



Das hat den Grund, dass Sie Apache unter HP-UX nicht als nobody laufen 

lassen können. Jetzt sollten Apache und PHP laufen.



Ich hoffe das hilft jemandem,

Paul Mckay.

Unix/Linux Installationen

Dieser Abschnitt enthält Anmerkungen und Hinweise zur Installation von PHP auf Linux Distributionen.


Pakete verwenden

Viele Linux Distributionen haben eine Art Paketinstallation, wie z.B. RPM. Das kann beim Setup einer Standardkonfiguration helfen, aber wenn Sie andere Features (wie einen Secure Server, oder einen anderen Datenbanktreiber) benötigen könnte es sein, dass ein Build von PHP und/oder Ihres Webservers nötig ist. Wenn Sie mit dem Erstellen und Kompilieren Ihrer Software nicht vertraut sind, sollten Sie sich nach einer von jemand anders bereits erstellten Paketversion von PHP mit den von Ihnen benötigten Features umsehen.


Unix/Mac OS X Installationen

Dieser Abschnitt enthält Anmerkungen und Hinweise zur Installation von PHP auf dem Mac OS X Server.


Pakete verwenden

Es gibt ein paar vorgefertigte und kompilierte Pakete von PHP für Mac OS X. Das ist hilfreich um eine Standardkonfiguration aufzusetzen, doch sollten Sie eine davon abweichende Konfiguration benötigen (wie z.B. einen Secure Server oder einen anderen Datenbanktreiber), müssen Sie evtl. PHP und/oder Ihren Webserver selbst erstellen. Wenn Sie mit dem Erstellen und Kompilieren Ihrer Software nicht vertraut sind, sollten Sie sich nach einer von jemand anders bereits erstellten Paketversion von PHP mit den von Ihnen benötigten Features umsehen.


Kompilieren für OS X Server

Es gibt zwei leicht unterschiedliche Versionen von Mac OS X, den Client und den Server. Die folgende Beschreibung ist für OS X Server.

Beispiel 3-2. Mac OS X Server Installation

1. Beschaffen Sie sich die aktuellen Distributionen von Apache und PHP
2. Untar'en Sie sie, und starten configure an Apache wie folgt
    ./configure --exec-prefix=/usr \ 
    --localstatedir=/var \ 
    --mandir=/usr/share/man \ 
    --libexecdir=/System/Library/Apache/Modules \ 
    --iconsdir=/System/Library/Apache/Icons \ 
    --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ 
    --enable-shared=max \ 
    --enable-module=most \ 
    --target=apache 

4. Sie können auch folgende Zeile hinzufügen:
    setenv OPTIM=-O2 
    Wenn Sie wollen, dass der Compiler Optimierungen durchführt.
    
5. Wechseln Sie in das Verzeichnis mit dem PHP Source und führen configure aus
    ./configure --prefix=/usr \ 
    --sysconfdir=/etc \ 
    --localstatedir=/var \ 
    --mandir=/usr/share/man \ 
    --with-xml \ 
    --with-apache=/src/apache_1.3.12 

    Wenn Sie andere Ergänzungen haben (MySQL, GD, etc.), fügen Sie diese
    hier hinzu. Geben Sie bei der Option --with-apache den Pfad zu dem
    Verzeichnis mit Ihrem Apache Source an, z.B. "/src/apache_1.3.12".
6. make
7. make install    
    Dies fügt Ihrem Apache Source Verzeichnis das Verzeichnis 
    src/modules/php4 hinzu.
    
8. Nun konfigurieren Sie Apache neu, inkl. PHP 4 Modul.
    ./configure --exec-prefix=/usr \ 
    --localstatedir=/var \ 
    --mandir=/usr/share/man \ 
    --libexecdir=/System/Library/Apache/Modules \ 
    --iconsdir=/System/Library/Apache/Icons \ 
    --includedir=/System/Library/Frameworks/Apache.framework/Versions/1.3/Headers \ 
    --enable-shared=max \ 
    --enable-module=most \ 
    --target=apache \ 
    --activate-module=src/modules/php4/libphp4.a 

    Sollten Sie eine Meldung erhalten, dass libmodphp4.a nicht mehr gültig ist,
    wechseln Sie in Ihrem Apache Source Verzeichnis zu src/modules/php4 und
    führen folgenden Befehl aus:

    ranlib libmodphp4.a 

    Gehen Sie dann in das Hauptverzeichnis des Apache Source zurück, und führen
    den obigen configure Befehl erneut aus. Das aktualisiert die Linktabelle.

9. make

10. make install

11. Kopieren Sie die Datei php.ini-dist von Ihrem Verzeichnis mit dem PHP 4 
    Source in Ihr "bin" Verzeichnis, und benennen Sie sie um:
    cp php.ini-dist /usr/local/bin/php.ini 

    oder (wenn Sie kein lokales Verzeichnis haben) 

    cp php.ini-dist /usr/bin/php.ini

Kompilieren für MacOS X Client

Diese Tipps wurden freundlicherweise von Marc Liyanage zur Verfügung gestellt.

Das PHP Modul für den Apache Webserver ist in Mac OS X inkludiert. Diese Version unterstützt die MySQL und PostgreSQL Datenbanken.

Anmerkung: Vorsicht wenn Sie dies tun, Sie könnten Ihren Apache Webserver vermurksen!

Installationsschritte:

  • 1. Öffnen Sie ein Terminalfenster

  • 2. Geben Sie "wget http://www.diax.ch/users/liyanage/software/macosx/libphp4.so.gz" ein, und warten Sie bis der Download beendet ist

  • 3. Geben Sie "gunzip libphp4.so.gz" ein

  • 4. Geben Sie "sudo apxs -i -a -n php4 libphp4.so" ein

Nun geben Sie "sudo open -a TextEdit /etc/httpd/httpd.conf" ein. TextEdit öffnet daraufhin die Konfigurationsdatei des Webservers. Suchen Sie diese beiden Zeilen in Richtung Dateiende: (Benutzen Sie den Befehl Find)
#AddType application/x-httpd-php .php 
   #AddType application/x-httpd-php-source .phps
Entfernen Sie die beiden Rautezeichen (#), speichern die Datei, und beenden TextEdit.

Starten Sie mit "sudo apachectl graceful" den Webserver neu.

PHP sollte nun laufen. Sie können dies testen, indem Sie in Ihrem Verzeichnis "Sites" eine Datei mit dem Namen "test.php" erstellen und folgende Zeile hineinschreiben: "<?php phpinfo() ?>".

Nun öffnen Sie 127.0.0.1/~your_username/test.php in Ihrem Webbrowser. Sie sollten nun eine Tabelle mit Informationen über das PHP Modul sehen.


Unix/OpenBSD Installation

Dieser Abschnitt enthält Anmerkungen und Hinweise zur Installation von PHP auf OpenBSD 3.2.


Binärpakete verwenden

Die Installation von PHP auf OpenBSD mittels Binärpaketen ist die empfohlene und auch einfachste Methode. Das Kernpaket wurde von den verschiedenen Modulen getrennt, wodurch jedes Paket unabhängig von den anderen installiert und entfernt werden kann. Die nötigen Dateien finden Sie auf Ihrer OpenBSD CD oder auf der FTP Site.

Das zur Installation benötigte Hauptpaket ist php4-core-4.2.3.tgz, welches das Basisprogramm (plus gettext und iconv) enthält. Achten Sie als nächstes auf die Modulpakete, wie php4-mysql-4.2.3.tgz oder php4-imap-4.2.3.tgz. Sie müssen das phpxs Kommando verwenden, um diese Module in Ihrer php.ini zu aktivieren bzw. zu deaktivieren.

Beispiel 3-3. OpenBSD Paket Installationsbeispiel

# pkg_add php4-core-4.2.3.tgz
# /usr/local/sbin/phpxs -s
# cp /usr/local/share/doc/php4/php.ini-recommended /var/www/conf/php.ini
  (in mysql hinzufügen)
# pkg_add php4-mysql-4.2.3.tgz
# /usr/local/sbin/phpxs -a mysql
  (in imap hinzufügen)
# pkg_add php4-imap-4.2.3.tgz
# /usr/local/sbin/phpxs -a imap
  (mysql als Test entfernen)
# pkg_delete php4-mysql-4.2.3
# /usr/local/sbin/phpxs -r mysql
  (Installation der PEAR Bibliotheken)
# pkg_add php4-pear-4.2.3.tgz

Weitere Informationen über Binärpakete auf OpenBSD finden Sie in der manpage packages(7).


Ports verwenden

Sie können PHP auch unter Verwendung des ports tree kompilieren. Dies wird jedoch nur Benutzern empfohlen, die mit OpenBSD vertraut sind. Der PHP4 Port ist in drei Unterverzeichnisse aufgeteilt: core, extensions und pear. Das Verzeichnis extensions generiert Sub-Pakete für alle unterstützten PHP Module. Wenn Sie keines dieser Module erstellen möchten, verwenden Sie den no_* FLAVOR. Um z.B. den Build des imap Moduls zu verhindern, setzen Sie den FLAVOR auf no_imap.


Ältere Versionen

Ältere Versionen von OpenBSD verwendeten das FLAVORS System, um PHP statisch verlinkt zu kompilieren. Da es schwer ist, Binärpakete mit dieser Methode zu erstellen, wird von dieser Methode abgeraten. Wenn Sie möchten, können Sie die alten stabilen Ports Trees weiterhin verwenden, jedoch werden diese von dem OpenBSD Team nicht unterstützt. Sollten Sie dazu Anmerkungen haben: Der derzeitige Verantwortliche für den Port ist Anil Madhavapeddy.


Unix/Solaris Installation

Dieser Abschnitt enthält Anmerkungen und Hinweise zur Installation von PHP auf Solaris Systemen.


Benötigte Software

Solaris Installationen mangelt es oft an C Compilern und deren zugehörigen Tools. Sie benötigen folgende Software:

  • gcc (empfohlen, andere C Compiler können ebenfalls funktionieren)

  • make

  • flex

  • bison

  • m4

  • autoconf

  • automake

  • perl

  • gzip

  • tar

  • GNU sed

Zusätzlich werden Sie für die Installation (und vielleicht auch zum Kompilieren) eine andere, für Ihre Konfiguration spezifische Software benötigen, wie z.B. Oracle oder MySQL.


Pakete verwenden

Sie können den Installationsprozess auf Solaris vereinfachen, indem Sie pkgadd zur Installation der meisten benötigten Komponenten verwenden.


Installation auf UNIX Systemen

Dieser Abschnitt wird Sie durch die Konfiguration und Installation von PHP auf UNIX Systemen führen. Bevor Sie mit dem Prozess beginnen, lesen Sie bitte alle für Ihre Plattform oder Webserver relevanten Abschnitte.

Erforderliche Kenntnisse und Software:

  • Grundlegende UNIX-Kenntnisse (Sie sollten in der Lage sein, mit "make" und einem C-Compiler umzugehen, wenn Sie kompilieren)

  • Einen ANSI C Compiler (wenn Sie kompilieren)

  • flex (zum kompilieren)

  • bison (zum kompilieren)

  • Einen Web Server

  • Alle modulspezifischen Komponenten (wie z.B. gd, pdf libs, etc.)

Es gibt verschiedene Wege, PHP auf der Unix Plattform zu installieren. Entweder mit einem Kompilier- und Konfigurationsprozess, oder mittels verschiedener vorgefertigter Pakete. Diese Dokumentation ist hauptsächlich auf den Prozess des Kompilierens und Konfigurierens von PHP fokussiert.

Der Anfang des PHP Installations- und Konfigurationsprozesses wird von den Eingabeoptionen für das configure Skript gesteuert. Diese Seite umreißt die Verwendung der meisten allgemeinen Optionen, aber es gibt noch viele andere als Spielraum. Eine umfassende Übersicht finden Sie in der Kompletten Liste der Konfigurationsoptionen. Es gibt verschiedene Wege, PHP zu installieren:


Apache Modul - Kurzanleitung

PHP kann auf unterschiedliche Arten kompiliert werden, aber eine der populärsten ist die als Apache Modul. Es folgt ein kurzer Überblick über die Installation.

Beispiel 3-4. Kurzanleitung zur Installation von PHP 4 (Apache Modul Version)

1.  gunzip apache_1.3.x.tar.gz
2.  tar xvf apache_1.3.x.tar
3.  gunzip php-x.x.x.tar.gz
4.  tar xvf php-x.x.x.tar
5.  cd apache_1.3.x
6.  ./configure --prefix=/www
7.  cd ../php-x.x.x
8.  ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9.  make
10. make install
11. cd ../apache_1.3.x
12. ./configure --activate-module=src/modules/php4/libphp4.a
13. make
14. make install
15. cd ../php-x.x.x
16. cp php.ini-dist /usr/local/lib/php.ini
17. Editieren Sie nun Ihre httpd.conf oder srm.conf, und fügen Sie hinzu: 
      AddType application/x-httpd-php .php

18. Starten Sie den Apache Web Server neu. (Sie müssen den Server beenden
    und neu starten, ein einfacher Reload mittels HUP oder USR1 Signal
    reicht nicht aus.)

Building

Wenn PHP konfiguriert ist, können Sie die ausführbare CGI Datei erstellen. Das Kommando make sollte das für Sie erledigen. Sollte dies scheitern und Sie nicht erkennen können warum, lesen Sie im Abschnitt Problem-Sektion weiter.


Installation auf Windows Systemen

Dieser Abschnitt behandelt Windows 98/Me und Windows NT/2000/XP PHP läuft nicht auf 16 Bit-Plattformen wie z.B. Windows 3.1, und manchmal sprechen wir bei den unterstützten Plattformen von Win32. Seit PHP 4.3.0 wird auch Windows 95 nicht mehr unterstützt.

Es gibt zwei Wege PHP für Windows zu installieren: entweder manuell, oder mittels dem InstallShield Installer.

Wenn Sie Microsoft Visual Studio besitzen, können Sie auch den Source Code von PHP selbst kompilieren.

Haben Sie PHP erst einmal auf Ihrem Windows System installiert, können Sie als Erweiterung der Funktionalität auch verschiedene Erweiterungen laden.


Windows InstallShield

Der auf der Downloadseite http://www.php.net/downloads.php erhältliche Windows PHP Installer installiert die CGI Version von PHP, und konfiguriert auch die Webserver IIS, PWS, und Xitami.

Anmerkung: Beachten Sie bitte, dass der InstallShield Installer zwar eine einfache Art der Installation von PHP ist, gleichzeitig aber auch in verschiedenen Aspekten eingeschränkt ist, wie z.B. ein automatisches Setup von Erweiterungen nicht unterstützt wird. Das gesamte Angebot an unterstützten Erweiterungen ist nur verfügbar, wenn Sie die Binärdistribution im zip-Format herunterladen.

Installieren Sie Ihren gewünschten HTTP Server auf Ihrem System und stellen Sie sicher, dass er läuft.

Starten Sie nun das Installationsprogramm, und folgen Sie den Instruktionen des Installation Wizards. Es werden zwei Installationsarten unterstützt: Standard bietet zweckmäßige Standardeinstellungen wo dies möglich ist, und Advanced (erweitert), welche die gewünschten Einstellungen während der Installation abfragt.

Der Installation Wizard sammelt genug Informationen, um die php.ini zu erstellen, und den Webserver für den Einsatz von PHP zu konfigurieren. Für IIS und auch PWS auf Windows NT Workstation wird eine Liste mit den Knoten auf dem Server, sowie eine Liste mit den Script Mappings angezeigt aus welcher Sie die gewünschten Knoten auswählen können, auf denen PHP in die Script Mappings eingetragen werden soll.

Wenn die Installation fertig ist informiert Sie der Installer, ob Sie Ihr System oder den Server neu starten sollen, oder ob Sie einfach mit der Nutzung von PHP beginnen können.

Warnung

Seien Sie sich darüber im Klaren, dass dieses Setup von PHP nicht sicher ist. Wenn Sie ein sicheres Setup von PHP möchten, setzen Sie PHP manuell auf, und wählen jede Option sorgfältig aus. Dieses automatische Setup bietet Ihnen eine sofort lauffähige PHP Installation, ist jedoch nicht für den Einsatz auf Online-Servern gedacht.


Manuelle Installationsschritte

Diese Installationsanleitung hilft Ihnen, PHP auf Ihrem Windows Webserver manuell zu installieren und zu konfigurieren. Laden Sie sich hierfür bitte die gezippte Distribution von der Downloadseite http://www.php.net/downloads.php herunter. Die Originalversion dieser Anleitung wurde von Bob Silva verfasst, welche Sie auf http://www.umesd.k12.or.us/php/win32install.html finden.

Diese Anleitung unterstützt Sie bei der manuellen Installation für:

  • Personal Web Server 3 und 4 oder neuer

  • Internet Information Server 3 und 4 oder neuer

  • Apache 1.3.x

  • OmniHTTPd 2.0b1 und höher

  • Oreilly Website Pro

  • Xitami

  • Netscape Enterprise Server, iPlanet

PHP 4 für Windows gibt es in zwei Varianten - ein CGI Modul (php.exe), und verschiedene SAPI Module (z.B. php4isapi.dll). Letztere ist neu in PHP 4, und bietet eine signifikant höhere Performance, sowie neue Funktionalitäten. Zusätzlich gibt es eine CLI Version, die im Abschnitt Using PHP from the command line näher beschrieben ist.

Warnung

Die Qualität der SAPI Module wurde in PHP 4.1 signifikant erhöht. In älteren Systemen könnte es vorkommen, dass beim Server Fehlermeldungen auftreten, oder dass andere Servermodule wie z.B. ASP nicht funktionieren.

Wenn Sie eines der SAPI Module unter Windows 95 einsetzen möchten, holen Sie sich das DCOM Update von den Microsoft DCOM Seiten. Für das ISAPI Modul wird ein ISAPI 4.0 kompatibler Webserver benötigt (getestet wurden IIS 4.0, PWS 4.0 und IIS 5.0). IIS 3.0 wird NICHT unterstützt. Wenn Sie gediegene PHP Unterstützung wünschen, sollten Sie In diesem Fall den Windows NT 4.0 Option Pack mit IIS 4.0 downloaden.

Die folgenden Schritte sollten vor den serverspezifischen Instruktionen an allen Installationen durchgeführt werden.

  • Entpacken Sie die in der Distribution enthaltenen Dateien in ein Verzeichnis Ihrer Wahl. Wir empfehlen c:\php\. Sie sollten jedoch keinen Pfad wählen, in dem sich Leerzeichen befinden (z.B. c:\program files\php ist keine gute Idee), da sonst manche Webserver abstürzen könnten.

  • Stellen Sie sicher, dass die von PHP verwendeten DLLs gefunden werden können. Welche DLLs benötigt werden, hängt von dem verwendeten Webserver ab, und ob Sie PHP als CGI- oder Server-Modul einsetzen. php4ts.dll wird immer verwendet. Wenn Sie ein Server-Modul benutzen (z.B. ISAPI oder Apache), dann brauchen Sie die entsprechende DLL des sapi Verzeichnisses. Wenn Sie PHP extension DLLs benutzen, benötigen Sie diese ebenfalls. Um sicherzugehen, dass diese auch gefunden werden, können Sie sie entweder in das Systemverzeichnis (z.B. winnt/system32 oder windows/system) kopieren, oder Sie können sie in das gleiche Verzeichnis stellen, in welchem sich auch die von Ihrem Webserver benutzte EXE- bzw. DLL-Datei befindet (z.B. php.exe, php4apache.dll).

    Die PHP Programmdatei, die SAPI Module, und einige Erweiterungen benötigen externe DLLs. Stellen Sie sicher, dass diese DLLs der Distribution in einem Verzeichnis liegen, welches im Windows PATH liegt. Wenn Sie z.B. php_oci8.dll in der php.ini aktivieren, dann muss das Oracle Heimatverzeichnis im PATH sein, sodass PHP die oci.dll finden kann.

    Der einfachste Weg dazu ist, die nachstehenden Dateien in Ihr Systemverzeichnis zu kopieren. Dieses heißt gewöhnlich:

    c:\windows\system auf Windows 9x/ME
    c:\winnt\system32 auf Windows NT/2000
    c:\windows\system32 auf Windows XP

    Die zu kopierenden Dateien sind:

    php4ts.dll. Wenn sie dort bereits existiert, überschreiben Sie sie.
    Die Dateien in dem Verzeichnis 'dlls' Ihrer Distribution. Sollten diese Dateien bereits auf Ihrem System installiert sein, überschreiben Sie diese nur, wenn etwas nicht korrekt läuft (Vor dem Überschreiben empfehlen wir ein Backup, oder verschieben diese Dateien in ein anderes Verzeichnis - nur für den Fall dass etwas schiefgeht).

    Holen Sie sich die letzte Version der Microsoft Data Access Components (MDAC) für Ihre Plattform, speziell wenn Sie Windows 9x/NT4 benutzen. MDAC finden Sie unter http://www.microsoft.com/data/.

  • Kopieren Sie die gewünschte ini Datei (siehe unten) in Ihr '%WINDOWS%' Verzeichnis auf Windows 9x/ME, oder in Ihr '%SYSTEMROOT%' Verzeichnis unter Windows NT/2000/XP, und benennen Sie sie in php.ini um. Ihr '%WINDOWS%' oder '%SYSTEMROOT%' Verzeichnis ist normalerweise:

    c:\windows auf Windows 9x/ME/XP
    c:\winnt oder c:\winnt40 auf NT/2000 Servern

    In der Zip-Datei befinden sich zwei ini Dateien: php.ini-dist und php.ini-optimized. Wir empfehlen, die php.ini-optimized zu verwenden, da in dieser Datei die Default-Einstellungen für Performance und Sicherheit optimiert sind. Am besten ist es, all die ini Einstellungen selbst manuell vorzunehmen. Wenn Sie die bestmögliche Sicherheit erreichen wollen ist dies der Weg für Sie, auch wenn PHP mit den Standardeinstellungen gut läuft.

  • Editieren Sie Ihre Datei php.ini:

    • Tragen Sie bei 'extension_dir' Ihr PHP Installationsverzeichnis oder den Pfad zu Ihren php_*.dll Dateien ein. Bitte vergessen Sie nicht den letzten Rückstrich (Backslash). z.B.: c:\php\extensions\

    • Wenn Sie OmniHTTPd benutzen, überspringen Sie diesen Schritt. Geben Sie bei 'doc_root' das Dokumentenverzeichnis des Webservers an. z.B.: c:\apache\htdocs oder c:\webroot.

    • Wählen Sie nun die Erweiterungen (Module) aus, die beim Start von PHP geladen werden sollen. Lesen Sie in Windows Erweiterungen wie Sie eine davon aktivieren können, und welche bereits inkludiert sind. Bei einer Neuinstallation ist es ratsam, erst PHP zu installieren und zu testen, bevor Sie Erweiterungen in der php.ini aktivieren.

    • Bei PWS und IIS können Sie auch browscap.ini auf c:\windows\system\inetsrv\browscap.ini unter Windows 9x/Me, c:\winnt\system32\inetsrv\browscap.ini unter NT/2000, und c:\windows\system32\inetsrv\browscap.ini unter XP. setzen.

    • Beachten Sie, dass das mibs Verzeichnis in der Windows Distribution Dateien für die SNMP Unterstützung enthält. Dieses Verzeichnis sollte nach DRIVE:\usr\mibs verschoben werden (DRIVE: ist das Laufwerk, auf dem PHP installiert ist).

    • Wenn Sie NTFS auf Windows NT, 2000 oder XP benutzen, stellen Sie sicher, dass der Benutzer unter dem der Webserver läuft, eine Leseberechtigung auf die php.ini hat (z.B. können Sie diese für alle zum Lesen freigeben).

  • Bei PWS erteilen Sie das Recht zum Ausführen auf das Web-Hauptverzeichnis:

    • Starten Sie den PWS Web Manager

    • Editieren Sie die Einstellungen des "Home"-Verzeichnisses

    • Wählen Sie das "execute" Auswahlkästchen aus


Den Source kompilieren

Bevor wir beginnen lohnt es sich, folgende Frage zu beantworten: "Warum ist das Kompilieren unter Windows so schwer?" Zwei Gründe drängen sich auf:

  1. Windows genießt (noch) keine große Gemeinschaft von Entwicklern welche auch bereit sind, deren Sourcecode frei zur Verfügung zu stellen. Als Ergebnis wurden die nötigen Investitionen in die für solche Entwicklungen nötige Infrastruktur nicht getätigt. Das meiste was verfügbar ist, wurde durch die Portierung der nötigen Werkzeuge von Unix möglich gemacht. Seien Sie deshalb nicht überrascht, wenn manches aus diesem Erbe von Zeit zu Zeit durchscheint.

  2. Fast alle der folgenden Instruktionen sind von der Art "Einstellen und vergessen". Deshalb lehnen Sie sich zurück, und folgen den nachstehenden Instruktionen so gewissenhaft wie möglich.


Anforderungen

Um PHP kompilieren und erstellen zu können, benötigen eine Microsoft Entwicklungsumgebung. Microsoft Visual C++ 6.0 wird empfohlen. Um die heruntergeladenen Dateien entpacken zu können, brauchen Sie ein Programm zum Dekomprimieren. Sollten Sie über kein derartiges Programm verfügen, erhalten Sie eine freie Version von InfoZip.

Bevor Sie beginnen, müssen Sie einiges downloaden...

Letztendlich benötigen Sie noch die Sourcecodes von PHP 4 selbst. Sie erhalten die letzte Entwicklerversion mittels anonymen CVS, einem sog. Snapshot, oder dem Sourcecode der letzten offiziellen Version.


Alles zusammenfügen

Nach dem Download der benötigten Pakete dekomprimieren Sie diese an einer geeigneten Stelle.

  • Erstellen Sie ein Arbeitsverzeichnis, in dem sich nach dem Dekomprimieren alle Dateien befinden werden, z.B. c:\work.

  • Erstellen Sie das Verzeichnis win32build unter Ihrem Arbeitsverzeichnis (c:\work), und dekomprimieren Sie die win32build.zip hinein.

  • Erstellen Sie das Verzeichnis bindlib_w32 unter Ihrem Arbeitsverzeichnis (c:\work), und dekomprimieren Sie die bindlib_w32.zip hinein.

  • Dekomprimieren Sie den PHP Sourcecode in Ihr Arbeitsverzeichnis (c:\work).

Diesen Schritten folgend, sollte Ihre Verzeichnisstruktur wie folgt aussehen:

+--c:\work
|  |
|  +--bindlib_w32
|  |  |
|  |  +--arpa
|  |  |
|  |  +--conf
|  |  |
|  |  +--...
|  |
|  +--php-4.x.x
|  |  |
|  |  +--build
|  |  |
|  |  +--...
|  |  |
|  |  +--win32
|  |  |
|  |  +--...
|  |
|  +--win32build
|  |  |
|  |  +--bin
|  |  |
|  |  +--include
|  |  |
|  |  +--lib

Erstellen Sie das Verzeichnis c:\usr\local\lib, und kopieren Sie bison.simple von c:\work\win32build\bin nach c:\usr\local\lib.

Anmerkung: Benutzer von Cygwin können den letzten auslassen. Eine entsprechend installierte Cygwin Umgebung bietet die erforderlichen Dateien bison.simple und bison.exe.


MVC ++ konfigurieren

Der nächste Vorbereitungsschritt ist die Konfiguration von MVC ++. Starten Sie Microsoft Visual C++, und wählen Sie im Menü Tools => Options aus. Wählen Sie in dem Dialog den Verzeichnis-Tab aus. Wechseln Sie zu Executables, Includes, and Library files. Ihre Einträge sollten wie folgt aussehen:

  • Executable files: c:\work\win32build\bin, Cygwin users: cygwin\bin

  • Include files: c:\work\win32build\include

  • Library files: c:\work\win32build\lib


resolv.lib erstellen

Sie müssen die resolv.lib Bibliothek erstellen. Entscheiden Sie, ob Sie die debug symbols verfügbar haben möchten (bindlib - Win32 Debug) oder nicht (bindlib - Win32 Release). Erstellen Sie die folgende Konfiguration:

  • Als Benutzer des GUI starten Sie VC++ und wählen Datei => Arbeitsbereich öffnen aus, navigieren zu c:\work\bindlib_w32 und selektieren bindlib.dsw. Dann wählen Sie Erstellen => Setze aktuelle Konfiguration und die gewünschte Konfiguration aus. Zum Schluss wählen Sie Erstellen => Rebuild All.

  • Als Benutzer der Kommandozeile stellen Sie sicher, dass Sie entweder die C++ Umgebungsvariablen registriert, oder vcvars.bat ausgeführt haben. Dann führen Sie eines der folgenden Kommandos aus:

    • msdev bindlib.dsp /MAKE "bindlib - Win32 Debug"

    • msdev bindlib.dsp /MAKE "bindlib - Win32 Release"

Nun sollten Sie eine verwendbare resolv.lib in Ihrem c:\work\bindlib_w32\Debug oder Release Unterverzeichnis haben. Kopieren Sie diese Datei nach c:\work\win32build\lib, und überschreiben Sie die dort vorhandene Datei mit dem selben Namen.


Kompilieren

Der einfachste Weg zu beginnen, ist das Erstellen der CGI Version.

  • Wenn Sie das GUI benutzen: Starten Sie VC++, selektieren Sie Datei => Arbeitsbereich öffnen, und wählen Sie c:\work\php-4.x.x\win32\php4ts.dsw aus. Dann selektieren Sie Erstellen => Setze aktuelle Konfiguration, und wählen die gewünschte Konfiguration aus (entweder php4ts - Win32 Debug_TS oder php4ts - Win32 Release_TS). Letztendlich wählen Sie Erstellen => Rebuild All.

  • Wenn Sie die Kommandozeile benutzen stellen Sie sicher, dass die C++ Environmentvariablen registriert sind oder starten Sie vcvars.bat, und führen in dem Verzeichnis c:\work\php-4.x.x\win32 eines der folgenden Kommandos aus:

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Debug_TS"

    • msdev php4ts.dsp /MAKE "php4ts - Win32 Release_TS"

    • Nun sollten Sie entweder in Ihrem Debug_TS oder Release_TS Unterverzeichnis eine verwendbare php.exe haben.

Durch editieren der main/config.win32.h.in ist es möglich, kleinere Adaptierungen zum Prozess des Erstellens vorzunehmen. So können Sie z.B. die inkludierten Erweiterungen, den Ort der php.ini, etc. ändern.

Als nächstes möchten Sie vielleicht die CLI Version erstellen, die für den Einsatz auf der Kommandozeile konzipiert wurde (PHP from the command line). Die Schritte sind die gleichen wie bei der CGI Version, außer dass Sie die Projektdateien php4ts_cli - Win32 Debug_TS bzw. php4ts_cli - Win32 Release_TS auswählen müssen. Nach dem erfolgreichen Kompilieren finden Sie die php.exe entweder in dem Verzeichnis Release_TS\cli\ oder in Debug_TS\cli\.

Anmerkung: Wenn Sie PEAR und das komfortable Installationsprogramm benutzen möchten, ist das CLI-SAPI erforderlich. Weitere Informationen zu PEAR und dem Installationsprogramm finden Sie in der Dokumentation auf der PEAR Webseite.

Um das SAPI Modul php4isapi.dll zur Integration von PHP mit Microsoft IIS zu erstellen, setzen Sie aktive Konfiguration auf php4isapi-wasimmer-config, und kompilieren Sie die gewünschte dll.


Installation von Windows Erweiterungen

Sind PHP und ein Webserver einmal auf Windows installiert, möchten Sie vielleicht einige Erweiterungen mit zusätzlicher Funktionalität installieren. Die folgende Tabelle beschreibt einige der verfügbaren Erweiterungen. Sie können Erweiterungen auswählen, welche beim Start von PHP geladen werden, indem Sie das Kommentarzeichen (';') in den entsprechenden 'extension=php_*.dll' Zeilen in der php.ini entfernen. Sie können ein Modul mittels dl() auch dynamisch laden.

Die DLLs für PHP Erweiterungen enthalten als Präfix 'php_' (und 'php3_' in PHP 3), um Verwechslungen zwischen PHP Erweiterungen und deren unterstützenden Bibliotheken zu vermeiden.

Anmerkung: In PHP 4.0.6 ist die Unterstützung für BCMath, Calendar, COM, FTP, MySQL, ODBC, PCRE, Session, WDDX und XML inkludiert. Um diese Funktionen zu benutzen, brauchen Sie keine zusätzlichen Erweiterungen zu laden. Eine Liste der bereits inkludierten Module befindet sich in der README.txt oder install.txt Ihrer Distribution.

Anmerkung: Einige Erweiterungen benötigen externe DLLs, wovon bereits einige im Verzeichnis 'dlls' der PHP Distribution enthalten sind. Manche Erweiterungen benötigen jedoch DLLs, welche nicht in der PHP Distribution enthalten sind, wie z.B. Oracle (php_oci8.dll).

Kopieren Sie die DLLs vom Verzeichnis 'dlls' in Ihren Windows PATH, gute Plätze sind:

c:\windows\system auf Windows 9x/Me
c:\winnt\system32 auf Windows NT/2000
c:\windows\system32 auf Windows XP

Sollten diese Dateien bereits auf Ihrem System installiert sein, überschreiben Sie diese nur, wenn etwas nicht korrekt läuft (Vor dem Überschreiben empfehlen wir ein Backup, oder verschieben diese Dateien in ein anderes Verzeichnis - nur für den Fall dass etwas schiefgeht).

Tabelle 3-1. PHP Erweiterungen (Extensions)

ErweiterungBeschreibungAnmerkungen
php_bz2.dllbzip2 KomprimierungsfunktionenKeine
php_calendar.dllKalender UmwandlungsfunktionenIst seit PHP 4.0.3 integriert
php_cpdf.dllClibPDF FunktionenKeine
php_crack.dllCrack FunktionenKeine
php3_crypt.dllVerschlüsselungsfunktionenKeine
php_ctype.dllctype FunktionenKeine
php_curl.dllCURL, Client URL BibliotheksfunktionenBenötigt libeay32.dll, ssleay32.dll (bundled)
php_cybercash.dllCybercash Zahlungssystem FunktionenKeine
php_db.dllDBM FunktionenVeraltet, verwenden Sie stattdessen DBA (php_dba.dll)
php_dba.dllDBA Datenbank (dbm-style) Abstraktions-FunktionenKeine
php_dbase.dlldBase FunktionenKeine
php3_dbm.dllBerkeley DB2 BibliothekKeine
php_domxml.dllDOM XML FunktionenBenötigt libxml2.dll (bundled)
php_dotnet.dll.NET FunktionenKeine
php_exif.dllLiest EXIF Headers einer JPEG-GrafikKeine
php_fbsql.dllFrontBase FunktionenKeine
php_fdf.dllFDF Forms Data Format Funktionen.Benötigt fdftk.dll (bundled)
php_filepro.dllfilePro FunktionenNur Lesezugriff
php_ftp.dllFTP FunktionenIst seit PHP 4.0.3 integriert
php_gd.dllGD BibliotheksfunktionenKeine
php_gd2.dllGD2 Bibliotheksfunktionen zur BildmanipulationKeine
php_gettext.dllGettext FunktionenBenötigt gnu_gettext.dll (bundled)
php_hyperwave.dllHyperWave FunktionenKeine
php_iconv.dllICONV ZeichensatzumwandlungBenötigt iconv-1.3.dll (bundled)
php_ifx.dllInformix FunktionenBenötigt Informix Bibliotheken
php_iisfunc.dllIIS Managementfunktionenkeine
php_imap.dllIMAP POP3 und NNTP FunktionenPHP 3: php3_imap4r1.dll
php_ingres.dllIngres II FunktionenBenötigt Ingres II Bibliotheken
php_interbase.dllInterBase FunktionenBenötigt gds32.dll (bundled)
php_java.dllJava extensionBenötigt jvm.dll (bundled)
php_ldap.dllLDAP FunktionenBenötigt libsasl.dll (bundled)
php_mhash.dllMhash FunktionenKeine
php_ming.dllMing Funktionen für FlashKeine
php_msql.dllmSQL FunktionenBenötigt msql.dll (bundled)
php3_msql1.dllmSQL 1 Clientunknown
php3_msql2.dllmSQL 2 Clientunknown
php_mssql.dllMSSQL FunktionenBenötigt ntwdblib.dll (bundled)
php3_mysql.dllMySQL FunktionenIn PHP 4 integriert
php3_nsmail.dllNetscape Mail Funktionenunknown
php3_oci73.dllOracle Funktionenunknown
php_oci8.dllOracle 8 FunktionenBenötigt Oracle 8 Client Bibliotheken
php_openssl.dllOpenSSL FunktionenBenötigt libeay32.dll (bundled)
php_oracle.dllOracle FunktionenBenötigt Oracle 7 Client Bibliotheken
php_pdf.dllPDF FunktionenKeine
php_pgsql.dllPostgreSQL FunktionenKeine
php_printer.dllPrinter FunktionenKeine
php_xslt.dllXSLT FunktionenBenötigt sablot.dll (bundled)
php_snmp.dllSNMP get and walk FunktionenNur NT!
php_sybase_ct.dllSybase FunktionenBenötigt Sybase Client Bibliotheken
php_yaz.dllYAZ FunktionenKeine
php_zlib.dllZLib KomprimierungsfunktionenKeine


Server-CGI/Commandline

Standardmäßig wird PHP als ein CGI Programm kompiliert. Dies erstellt einen Kommandozeileninterpreter, welcher für CGI Processing oder für nicht webbezogene PHP Skripte verwendet werden kann. Haben Sie einen Webserver im Einsatz für welchen PHP eine Modulunterstützung bietet, sollten sie aus Performancegründen dieses Modul verwenden. Die CGI Version ermöglicht Apache Usern, verschiedene PHP Seiten unter verschiedenen User-IDs laufen zu lassen. Bitte lesen Sie das Kapitel Sicherheit, wenn Sie PHP als CGI verwenden.

Seit PHP 4.3.0 wurden PHP einige wichtige Dinge hinzugefügt. Es gibt ein neues SAPI, CLI genannt, welches den selben Namen trägt wie das CGI Programm. Was in {PREFIX}/bin/php installiert ist, ist von Ihrer 'Configure'-Zeile abhängig. Eine detaillierte Beschreibung dazu finden Sie im Abschnitt Using PHP from the command line.


Testen

Wenn Sie PHP als CGI Programm erstellt haben, können Sie Ihren Build mittels make test testen, was generell eine gute Idee ist. Damit können Sie ein eventuelles Problem mit PHP auf Ihrer Plattform erkennen, bevor Sie später damit zu kämpfen haben.


Benchmarking

Haben Sie PHP 3 als CGI Programm erstellt, können Sie Ihren Build mit make bench bewerten. Beachten Sie, dass wenn safe mode standardmäßig aktiviert ist, der Benchmark nicht fertiggestellt werden kann, sollte dieser länger als die erlaubten 30 Sekunden dauern. Der Grund dafür liegt in der Tatsache, dass set_time_limit() in safe mode nicht benutzt werden kann. Verwenden Sie die Konfigurationsoption max_execution_time, um diese Zeit für Ihre eigenen Skripte einzustellen. make bench ignoriert die Konfigurationsdatei.

Anmerkung: make bench ist nur in PHP 3 verfügbar.


Variablen verwenden

Manche vom Server zur Verfügung gestellten Umgebungsvariablen sind nicht der aktuellen CGI/1.1 Spezifikation enthalten. Nur die folgenden Variablen sind dort definiert, alles andere sollte als 'Anbieterspezifisch' betrachtet werden: AUTH_TYPE, CONTENT_LENGTH, CONTENT_TYPE, GATEWAY_INTERFACE, PATH_INFO, PATH_TRANSLATED, QUERY_STRING, REMOTE_ADDR, REMOTE_HOST, REMOTE_IDENT, REMOTE_USER, REQUEST_METHOD, SCRIPT_NAME, SERVER_NAME, SERVER_PORT, SERVER_PROTOCOL und SERVER_SOFTWARE


Server - Apache

Dieser Abschnitt enthält Anmerkungen und Tipps zur Installation von Apache mit PHP, sowohl für die Unix als auch für die Windows Version. Es gibt auch eine eigene Seite mit instructions and notes for Apache 2.


Details der Installation von PHP mit Apache auf Unix

Aus der Kompletten Liste der Konfigurationsoptionen können Sie die weitere Argumente für configure in Zeile 10 wählen. Um sicherzustellen, dass die folgenden Instruktionen nicht inkorrekt sind, wurden die Versionsnummern hier weggelassen. Ersetzen Sie bitte die hier angeführten 'xxx' mit den korrekten Werten Ihrer Dateien.

Beispiel 3-5. Installationsanweisungen (Apache Modulversion) für PHP 4

1.  gunzip apache_xxx.tar.gz
2.  tar -xvf apache_xxx.tar
3.  gunzip php-xxx.tar.gz
4.  tar -xvf php-xxx.tar
5.  cd apache_xxx
6.  ./configure --prefix=/www --enable-module=so
7.  make
8.  make install
9.  cd ../php-xxx
10. ./configure --with-mysql --with-apxs=/www/bin/apxs
11. make
12. make install

  Wenn Sie Ihre Konfigurationsoptionen nach der Installation ändern
  möchten, müssen Sie nur die letzten 3 Schritte wiederholen. Sie
  müssen Apache nur neu starten, um das neue Modul einzubinden.
  Apache neu zu kompilieren ist nicht notwendig.

13. cp php.ini-dist /usr/local/lib/php.ini

  Sie können Ihre .ini Datei editieren, um PHP Optionen zu setzen. Wenn
  Sie diese Datei an einer anderen Stelle haben möchten, verwenden Sie
  --with-config-file-path=/path in Schritt 10.

14. Editieren Sie die httpd.conf oder srm.conf Datei und stellen Sie
    sicher, dass folgende Zeilen vorhanden und nicht auskommentiert sind:
  
   AddType application/x-httpd-php .php

   LoadModule php4_module        libexec/libphp4.so
 
  Hier können Sie jede gewünschte Erweiterung auswählen. .php wird
  vorgeschlagen. Sie können auch .html, und .php3 zwecks
  Rückwärtskompatibilität auswählen.
  
  Der Pfad auf der rechten Seite des LoadModule Satements muss auf den
  Pfad des PHP Moduls auf Ihrem System zeigen. Das obige Statement passt
  zu den oben gezeigten Schritten.

15. Starten Sie den Apache Server mittels Ihrer normalen Prozedur. (Sie
    müssen den Server stoppen und neu starten, und nicht nur mittels
    eines HUP oder ISR1 Signals einen Reload initiieren.)

Abhängig von Ihrer Apache Installation und Unix Variante gibt es viele mögliche Wege, den Server zu stoppen und neu zu starten. Nachstehend finden Sie einige typische Zeilen für einen Server Restart auf verschiedenen apache/unix Installationen. Ersetzen Sie /path/to/ mit dem Pfad zu diesen Applikationen auf Ihrem System.

1. Verschiedene Linux und SysV Varianten:
/etc/rc.d/init.d/httpd restart

2. Verwenden von apachectl Skripten:
/path/to/apachectl stop
/path/to/apachectl start

3. httpdctl und httpsdctl (verwendet OpenSSL), ähnlich wie apachectl:
/path/to/httpsdctl stop
/path/to/httpsdctl start

4. Verwenden von mod_ssl, oder einem anderem SSL Server möchten Sie
vielleicht manuell stoppen und starten:
/path/to/apachectl stop
/path/to/apachectl startssl

Die Orte wo sich die Programme apachectl und http(s)dctl befinden, sind oft unterschiedlich. Falls Ihr System über die Kommandos locate, whereis, oder which verfügt, können diese bei der Suche nach den Server Kontrollprogrammen sehr hilfreich sein.

Einige Beispiele zum Kompilieren von PHP für Apache:

./configure --with-apxs --with-pgsql

Dies erstellt eine libphp4.so Shared Library, welche in den Apache geladen wird, wenn eine LoadModule Zeile in der httpd.conf von Apache existiert. Die PostgreSQL Unterstützung ist in der libphp4.so Bibliothek eingelagert.

./configure --with-apxs --with-pgsql=shared

Dies erstellt ebenfalls eine libphp4.so Shared Library, jedoch wird zusätzlich auch eine pgsql.so Shared Library erstellt. Diese wird entweder aufgrund der Extension Option in der php.ini, oder durch die Verwendung der Funktion dl() in einem Skript von PHP geladen.

./configure --with-apache=/path/to/apache_source --with-pgsql

Dies erstellt eine libmodphp4.a Bibliothek, eine mod_php4.c sowie einige begleitende Dateien, und kopiert diese in das src/modules/php4 Verzeichnis im Apache Source Tree. Dann kompilieren Sie Apache mit --activate-module=src/modules/php4/libphp4.a, und das Apache Build System erstellt libphp4.a, und linkt es statisch in die httpd Binary. Die PostgreSQL Unterstützung ist in dieser httpd Binary inkludiert, was in einer einzigen httpd Binary inkl. komplettem Apache und komplettem PHP resultiert.

./configure --with-apache=/path/to/apache_source --with-pgsql=shared

Wie vorher, außer dass die PostgreSQL Unterstützung nicht direkt in die httpd inkludiert, sondern eine pgsql.so Shared Library erstellt wird. Diese können Sie entweder mittels der Extension Option in der php.ini, oder direkt mittels dl() in PHP laden.

Bevor Sie sich für eine Methode PHP zu kompilieren entscheiden, sollten Sie die Vor- und Nachteile der jeweiligen Methode bedenken. Die Kompilation als verteiltes Objekt heißt, dass Sie Apache separat kompilieren können, und nicht für alles in PHP hinzugefügte bzw. geänderte neu kompilieren müssen. PHP direkt in Apache einzukompilieren (statische Methode) heißt, dass PHP schneller lädt und schneller läuft. Weitere Informationen finden Sie auf der Apache webpage on DSO support.

Anmerkung: Die httpd.conf von Apache kommt derzeit mit einem Abschnitt wie folgt:

User nobody
Group "#-1"

Wenn Sie diese Gruppe nicht auf "Group nogroup" oder etwas ähnliches ("Group daemon" ist auch weit verbreitet) ändern, kann PHP keine Dateien öffnen.

Anmerkung: Wenn Sie --with-apxs=/path/to/apxs verwenden, spezifizieren Sie die installierte Version von apxs. Sie sollten die in den Apache Sourcen enthaltene apxs Version NICHT verwenden, sondern jene, welche sich aktuell auf Ihrem System befindet.


Installation von PHP auf Windows mit Apache 1.3.x

Es gibt zwei Arten, PHP mit Apache 1.3.x unter Windows aufzusetzen. Eine ist die Verwendung des CGI Moduls (php.exe), die andere ist der Einsatz der Apache Modul DLL. In beiden Fällen müssen Sie den Apache Server stoppen, und Ihre srm.conf oder httpd.conf editieren, um Apache für die Zusammenarbeit mit PHP zu konfigurieren.

Es ist erwähnenswert, dass die Stabilität des SAPI Moduls erhöht wurde, und dass wir aufgrund der höheren Transparenz und Sicherheit den Einsatz gegenüber dem CGI Programm bevorzugt empfehlen.

Obwohl einige Variationen in der Konfiguration von PHP unter Apache möglich sind, sollten diese auch für Neulinge einfach genug sein. Für weitere Konfigurationsmöglichkeiten konsultieren Sie bitte die Apache Dokumentation.

Wenn Sie die PHP Distribution wie im Abschnitt Manuelle Installationsschritte beschrieben nach c:\php\ entpackt haben, müssen Sie die folgenden Zeilen in Ihrer Apache Konfigurationsdatei einfügen, um das CGI-Modul aufzusetzen:

  • ScriptAlias /php/ "c:/php/"

  • AddType application/x-httpd-php .php .phtml

  • Action application/x-httpd-php "/php/php.exe"

Beachten Sie, dass die zweite Zeile der obigen Liste in den aktuellen Versionen von httpd.conf bereits enthalten, jedoch auskommentiert ist. Vergessen Sie nicht, c:/php/ durch den aktuellen Pfad zu PHP zu ersetzen.

Warnung

Wenn Sie das CGI Setup verwenden, ist Ihr Server für verschiedene mögliche Angriffe offen. Informationen, wie Sie sich vor Angriffen schützen können, finden Sie im Abschnitt CGI Sicherheit

Wenn Sie PHP als Apache Modul einsetzen möchten, kopieren Sie die php4ts.dll in Ihr windows/system (für Windows 9x/Me) oder winnt/system32 (für Windows NT/2000/XP) Verzeichnis, und überschreiben die dort eventuell bereits existierende Datei. Dann sollten Sie die folgenden zwei Zeilen in Ihrer Apache httpd.conf Datei einfügen:

  • LoadModule php4_module c:/php/sapi/php4apache.dll

  • AddType application/x-httpd-php .php .phtml

Vergessen Sie nicht, nach der Änderung der Konfigurationsdatei den Server neu zu starten, z.B. mit NET STOP APACHE, gefolgt von NET START APACHE wenn Sie Apache als Windows Service nutzen, oder verwenden Sie Ihre üblichen Shortcuts.

Warnung

Nachdem Sie den Windows Installer für Apache benutzt haben könnte es nötig sein, dass Sie die AddModule Direktive für mod_php4.c in der Konfigurationsdatei (httpd.conf) definieren müssen. Dies tun Sie, indem Sie der AddModule Liste ziemlich am Anfang der Konfigurationsdatei den Eintrag AddModule mod_php4.c hinzufügen. Dies ist speziell dann wichtig, wenn die Direktive ClearModuleList definiert ist. Wenn Sie dies nicht tun heißt das, dass PHP nicht als Apache Modul registriert ist.

Es gibt zwei Arten, wie Sie das Feature Source Code Highlighting verwenden können, auch wenn deren Funktionsfähigkeit von Ihrer Installation abhängt. Wenn Sie Apache so konfiguriert haben, dass er PHP als SAPI Modul verwendet, können Sie dieses Feature verwenden, indem Sie die folgende Zeile in ihre Konfigurationsdatei (httpd.conf) einfügen: AddType application/x-httpd-php-source .phps

Haben Sie Apache so konfiguriert, dass er PHP als CGI Programm verwendet, müssen Sie die Funktion show_source() benutzen. Dies tun Sie, indem einfach ein PHP Skript mit folgendem Code erstellen: <?php show_source ("original_php_script.php"); ?>. Ersetzen Sie original_php_script.php durch den Dateinamen des Skriptes, dessen Source Sie zeigen wollen.

Anmerkung: Bei Apache unter Windows müssen alle Backslashes in einer Pfadangabe wie z.B. "c:\directory\file.ext" durch Slashes ersetzt werden, wie z.B. "c:/directory/file.ext".


Servers-Apache 2.0

This section contains notes and hints specific to Apache 2.0 installs of PHP, both for Unix and Windows versions.

Warnung

Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.

You are highly encouraged to take a look at the Apache Documentation to get a basic understanding of the Apache 2.0 Server.


PHP and Apache 2.0 compatibility notes

The following versions of PHP are known to work with the most recent version of Apache 2.0:

These versions of PHP are compatible to Apache 2.0.40 and later.

Anmerkung: Apache 2.0 SAPI-support started with PHP 4.2.0. PHP 4.2.3 works with Apache 2.0.39, don't use any other version of Apache with PHP 4.2.3. However, the recommended setup is to use PHP 4.3.0 or later with the most recent version of Apache2.

All mentioned versions of PHP will work still with Apache 1.3.x.


PHP and Apache 2 on Linux

Download the most recent version of Apache 2.0 and a fitting PHP version from the above mentioned places. This quick guide covers only the basics to get started with Apache 2.0 and PHP. For more information read the Apache Documentation. The version numbers have been omitted here, to ensure the instructions are not incorrect. You will need to replace the 'NN' here with the correct values from your files.

Beispiel 3-6. Installation Instructions (Apache 2 Shared Module Version)

1.  gzip -d httpd-2_0_NN.tar.gz
2.  tar xvf httpd-2_0_NN.tar
3.  gunzip php-NN.tar.gz
4.  tar -xvf php-NN.tar
5.  cd httpd-2_0_NN
6.  ./configure --enable-so
7.  make
8.  make install

    Now you have Apache 2.0.NN available under /usr/local/apache2,
    configured with loadable module support and the standard MPM prefork.
    To test the installation use your normal procedure for starting
    the Apache server, e.g.:
    /usr/local/apache2/bin/apachectl start
    and stop the server to go on with the configuration for PHP:
    /usr/local/apache2/bin/apachectl stop.

9.  cd ../php4-NN
10. ./configure --with-apxs2=/usr/local/apache2/bin/apxs
11. make
12. make install
13. cp php.ini-dist /usr/local/lib/php.ini

    Edit your php.ini file to set PHP options. If
    you prefer this file in another location, use
    --with-config-file-path=/path in step 10.

14. Edit your httpd.conf file and check that these lines are
    present:
  
   LoadModule php4_module modules/libphp4.so
   AddType application/x-httpd-php .php

  You can choose any extension you wish here. .php is simply the one
  we suggest.
 
  The path on the right hand side of the LoadModule statement must point
  to the path of the PHP module on your system. The above statement is
  correct for the steps shown above.

15. Use your normal procedure for starting the Apache server, e.g.:
   /usr/local/apache2/bin/apachectl start

Following the steps above you will have a running Apache 2.0 with support for PHP as SAPI module. Of course there are many more configuration options available for both, Apache and PHP. For more information use ./configure --help in the corresponding source tree. In case you wish to build a multithreaded version of Apache 2.0 you must overwrite the standard MPM-Module prefork either with worker or perchild. To do so append to your configure line in step 6 above either the option --with-mpm=worker or --with-mpm=perchild. Take care about the consequences and understand what you are doing. For more information read the Apache documentation about the MPM-Modules.

Anmerkung: To build a multithreaded version of Apache your system must support threads. This also implies to build PHP with experimental Zend Thread Safety (ZTS). Therefore not all extensions might be available. The recommended setup is to build Apache with the standard prefork MPM-Module.


PHP and Apache 2.0 on Windows

Consider to read the Windows specific notes for Apache 2.0.

Warnung

Apache 2.0 is designed to run on Windows NT 4.0, Windows 2000 or Windows XP. At this time, support for Windows 9x is incomplete. Apache 2.0 is not expected to work on those platforms at this time.

Download the most recent version of Apache 2.0 and a fitting PHP version from the above mentioned places. Follow the Manual Installation Steps and come back to go on with the integration of PHP and Apache.

There are two ways to set up PHP to work with Apache 2.0 on Windows. One is to use the CGI binary the other is to use the Apache module DLL. In either case you need to stop the Apache server, and edit your httpd.conf to configure Apache to work with PHP.

You need to insert these three lines to your Apache httpd.conf configuration file to set up the CGI binary:

Beispiel 3-7. PHP and Apache 2.0 as CGI

ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"

If you would like to use PHP as a module in Apache 2.0, be sure to move php4ts.dll to winnt/system32 (for Windows NT/2000) or windows/system32 (for Windows XP), overwriting any older file. You need to insert these two lines to your Apache httpd.conf configuration file to set up the PHP-Module for Apache 2.0:

Beispiel 3-8. PHP and Apache 2.0 as Module

LoadModule php4_module "c:/php/sapi/php4apache2.dll"
AddType application/x-httpd-php .php

Anmerkung: Remember to substitute the c:/php/ for your actual path to PHP in the above examples. Take care to use php4apache2.dll in your LoadModule directive and notphp4apche.dll. The latter one is designd to run with Apache 1.3.x.

Warnung

Don't mix up your installation with dll files from different PHP versions . You have the only choice to use the dll's and extensions that ship with your downloaded PHP version.


Server - Caudium

PHP 4 kann als Pike Modul für den Caudium Webserver erstellt werden, was jedoch mit PHP 3 nicht unterstützt wird. Folgen Sie einfach den nachstehenden Instruktionen, um PHP 4 für Caudium zu installieren.

Beispiel 3-9. Caudium Installationsanweisungen

1.  Installieren Sie Caudium bevor Sie versuchen, PHP 4 zu installieren
    Damit PHP 4 korrekt läuft, benötigen Sie Pike 7.0.268 oder höher.
    In diesem Beispiel nehmen wir an, dass Caudium in /opt/caudium/server/
    installiert ist.
2.  Wechseln Sie in das Verzeichnis php-x.y.z (x.y.z entspricht der
    Versionsnummer)
3.  ./configure --with-caudium=/opt/caudium/server
4.  make
5.  make install
6.  Sollte Caudium gerade laufen, starten Sie ihn neu
7.  Öffnen Sie die grafische Konfigurationsoberfläche, und wechseln Sie
    zu dem virtuellen Server, welcher die PHP 4 Unterstützung bieten soll.
8.  Klicken Sie auf Add Module, und fügen Sie das PHP 4 Script Support
    Modul hinzu. 
9.  Sollte die Dokumentation meinen 'PHP 4 interpreter isn't available',
    vergewissern Sie sich, dass der Server neu gestartet wurde. Prüfen
    Sie /opt/caudium/logs/debug/default.1 auf Fehler in Bezug auf 
    <filename>PHP4.so</filename>. Vergewissern Sie sich ebenfalls, dass
    <filename>caudium/server/lib/[pike-version]/PHP4.so</filename>
    vorhanden ist.
10. Konfigurieren Sie das PHP Script Support Module wenn nötig.

Sie können Ihr Caudium Modul natürlich mit Unterstützung der verschiedenen in PHP 4 verfügbaren Erweiterungen kompilieren. Eine gute Übersicht hierfür bietet die Komplette Liste der Konfigurationsoptionen.

Anmerkung: Wenn Sie PHP 4 mit MySQL Unterstützung kompilieren müssen Sie sicherstellen, dass der normale MySQL Client Code verwendet wird. Andernfalls könnten Konflikte auftreten, wenn Ihr Pike MySQL bereits Unterstützt. Dies tun Sie, indem Sie ein MySQL Installationsverzeichnis mittels der --with-mysql spezifizieren.


Server - fhttpd

Um PHP als ein fhttpd Modul zu erstellen, beantworten Sie die Frage "Build as an fhttpd module?" mit "yes" (die Konfigurationsoption --with-fhttpd=DIR), und geben das Basisverzeichnis des fhttpd Source an. Das Standardverzeichnis ist /usr/local/src/fhttpd. Wenn Sie fhttpd benutzen, bietet das Kompilieren von PHP als Modul eine bessere Performance, mehr Kontrolle, sowie die Möglichkeit zur Remote Execution.


Servers-IIS/PWS

This section contains notes and hints specific to IIS (Microsoft Internet Information Server). Installing PHP for PWS/IIS 3, PWS 4 or newer and IIS 4 or newer versions.

Important for CGI users: Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0.


Windows and PWS/IIS 3

The recommended method for configuring these servers is to use the REG file included with the distribution (pws-php4cgi.reg). You may want to edit this file and make sure the extensions and PHP install directories match your configuration. Or you can follow the steps below to do it manually.

Warnung

These steps involve working directly with the Windows registry. One error here can leave your system in an unstable state. We highly recommend that you back up your registry first. The PHP Development team will not be held responsible if you damage your registry.

  • Run Regedit.

  • Navigate to: HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /W3Svc /Parameters /ScriptMap.

  • On the edit menu select: New->String Value.

  • Type in the extension you wish to use for your php scripts. For example .php

  • Double click on the new string value and enter the path to php.exe in the value data field. ex: c:\php\php.exe.

  • Repeat these steps for each extension you wish to associate with PHP scripts.

The following steps do not affect the web server installation and only apply if you want your php scripts to be executed when they are run from the command line (ex. run c:\myscripts\test.php) or by double clicking on them in a directory viewer window. You may wish to skip these steps as you might prefer the PHP files to load into a text editor when you double click on them.

  • Navigate to: HKEY_CLASSES_ROOT

  • On the edit menu select: New->Key.

  • Name the key to the extension you setup in the previous section. ex: .php

  • Highlight the new key and in the right side pane, double click the "default value" and enter phpfile.

  • Repeat the last step for each extension you set up in the previous section.

  • Now create another New->Key under HKEY_CLASSES_ROOT and name it phpfile.

  • Highlight the new key phpfile and in the right side pane, double click the "default value" and enter PHP Script.

  • Right click on the phpfile key and select New->Key, name it Shell.

  • Right click on the Shell key and select New->Key, name it open.

  • Right click on the open key and select New->Key, name it command.

  • Highlight the new key command and in the right side pane, double click the "default value" and enter the path to php.exe. ex: c:\php\php.exe -q %1. (don't forget the %1).

  • Exit Regedit.

  • If using PWS on Windows, reboot to reload the registry.

PWS and IIS 3 users now have a fully operational system. IIS 3 users can use a nifty tool from Steven Genusa to configure their script maps.


Windows and PWS 4 or newer

When installing PHP on Windows with PWS 4 or newer version, you have two options. One to set up the PHP CGI binary, the other is to use the ISAPI module DLL.

If you choose the CGI binary, do the following:

  • Edit the enclosed pws-php4cgi.reg file (look into the SAPI dir) to reflect the location of your php.exe. Backslashes should be escaped, for example: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="c:\\php\\php.exe" Now merge this registery file into your system; you may do this by double-clicking it.

  • In the PWS Manager, right click on a given directory you want to add PHP support to, and select Properties. Check the 'Execute' checkbox, and confirm.

If you choose the ISAPI module, do the following:

  • Edit the enclosed pws-php4isapi.reg file (look into the SAPI dir) to reflect the location of your php4isapi.dll. Backslashes should be escaped, for example: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map] ".php"="c:\\php\\sapi\\php4isapi.dll" Now merge this registery file into your system; you may do this by double-clicking it.

  • In the PWS Manager, right click on a given directory you want to add PHP support to, and select Properties. Check the 'Execute' checkbox, and confirm.


Windows NT/2000/XP and IIS 4 or newer

To install PHP on an NT/2000/XP Server running IIS 4 or newer, follow these instructions. You have two options to set up PHP, using the CGI binary (php.exe) or with the ISAPI module.

In either case, you need to start the Microsoft Management Console (may appear as 'Internet Services Manager', either in your Windows NT 4.0 Option Pack branch or the Control Panel=>Administrative Tools under Windows 2000/XP). Then right click on your Web server node (this will most probably appear as 'Default Web Server'), and select 'Properties'.

If you want to use the CGI binary, do the following:

  • Under 'Home Directory', 'Virtual Directory', or 'Directory', click on the 'Configuration' button, and then enter the App Mappings tab.

  • Click Add, and in the Executable box, type: c:\php\php.exe (assuming that you have unziped PHP in c:\php\).

  • In the Extension box, type the file name extension you want associated with PHP scripts. Leave 'Method exclusions' blank, and check the Script engine checkbox. You may also like to check the 'check that file exists' box - for a small performance penalty, IIS (or PWS) will check that the script file exists and sort out authentication before firing up php. This means that you will get sensible 404 style error messages instead of cgi errors complaining that php did not output any data.

    You must start over from the previous step for each extension you want associated with PHP scripts. .php and .phtml are common, although .php3 may be required for legacy applications.

  • Set up the appropriate security. (This is done in Internet Service Manager), and if your NT Server uses NTFS file system, add execute rights for I_USR_ to the directory that contains php.exe.

To use the ISAPI module, do the following:

  • If you don't want to perform HTTP Authentication using PHP, you can (and should) skip this step. Under ISAPI Filters, add a new ISAPI filter. Use PHP as the filter name, and supply a path to the php4isapi.dll.

  • Under 'Home Directory', click on the 'Configuration' button. Add a new entry to the Application Mappings. Use the path to the php4isapi.dll as the Executable, supply .php as the extension, leave Method exclusions blank, and check the Script engine checkbox.

  • Stop IIS completely (NET STOP iisadmin)

  • Start IIS again (NET START w3svc)


Servers-Netscape and iPlanet

This section contains notes and hints specific to Netscape and iPlanet installs of PHP, both for Sun Solaris and Windows versions.

You can find more information about setting up PHP for the Netscape Enterprise Server here: http://benoit.noss.free.fr/php/install-php4.html


Installing PHP with Netscape on Sun Solaris

To build PHP with NES or iPlanet web servers, enter the proper install directory for the --with-nsapi = DIR option. The default directory is usually /opt/netscape/suitespot/. Please also read /php-xxx-version/sapi/nsapi/nsapi-readme.txt.

Beispiel 3-10. Installation Example for Netscape Enterprise on Solaris

Instructions for Sun Solaris 2.6 with Netscape Enterprise Server 3.6
From: bhager@invacare.com

1. Install the following packages from www.sunfreeware.com or another
download site: 

    flex-2_5_4a-sol26-sparc-local 
    gcc-2_95_2-sol26-sparc-local 
    gzip-1.2.4-sol26-sparc-local 
    perl-5_005_03-sol26-sparc-local 
    bison-1_25-sol26-sparc-local 
    make-3_76_1-sol26-sparc-local 
    m4-1_4-sol26-sparc-local 
    autoconf-2.13 
    automake-1.4 
    mysql-3.23.24-beta (if you want mysql support) 
    tar-1.13 (GNU tar) 

2. Make sure your path includes the proper directories
    PATH=.:/usr/local/bin:/usr/sbin:/usr/bin:/usr/ccs/bin 
    export PATH 

3. gunzip php-x.x.x.tar.gz (if you have a .gz dist, otherwise go to 4) 
4. tar xvf php-x.x.x.tar 
5. cd ../php-x.x.x 

6. For the following step, make sure /opt/netscape/suitespot/ is where
   your netscape server is installed. Otherwise, change to correct path:
    /configure --with-mysql=/usr/local/mysql --with-nsapi=/opt/netscape/suitespot/ --enable-track-vars --enable-libgcc 
7. make 
8. make install
After performing the base install and reading the appropriate readme file, you may need to performs some additional configuration steps.

Firstly you may need to add some paths to the LD_LIBRARY_PATH environment for Netscape to find all the shared libs. This can best done in the start script for your Netscape server. Windows users can probably skip this step. The start script is often located in: /path/to/server/https-servername/start

You may also need to edit the configuration files that are located in:/path/to/server/https-servername/config/.

Beispiel 3-11. Configuration Example for Netscape Enterprise

Configuration Instructions for Netscape Enterprise Server
From: bhager@invacare.com

1. Add the following line to mime.types:
    type=magnus-internal/x-httpd-php exts=php

2. Add the following to obj.conf, shlib will vary depending on
    your OS, for unix it will be something like
    /opt/netscape/suitespot/bin/libphp4.so.

    You should place the following lines after mime types init.
    Init fn="load-modules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" shlib="/php4/nsapiPHP4.dll"
    Init fn=php4_init errorString="Failed to initialize PHP!"

    <object name="default">
    . 
    . 
    . 
    .#NOTE this next line should happen after all 'ObjectType' and before all 'AddLog' lines 
    Service fn="php4_execute" type="magnus-internal/x-httpd-php" 
    . 
    . 
    </Object>


    <Object name="x-httpd-php"> 
    ObjectType fn="force-type" type="magnus-internal/x-httpd-php" 
    Service fn=php4_execute 
    </Object> 


    Authentication configuration 

    PHP authentication cannot be used with any other authentication. ALL AUTHENTICATION IS 
    PASSED TO YOUR PHP SCRIPT. To configure PHP Authentication for the entire server, add 
    the following line: 

    <Object name="default"> 
    AuthTrans fn=php4_auth_trans 
    . 
    . 
    . 
    . 
    </Object> 

    To use PHP Authentication on a single directory, add the following: 

    <Object ppath="d:\path\to\authenticated\dir\*"> 
    AuthTrans fn=php4_auth_trans 
    </Object>

If you are running Netscape Enterprise 4.x, then you should use the following:

Beispiel 3-12. Configuration Example for Netscape Enterprise 4.x

Place these lines after the mime types init, and everything else is similar
to the example configuration above.
From: Graeme Hoose (GraemeHoose@BrightStation.com)

Init fn="load-modules" shlib="/path/to/server4/bin/libphp4.so" funcs="php4_init,php4_close,php4_execute,php4_auth_trans"
Init fn="php4_init" LateInit="yes"

Installing PHP with Netscape on Windows

To Install PHP as CGI (for Netscape Enterprise Server, iPlanet, perhaps Fastrack), do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed windows)

  • Make a file association from the command line. Type the following two lines:
    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a dummy shellcgi directory and remove it just after (this step creates 5 important lines in obj.conf and allow the web server to handle shellcgi scripts).

  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/shellcgi, File Suffix:php).

  • Do it for each web server instance you want php to run

More details about setting up PHP as a CGI executable can be found here: http://benoit.noss.free.fr/php/install-php.html

To Install PHP as NSAPI (for Netscape Enterprise Server, iPlanet, perhaps Fastrack, do the following:

  • Copy php4ts.dll to your systemroot (the directory where you installed windows)

  • Make a file association from the command line. Type the following two lines:
    assoc .php=PHPScript
    ftype PHPScript=c:\php\php.exe %1 %*

  • In the Netscape Enterprise Administration Server create a new mime type (Category: type, Content-Type: magnus-internal/x-httpd-php, File Suffix:php).

  • Stop your web service and edit obj.conf. At the end of the Init section, place these two lines (necessarily after mime type init!):
    Init fn="load-modules" funcs="php4_init,php4_close,php4_execute,php4_auth_trans" shlib="c:/php/sapi/php4nsapi.dll"
    Init fn="php4_init" errorString="Failed to initialise PHP!"

  • In The < Object name="default" > section, place this line necessarily after all 'ObjectType' and before all 'AddLog' lines:
    Service fn="php4_execute" type="magnus-internal/x-httpd-php"

  • At the end of the file, create a new object called x-httpd-php, by inserting these lines:
    <Object name="x-httpd-php">
    ObjectType fn="force-type" type="magnus-internal/x-httpd-php"
    Service fn=php4_execute
    </Object>

  • Restart your web service and apply changes

  • Do it for each web server instance you want PHP to run

More details about setting up PHP as an NSAPI filter can be found here: http://benoit.noss.free.fr/php/install-php4.html


Servers-OmniHTTPd Server

This section contains notes and hints specific to OmniHTTPd.


OmniHTTPd 2.0b1 and up for Windows

You need to complete the following steps to make PHP work with OmniHTTPd. This is a CGI executable setup. SAPI is supported by OmniHTTPd, but some tests have shown that it is not so stable to use PHP as an ISAPI module.

Important for CGI users: Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0.

  • Step 1: Install OmniHTTPd server.

  • Step 2: Right click on the blue OmniHTTPd icon in the system tray and select Properties

  • Step 3: Click on Web Server Global Settings

  • Step 4: On the 'External' tab, enter: virtual = .php | actual = c:\path-to-php-dir\php.exe, and use the Add button.

  • Step 5: On the Mime tab, enter: virtual = wwwserver/stdcgi | actual = .php, and use the Add button.

  • Step 6: Click OK

Repeat steps 2 - 6 for each extension you want to associate with PHP.

Anmerkung: Some OmniHTTPd packages come with built in PHP support. You can choose at setup time to do a custom setup, and uncheck the PHP component. We recommend you to use the latest PHP binaries. Some OmniHTTPd servers come with PHP 4 beta distributions, so you should choose not to set up the built in support, but install your own. If the server is already on your machine, use the Replace button in Step 4 and 5 to set the new, correct information.


Servers-Oreilly Website Pro

This section contains notes and hints specific to Oreilly Website Pro.


Oreilly Website Pro 2.5 and up for Windows

This list describes how to set up the PHP CGI binary or the ISAPI module to work with Oreilly Website Pro on Windows.

  • Edit the Server Properties and select the tab "Mapping".

  • From the List select "Associations" and enter the desired extension (.php) and the path to the CGI exe (ex. c:\php\php.exe) or the ISAPI DLL file (ex. c:\php\sapi\php4isapi.dll).

  • Select "Content Types" add the same extension (.php) and enter the content type. If you choose the CGI executable file, enter 'wwwserver/shellcgi', if you choose the ISAPI module, enter 'wwwserver/isapi' (both without quotes).


Servers-Sambar

This section contains notes and hints specific to the Sambar server for Windows.


Sambar Windows

This list describes how to set up the ISAPI module to work with the Sambar server on Windows.

  • Find the file called mappings.ini (in the config directory) in the Sambar isntall directory.

  • Open mappings.ini and add the following line under [ISAPI]:

    *.php = c:\php\php4isapi.dll

    (This line assumes that PHP was installed in c:\php.)

  • Now restart the Sambar server for the changes to take effect.


Servers-Xitami

This section contains notes and hints specific to Xitami.


Xitami for Windows

This list describes how to set up the PHP CGI binary to work with Xitami on Windows.

Important for CGI users: Read the faq on cgi.force_redirect for important details. This directive needs to be set to 0.

  • Make sure the webserver is running, and point your browser to xitamis admin console (usually http://127.0.0.1/admin), and click on Configuration.

  • Navigate to the Filters, and put the extension which PHP should parse (i.e. .php) into the field File extensions (.xxx).

  • In Filter command or script put the path and name of your php executable i.e. c:\php\php.exe.

  • Press the 'Save' icon.

  • Restart the server to reflect changes.


Servers-Other web servers

PHP can be built to support a large number of web servers. Please see Server-related options for a full list of server-related configure options. The PHP CGI binaries are compatible with almost all webservers supporting the CGI standard.


Problems?

Read the FAQ

Some problems are more common than others. The most common ones are listed in the PHP FAQ, part of this manual.


Other problems

If you are still stuck, someone on the PHP installation mailing list may be able to help you. You should check out the archive first, in case someone already answered someone else who had the same problem as you. The archives are available from the support page on http://www.php.net/. To subscribe to the PHP installation mailing list, send an empty mail to php-install-subscribe@lists.php.net. The mailing list address is php-install@lists.php.net.

If you want to get help on the mailing list, please try to be precise and give the necessary details about your environment (which operating system, what PHP version, what web server, if you are running PHP as CGI or a server module, safe mode, etc...), and preferably enough code to make others able to reproduce and test your problem.


Bug reports

If you think you have found a bug in PHP, please report it. The PHP developers probably don't know about it, and unless you report it, chances are it won't be fixed. You can report bugs using the bug-tracking system at http://bugs.php.net/. Please do not send bug reports in mailing list or personal letters. The bug system is also suitable to submit feature requests.

Read the How to report a bug document before submitting any bug reports!


Komplette Liste der Konfigurationsoptionen

Anmerkung: Diese Optionen werden nur zur Kompilierzeit genutzt. Wenn Sie die Laufzeitkonfiguration von PHP ändern möchten, lesen Sie bitte unter Configuration nach.

Nachstehend finden Sie die komplette Liste von Optionen, welche von PHP 4 configure Skripten (Stand 4.1.0) unterstützt, und zum Kompilieren in einer Unix-ähnlichen Umgebung verwendet werden. Manche Optionen sind in PHP 3, manche in PHP 4 und manche sind in beiden Versionen verfügbar. Dies ist derzeit noch nicht verzeichnet.

Es gibt generelle Konfigurationsoptionen für das configure Skript, nähere Informationen dazu finden Sie in den Manpages für GNU autoconf, oder den Aufruf von configure --help, welcher eine vollständige und aktuelle Liste bietet.


Konfigurationsoptionen in PHP 4

Anmerkung: Diese Optionen werden nur in PHP 4 mit Stand von PHP 4.1.0 verwendet. Manche davon sind auch in älteren Versionen von PHP 4 verfügbar, manche sogar in PHP 3, manche nur in PHP 4.1.0. Sollten Sie eine ältere Version von PHP kompilieren wollen kann es sein, dass manche Optionen nicht verfügbar sind.


Datenbankoptionen

--with-dbplus

Inkludiert dbplus Unterstützung.

--with-adabas[=DIR]

Inkludiert Adabas D Unterstützung. DIR ist das Adabas Installationsverzeichnis. Default ist /usr/local.

--with-sapdb[=DIR]

Inkludiert SAP DB Unterstützung. DIR ist das SAP DB Installationsverzeichnis. Default ist /usr/local.

--with-solid[=DIR]

Inkludiert Solid Unterstützung. DIR ist das Solid Installationsverzeichnis. Default ist /usr/local/solid.

--with-ibm-db2[=DIR]

Inkludiert IBM DB2 Unterstützung. DIR ist das DB2 Installationsverzeichnis. Default ist /home/db2inst1/sqllib.

--with-empress[=DIR]

Inkludiert Empress Unterstützung. DIR ist das Empress Installationsverzeichnis. Default ist $EMPRESSPATH. Ab PHP4 unterstützt diese Option nur Empress Version 8.60 und höher.

--with-empress-bcs[=DIR]

Inkludiert Empress Local Access Unterstützung. DIR ist das Empress Installationsverzeichnis. Default ist $EMPRESSPATH. Ab PHP4 unterstützt diese Option nur Empress Version 8.60 und höher.

--with-birdstep[=DIR]

Inkludiert Birdstep Unterstützung. DIR ist das Birdstep Installationsverzeichnis. Default ist /usr/local/birdstep.

--with-custom-odbc[=DIR]

Inkludiert benutzerdefinierte ODBC Unterstützung. DIR ist das ODBC Installationsverzeichnis. Stellen Sie sicher, dass CUSTOM_ODBC_LIBS definiert ist und dass sich eine odbc.h in Ihrem Include Verzeichnis befindet. Z.B. sollten Sie folgendes für Sybase SQL Anywhere 5.5.00 definieren, bevor Sie das Configure Skript starten: CPPFLAGS="-DODBC_QNX -DSQLANY_BUG" LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc".

--with-iodbc[=DIR]

Inkludiert iODBC Unterstützung. DIR ist das iODBC Installationsverzeichnis. Default ist /usr/local.

--with-esoob[=DIR]

Inkludiert Easysoft OOB Unterstützung. DIR ist das OOB Installationsverzeichnis. Default ist /usr/local/easysoft/oob/client.

--with-unixODBC[=DIR]

Inkludiert unixODBC Unterstützung. DIR ist das unixODBC Installationsverzeichnis. Default ist /usr/local.

--with-openlink[=DIR]

Inkludiert OpenLink ODBC Unterstützung. DIR ist das OpenLink Installationsverzeichnis. Default ist /usr/local. Dies ist das gleiche wie iODBC.

--with-dbmaker[=DIR]

Inkludiert DBMaker Unterstützung. DIR ist das DBMaker Installationsverzeichnis. Default ist, wo die letzte Version von DBMaker installiert ist (wie z.B. /home/dbmaker/3.6).

--disable-unified-odbc

Deaktiviert unified ODBC Unterstützung. Nur anwendbar, wenn iODBC, Adabas, Solid, Velocis oder eine spezielle ODBC Schnittstelle aktiviert ist. Nur PHP 3!


Grafikoptionen

--without-gd

Deaktiviert GD Unterstützung. Nur PHP 3!

--with-imagick

Die imagick Erweiterung befindet sich nun in PECL von PEAR, und kann hier heruntergeladen werden. Die Installationsanweisungen für PHP 4 finden Sie auf der PEAR Site.

Ein einfaches --with-imagick ist nur in PHP 3 möglich, außer Sie folgen den Instruktionen auf der PEAR Site.

--with-ming[=DIR]

Inkludiert ming Unterstützung.


Verschiedene Optionen

--enable-force-cgi-redirect

Aktiviert die Sicherheitsprüfung für interne Serverumleitungen. Sie sollten diese Option verwenden, wenn Sie die CGI Version mit Apache verwenden.

--enable-discard-path

Ist diese Option aktiviert, kann das PHP CGI Programm sicher außerhalb des Web Verzeichnisbaumes platziert werden, und die Benutzer können die .htaccess Sicherheit nicht umgehen.

--with-fastcgi=SRCDIR

Erstellt PHP als FastCGI Applikation.

--enable-debug

Kompiliert mit Debug-Symbolen.

--with-layout=TYPE

Setzt die Anordnung der installierten Dateien. Type ist entweder PHP (default) oder GNU.

--with-pear=DIR

Installiert PEAR in DIR (default ist PREFIX/lib/php).

--without-pear

Unterdrückt die Installation von PEAR.

--enable-sigchild

Aktiviert den PHP-eigenen SIGCHLD Handler.

--disable-rpath

Verhindert die Übergabe weiterer Suchpfade für Laufzeitbibliotheken.

--enable-libgcc

Aktiviert das explizite Linken zur die libgcc.

--enable-php-streams

Inkludiert die experimentellen PHP Streams. Verwenden Sie dies nicht, wenn Sie nicht den Code testen!

--with-zlib-dir=<DIR>

Definiert das zlib Installationsverzeichnis.

--with-aspell[=DIR]

Inkludiert ASPELL Unterstützung.

--with-ccvs[=DIR]

Inkludiert CCVS Unterstützung.

--with-cybercash[=DIR]

Inkludiert CyberCash Unterstützung. DIR ist das CyberCash MCK Installationsverzeichnis.

--with-icap[=DIR]

Inkludiert ICAP Unterstützung.

--with-ircg-config

Pfad zu dem ircg-config Skript.

--with-ircg

Inkludiert ircg Unterstützung.

--enable-mailparse

Aktiviert mailparse Unterstützung.

--with-muscat[=DIR]

Inkludiert muscat Unterstützung.

--with-satellite[=DIR]

Aktiviert CORBA Unterstützung über Satellite (EXPERIMENTELL). DIR ist das Basisverzeichnis für ORBit.

--enable-trans-sid

Aktiviert transparent session id propagation.

--with-regex[=TYPE]

Verwendet die System regex Bibliothek (nicht empfohlen).

--with-vpopmail[=DIR]

Inkludiert vpopmail Unterstützung.

--with-tsrm-pthreads

Verwendet POSIX threads (default).

--enable-shared[=PKGS]

Erstellt verteilte Bibliotheken [default=yes].

--enable-static[=PKGS]

Erstellt statische Bibliotheken [default=yes].

--enable-fast-install[=PKGS]

Optimiert für schnelle Installation [default=yes].

--with-gnu-ld

Nimmt an, dass der C Compiler GNU ld verwendet [default=no].

--disable-libtool-lock

Vermeide locking (könnte sein, dass parallele Builds nicht funktionieren).

--with-pic

Versucht, nur PIC/non-PIC Objekte zu verwenden [default=use both].

--enable-memory-limit

Kompiliert mit Unterstützung für Speicherlimit.

--disable-url-fopen-wrapper

Verhindert den URL-aware fopen wrapper, der den Zugriff auf Dateien über HTTP oder FTP erlaubt.

--enable-versioning

Exportiert nur die benötigten Symbole. Siehe INSTALL für weitere Informationen.

--with-imsp[=DIR]

Inkludiert IMSp Unterstützung (DIR ist das Include-Verzeichnis von IMSP und libimsp.a). Nur PHP 3!

--with-mck[=DIR]

Inkludiert Cybercash MCK Unterstützung. DIR ist das cybercash mck Build Verzeichnis, default ist /usr/src/mck-3.2.0.3-linux. Hilfe finden Sie in extra/cyberlib. Nur PHP 3!

--with-mod-dav=DIR

Inkludiert DAV Unterstützung durch Apache's mod_dav, DIR ist das Installationsverzeichnis von mod_dav (Nur Apache Modulversion!). Nur PHP 3!

--enable-debugger

Kompiliert mit Funktionen zum remote debugging. Nur PHP 3!

--enable-versioning

Nutzt die Vorteile der von Solaris 2.x und Linux unterstützten Versionierung und des Scoping. Nur PHP 3!


PHP Optionen

--enable-maintainer-mode

Aktiviert Regeln und Abhängigkeiten für make, welche für Leute die PHP nur gelegentlich installieren nicht nützlich (und manchmal verwirrend) sind.

--with-config-file-path=PATH

Setzt den Pfad für die php.ini, default ist PREFIX/lib.

--enable-safe-mode

Aktiviert safe mode standardmäßig.

--with-exec-dir[=DIR]

Wenn in safe mode, sind ausführbare Dateien nur in DIR erlaubt. Default ist /usr/local/php/bin.

--enable-magic-quotes

Aktiviert magic quotes standardmäßig.

--disable-short-tags

Verhindert standardmäßig die Kurzform der <? Start Tags.


Serveroptionen

--with-aolserver=DIR

Spezifiziert den Pfad zu dem installierten AOLserver.

--with-apxs[=FILE]

Erstellt ein verteiltes Apache Modul. FILE ist der optionale Pfadname zu dem Apache apxs tool; default ist apxs. Spezifizieren Sie die Version von dem aktuell auf Ihrem System installierten apxs, und NICHT die, die sich in dem Apache Tarball befindet.

--with-apache[=DIR]

Erstellt das Apache Modul. DIR ist das Top-Level Build-Verzeichnis, default ist /usr/local/apache.

--with-mod_charset

Aktiviert Transfertabellen für mod_charset (Rus Apache).

--with-apxs2[=FILE]

Erstellt ein verteiltes Apace 2.0 Modul. FILE ist der optionale Pfad zu dem Apache apxs Tool. Default ist apxs.

--with-fhttpd[=DIR]

Erstellt ein fhttpd Modul. DIR ist das Verzeichnis mit den fhttpd Sources. Default ist /usr/local/src/fhttpd.

--with-isapi=DIR

Erstellt PHP als ISAPI Modul für die Verwendung mit Zeus.

--with-nsapi=DIR

Spezifiziert den Pfad zu dem installierten Netscape Server.

--with-phttpd=DIR

Dzt. keine Information.

--with-pi3web=DIR

Erstellt PHP als Modul für Pi3Web.

--with-roxen=DIR

Erstellt PHP als Pike Modul. DIR ist das Roxen Hauptverzeichnis, gewöhnlich /usr/local/roxen/server.

--enable-roxen-zts

Erstellt das Roxen Modul mit Zend Thread Safety.

--with-servlet[=DIR]

Inkludiert Servlet Unterstützung. DIR ist das Installationsverzeichnis des JSDK. Dieses SAPI setzt voraus, dass die Java Erweiterung als verteilte Bibliothek erstellt wurde.

--with-thttpd=SRCDIR

Erstellt PHP als thttpd Modul.

--with-tux=MODULEDIR

Erstellt PHP als TUX Modul (Nur Linux).


Kapitel 4. Konfiguration

Die Konfigurationsdatei

Die Konfigurationsdatei (php3.ini in PHP 3.0.x, und php.ini in PHP 4.0) wird geladen, wenn PHP gestartet wird. Wurde PHP als Modul in den Webserver einkompiliert, dann geschieht dies nur, wenn der Server gestartet wird. Ist PHP als CGI-Version konfiguriert worden, geschieht es bei jedem Aufruf.

Wenn Sie PHP in der Modul-Variante benutzen, können Sie die Konfigurationseinstellungen auch mittels der Apache-Konfigurations- datei bzw. mittels .htaccess-Dateien ändern.

Bei PHP 3.0.x existieren Apache-Anweisungen, die mit jeder Konfigurationseinstellung der php3.ini korrespondieren, ausgenommen Einstellungen mit dem Prefix "php3_".

Bei PHP 4.0 gibt es nur noch wenige Apache-Anweisungen, die es Ihnen erlauben, die Konfigurationseinstellungen zu ändern.

php_value name value

Dieses setzt den Wert der spezifizierten Variablen.

php_flag name on|off

Dieser Schalter wird benutzt, um die Boolean-Konfigurations- Option zu aktivieren.

php_admin_value name value

Dieser Wert setzt den Wert der spezifischen Variablen. "Admin"-Konfigurationseinstellungen können nur innerhalb der Haupt-Konfigurationsdatei des Apache gesetzt werden, nicht etwa über eine .htaccess Datei.

php_admin_flag name on|off

Dieser Schalter wird benutzt, um die Boolean-Konfigurations-Option zu aktivieren. ("Admin")

Die Konfigurationseinstellungen können Sie in der Ausgabe der phpinfo() Datei einsehen. Ebenfalls können Sie Zugang zu den individuellen Konfigurationseinstellungen über get_cfg_var() bekommen.


Allgemeine Konfigurationseinstellungen

asp_tags boolean

Dieser Schalter aktiviert die Unterstützung von ASP <% %> Tags als Erweiterung zu den üblichen <?php ?> Tags. Dieses beinhaltet auch die Kurzform der Variablenausgabe <%= $value %>. Weitere Informationen finden Sie hier: Escaping from HTML.

Anmerkung: Die Unterstützung für ASP-Tags wurde in Version 3.0.4 hinzugefügt.

auto_append_file string

Hier können Sie eine Datei angeben, die automatisch nach der Haupt-Datei aufgerufen wird. Die Datei wird in die aufgerufene Datei eingebettet, als wenn Sie sie mittels der include() Funktion eingebunden hätten, dabei wird ein gesetzter include_path beachtet.

Der Wert none deaktiviert auto-appending.

Anmerkung: Wird das Skript mit der Funktion exit()beendet, wird auto-append nicht aktiv.

auto_prepend_file string

Hier können Sie eine Datei angeben, die automatisch vor der Hauptdatei aufgerufen wird. Die Datei wird in die aufgerufene Datei eingebettet, als wenn Sie sie mittels der include() Funktion eingebunden hätten, dabei wird ein gesetzter include_path beachtet.

Der Wert none deaktiviert auto-prepending.

cgi_ext string

doc_root string

Hier wird das Stammverzeichnis der PHP-Skripte eingegeben. Üblicherweise handelt es sich hier um das DocumentRoot des Servers (Apache: htdocs) Diese Angabe wird nur benutzt, wenn sie einen Wert enthält. Wenn PHP mit safe mode konfiguriert wurde, werden alle PHP-Skripte außerhalb dieses Directorys ignoriert.

open_basedir string

Beschränkt die Dateien, die von PHP geöffnet werden können, auf Dateien im angegebenen Verzeichnisbaum.

Wenn ein Skript versucht, eine Datei mit z.B. fopen oder gzopen zu öffnen, wird der Ort der Datei überprüft. Wenn sich die Datei außerhalb des spezifizierten Verzeichnisses befindet, wird PHP sie nicht öffnen. Alle symbolischen Links sind hier mit eingeschlossen, so dass es auch nicht möglich ist, dieses Verbot mittels symlink zu umgehen.

Der Wert . gibt an, dass das Verzeichnis, in dem das Skript abgespeichert ist, als Basis-Verzeichnis genutzt wird.

Unter Windows werden Verzeichnisse mit Semikolon getrennt, unter allen anderen Betriebssystemen mit einem Doppelpunkt. Wenn PHP als Modul in den Apache einkompiliert wurde, werden open_basedir paths von "Eltern"-Verzeichnissen nun automatisch vererbt.

Anmerkung: Die Unterstützung für multiple Verzeichnisse wurde in Version 3.0.7 hinzugefügt.

Die Standardeinstellung ist, alle Dateien zum Parsen freizugeben.

gpc_order string

Legt die Auswertungsreihenfolge für GET/POST/COOKIE Variablen fest. Die Standardeinstellung ist GPC. Wenn Sie diesen Wert auf z.B."GP" setzen, ignoriert PHP Cookies, und wird jede GET Methoden Variable mit POST Methoden Variablen des gleichen Namens überschreiben.

ignore_user_abort string

Standardmäßig auf ON. Wenn Sie diese Einstellung auf OFF setzen, werden PHP-Skripte beendet, sobald sie versuchen, eine Ausgabe zu erzeugen, nachdem der Client die Verbindung beendet hat. ignore_user_abort().

include_path string

Hier können Sie ein Verzeichnis angeben, in dem die require(), include() und fopen_with_path() Funktionen nach Dateien suchen. Das Format ist ähnlich der PATH Umgebungsvariablen des jeweiligen Systems: Eine Liste von Verzeichnissen, getrennt durch einen Doppelpunkt bei UNIX oder ein Semikolon bei WINDOWS.

Beispiel 4-1. UNIX include_path

include_path=.:/home/httpd/php-lib

Beispiel 4-2. Windows include_path

include_path=".;c:\www\phplib"
Der Standardwert für diese Option ist . (nur das aktuelle Verzeichnis).

isapi_ext string

magic_quotes_gpc boolean

Dieser Schalter setzt den magic_quotes-Zustand für GPC (GET/POST/COOKIE) -Operationen. Wenn magic_quotes auf ON steht, werden automatisch alle ' (single-quote), " (double quote), \ (backslash) und NUL's mit einem Backslash versehen. Wenn auch magic_quotes_sybase auf ON steht, wird ein single-quote mit einem weiteren single-quote anstatt eines Backslashs versehen.

magic_quotes_runtime boolean

Wenn der Schalter magic_quotes_runtimeaktiviert ist, werden Anführungszeichen der meisten Funktionen, welche Daten aus jeglicher Art von externer Quelle, eingeschlossen Datenbanken und Textdateien, zurückgeben, mit einem Backslash versehen. Wenn auch der Schalter magic_quotes_sybase aktiviert ist, wird ein einfaches Anführungszeichen mit einem einfachen Anführungszeichen anstatt eines Backslashes versehen.

max_execution_time integer

Dieser Wert gibt die maximale Ausführungslänge eines Skriptes in Sekunden an, bevor es vom Parser abgebrochen wird. Dieses soll Abstürzen des Servers durch schlecht geschriebene oder falsche Skripte vorbeugen. Bei komplexen Datenbankabfragen sollte man jedoch bedenken, dass der Standardwert unter Umständen zu klein sein kann.

memory_limit integer

Dieser Wert gibt den maximal erlaubten Speicherplatzverbrauch eines PHP-Skriptes an. Diese Einstellung soll den Server vor Speicherverschwendung durch schlecht programmierte Skripte bewahren.

nsapi_ext string

register_globals boolean

Dieser Schalter bestimmt, ob die EGPCS-Variablen (Environment, GET, POST, Cookie, Server) als globale Variablen registriert werden oder nicht. Sie sollten dies ausschalten, wenn der globale Bereich Ihrer Skripte nicht durch Benutzerdaten gestört werden soll. Diese Einstellung ist insbesondere dann sinnvoll, wenn sie mit track_vars verwendet wird. In diesem Fall kÖnnen alle EGPCS-Variablen durch $HTTP_ENV_VARS, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS und $HTTP_SERVER_VARS angespochen werden.

short_open_tag boolean

Gibt an, ob die Kurzform (<? ?> eines öffnenden PHP-Tags erlaubt ist. Wenn Sie PHP in Kombination mit XML nutzen, müssen Sie diese Option deaktivieren. Wenn Sie die Option deaktiviert haben, müssen Sie die Langform des öffnenden Tags (<?php ?>)verwenden.

sql.safe_mode boolean

track_vars boolean

Wenn dieser Schalter aktiviert ist, werden GET-, POST- und Cookie-Werte in den Umgebungsvariablen-Arrays $HTTP_GET_VARS, $HTTP_POST_VARS und $HTTP_COOKIE_VARS abgelegt.

upload_tmp_dir string

Hier wird das temporäre Verzeichnis angegeben, in welchem Dateien gespeichert werden, die mittels file upload auf den Server geladen werden. Dieses Verzeichnis muss schreibbar sein.

user_dir string

Wenn Sie PHP für User hosten, dann können persönliche Verzeichnisse der Art ~username angelegt werden. Der Wert user_dir zeigt auf das Stammverzeichnis, unter dem diese Nutzerverzeichnisse liegen. z.B. public_html.


Mail-Konfigurationsdirektiven

SMTP string

Dieser Wert muss nur in der Windows-Umgebung gesetzt werden. Hier wird der DNS-Name oder die IP-Adresse des SMTP-Servers eingetragen, über den Mails mit der Funktion mail() verschickt werden sollen.

sendmail_from string

Hier können Sie den Absender der Emails eintragen, wenn Sie von Windows aus Emails verschicken wollen.

sendmail_path string

Hier geben Sie den Pfad zum sendmail Programm an. Für gewöhnlich ist dies /usr/sbin/sendmail oder /usr/lib/sendmail. configure versucht zwar den Pfad zum sendmail Programm selbstständig herauszufinden, aber für den Fall, dass dieses nicht funktioniert, können Sie den Pfad hier eintragen.

Auf Systemen, wo Sendmail nicht benutzt wird, sollten Sie diesen Pfad auf den Sendmail-Ersatz -wenn vorhanden- setzen. Zum Beispiel: Qmail-Benutzer können den Pfad normalerweise wie folgt setzen: /var/qmail/bin/sendmail.


Safe Mode-Konfigurationsdirektiven

safe_mode boolean

Wenn Sie diesen Schalter auf ON setzen, betreiben Sie PHP im sicheren Modus. Mehr dazu erfahren Sie im Kapitel Sicherheit

safe_mode_exec_dir string

Wenn Sie PHP im sicheren Modus betreiben, werden die Funktion system() und andere Funktionen, die Systemprogramme ausführen, nicht gestartet, wenn Sie sich nicht in diesem Verzeichnis befinden.


Debugger-Konfigurationsdirektiven

debugger.host string

DNS-Name oder IP-Adresse des Hosts, der vom Debugger benutzt wird.

debugger.port string

Portnummer, die vom Debugger benutzt wird.

debugger.enabled boolean

Hier können Sie den Debugger aktivieren bzw. deaktivieren.


Extension Loading-Direktiven

enable_dl boolean

Diese Option ist eigentlich nur sinnvoll, wenn Sie PHP als Apache-Modul benutzen. Dann können Sie das "Einladen" der dynamischen PHP-Extensionen mit der Funktion dl() für einzelne virtuelle Server oder Verzeichnisse aktivieren bzw. deaktivieren.

Der Hauptgrund, das dynamische Laden von Extensionen zu deaktivieren, ist Sicherheit. Wenn die Option aktiviert ist, ist es möglich, Restriktionen durch safe_mode und open_basedir zu umgehen.

Standardmäßig wird das dynamische Laden erlaubt, außer wenn Sie PHP im safe_mode betreiben. Im safe_mode ist es nie möglich, die Funktion dl() zu benutzen.

extension_dir string

Hier geben Sie das Verzeichnis an, in dem PHP dynamisch zu ladende Extensionen findet.

extension string

Hier geben Sie an, welche Extensionen geladen werden sollen, wenn PHP gestartet wird.


mSQL-Konfigurationsdirektiven

msql.allow_persistent boolean

Erlaubt persistente mSQL-Verbindungen.

msql.max_persistent integer

Hier geben Sie die maximal erlaubte Anzahl persistenter mSQL-Verbindungen pro Prozess an.

msql.max_links integer

Hier geben Sie die maximale Anzahl der Verbindungen pro Prozess an (persistente und normale).


SESAM Konfigurationsdirektiven

sesam_oml string

Name der BS2000 PLAM-Bibliothek, die die ladbaren SESAM Treibermodule enthält. Diese Direktive ist obligatorisch, anderenfalls wird die SESAM Funktionalität deaktiviert. SESAM functions. Die angegebene BS2000 PLAM-Bibliothek muss durch Setzen von ACCESS=READ,SHARE=YES lesbar gemacht werden, da unter der Apache Server User-Id auf sie zugegriffen wird.

sesam_configfile string

Name der SESAM Applikations-Konfigurationsdatei. Diese Direktive ist obligatorisch, anderenfalls wird die SESAM Funktionalität deaktiviert. Die angegebene BS2000-Datei muss für die Apache Server-Kennung lesbar sein.

Gewöhnlich enthält die Applikations-Konfigurationsdatei Konfigurationsbefehle wie (siehe SESAM Referenzhandbuch):

CNF=B
NAM=K
NOTYPE

sesam_messagecatalog string

Name der SESAM Message-Katalogdatei. In den meisten Fällen ist die Angabe dieser Datei überflüssig; lediglich wenn die Message-Katalogdatei nicht in der BS2000 Messagedatei-Tabelle eingetragen ist, kann sie explizit mit dieser Direktive gesetzt werden.

Die angegebene BS2000 Message-Katalogdatei muss durch Setzen von ACCESS=READ,SHARE=YES lesbar gemacht werden, da unter der Apache Server User-Id auf sie zugegriffen wird.


Browser Capability-Konfigurationsdirektiven

browscap string

Name der browser_capabilities-Datei. Mehr hierüber erfahren Sie unter get_browser().


Kapitel 5. Sicherheit

PHP ist eine mächtige Sprache, und der Interpreter, der in einen Webserver als Modul oder als separate CGI-Version eingebunden werden kann, kann auf Dateien zugreifen, Befehle ausführen und Netzwerkverbindungen zu einem Server herstellen. Diese Eigenschaften können einen Webserver unsicher machen, wenn man es bei den Voreinstellungen belässt. PHP wurde besonders dafür entwickelt, um eine sicherere Sprache als Perl oder C für die Erstellung von CGI-Programmen bereitzustellen. Mit der richtigen Wahl der Einstellungen beim Kompilieren und zur Laufzeit bietet PHP genau die Kombination aus Freiheit und Sicherheit, die gerade benötigt wird.

Da es sehr viele verschiedene Möglichkeiten gibt, PHP zu nutzen, gibt es viele Konfigurationseinstellungen, die das Verhalten von PHP beeinflussen. Eine große Auswahl an Einstellungen garantiert, dass man PHP für viele Zwecke einsetzen kann. Allerdings bedeutet das auch, dass es Kombinationen gibt, die eine Installation mit nur ungenügender Sicherheit zur Folge haben.

Die Flexibilität der Konfiguration konkurriert mit der Flexibilität in der Programmierung. Mit PHP können komplette Server Applikationen mit allen Möglichkeiten eines Shell Benutzers erstellt werden, oder auch nur einfache Server Side Includes mit einem minimalen Risiko in einer streng kontrollierten Umgebung. Wie die Umgebung erstellt wird, und wie sicher diese ist, ist zu einem großen Teil die Sache des PHP Entwicklers.

Dieses Kapitel beginnt mit einigen generellen Ratschlägen zur Sicherheit, erklärt die verschiedenen Kombinationen der Konfigurationseinstellungen und unter welchen Gegebenheiten sie sicher genutzt werden können, und beschreibt verschiedene Überlegungen zur Programmierung für verschiedene Sicherheitsstufen.


Allgemeine Überlegungen

Ein komplett sicheres System ist praktisch ein Ding der Unmöglichkeit, weshalb ein unter Sicherheitsprofis oft genutzter Ansatz ist, einen Mittelweg zwischen Risiko und Verwendbarkeit zu finden. Wenn jede von einem Benutzer übermittelte Variable zwei Formen von biometrischer Prüfung (wie z.B. ein Scan der Netzhaut und ein Fingerabdruck) verlangen würde, wäre eine extrem hohe Ebene der Verantwortlichkeit erreicht. Ein sehr komplexes Formular auszufüllen würde auch eine halbe Stunde in Anspruch nehmen, die Benutzer dazu ermuntern könnte, Wege zur Umgehung der Sicherheitsmaßnahmen zu suchen.

Die beste Sicherheit ist oft unaufdringlich genug um den Anforderungen zu entsprechen, ohne den Benutzer an seiner Arbeit zu hindern oder den Code-Autor mit übertriebener Komplexität zu überlasten. Tatsächlich sind einige Sicherheitsangriffe nur die Folge von allzu strengen Sicherheitsmaßnahmen, was mit der Zeit nur zu deren Unterminierung führt.

Eine Phrase die es wert ist, sich an sie zu erinnern: Ein System ist nur so gut wie das schwächste Glied in der Kette. Wenn alle Transaktionen mittels Zeit, Ort, Transaktionstyp, etc. streng mitprotokolliert werden, der Benutzer aber nur mittels einem einzigen Cookie verifiziert wird, lässt die Zuverlässigkeit für die Bindung des Benutzers an das Transaktions-Log bedrohlich nach.

Denken Sie während der Tests daran, dass Sie selbst für die einfachsten Seiten nicht alle Möglichkeiten testen können. Der von Ihnen vielleicht erwartete Input wird zu dem eines verstimmten Mitarbeiters oder eines Crackers der Monate Zeit hat, oder einer Katze, die über die Tastatur läuft in keinerlei Zusammenhang stehen. Deshalb betrachten Sie Ihren Code am Besten aus der logischen Perspektive um zu erkennen, wo unerwartete Daten eingebracht werden können und fragen sich dann, wie diese modifiziert, reduziert, oder weiter ausgeführt werden.

Das Internet ist voll von Leuten die versuchen, sich durch Entschlüsseln/zerstören Ihres Codes, den Zusammenbruch Ihres Systems, Einsetzen von unangebrachten Inhalten, und anderen, Ihren Tag interessant gestaltenden Maßnahmen, einen Namen zu machen. Es ist egal, ob Sie eine kleine oder große Site haben, Sie sind einfach ein Ziel wenn Sie online sind oder wenn Sie einen Server haben, zu dem man eine Verbindung aufbauen kann. Viele Cracker-Programme erkennen nicht die Größe, sondern durchsieben einfach gewaltige IP Blöcke im Netz, um Opfer zu finden. Versuchen Sie, keines zu werden.


CGI-Version

Mögliche Angriffe

PHP als CGI zu nutzen, ist eine Möglichkeit für Installationen, bei denen aus irgendwelchen Gründen kein Modul in die Serversoftware eingebunden werden soll (wie beim Apache) oder für Systeme, bei denen verschiedene CGI-Wrapper genutzt werden sollen, um sichere chroot- und setuid-Umgebungen für Skripte zu schaffen. Bei dieser Konfiguration wird das ausführbare PHP-Binary üblicherweise im cgi-bin Verzeichnis des Webservers installiert. CERT advisory CA-96.11 spricht sich gegen die Platzierung von Interpretern im cgi-bin Verzeichnis aus. Obwohl das PHP-Binary als eigenständiger Interpreter verwendet werden kann, wurde PHP so entwickelt, um den durch diese Konfiguration möglich werdenden Angriffe vorzubeugen:

  • Zugriff auf Systemdateien: http://my.host/cgi-bin/php?/etc/passwd

    Die auf ein Fragezeichen (?) folgende Abfrageinformation in einer URL wird durch das CGI-Interface als Kommandozeilenargument an den Interpreter weitergereicht. In der Kommandozeile wird üblicherweise die im ersten Argument angegebene Datei von Interpretern geöffnet und ausgeführt.

    Beim Aufruf als CGI-Binary verweigert PHP die Interpretation der Kommandozeilenargumente.

  • Zugriff auf beliebige Web-Dokumente auf dem Server: http://my.host/cgi-bin/php/secret/doc.html

    Der Teil der URL-Pfadinformation nach dem Namen der PHP Binärdatei, /secret/doc.html wird im allgemeinen benutzt, um den Namen der Datei zu übergeben, die durch das CGI-Programm geöffnet und interpretiert werden soll. Normalerweise werden einige Einträge in der Konfigurationsdatei des Webservers benutzt (Apache: Action), um Aufrufe von Dokumenten wie http://my.host/secret/script.php3 an den PHP-Interpreter umzuleiten. Bei dieser Konfiguration überprüft der Webserver zuerst die Zugriffsrechte im Verzeichnis /secret und erstellt anschließend den umgeleiteten Aufruf http://my.host/cgi-bin/php/secret/script.php. Unglücklicherweise wird, wenn der Aufruf bereits in dieser Form geschieht, vom Webserver keine Zugriffsüberprüfung der Datei /secret/script.php, sondern lediglich der Datei /cgi-bin/php vorgenommen. So ist jeder Benutzer, der auf /cgi-bin/php zugreifen darf in der Lage, sich zu jedem geschützten Dokument auf dem Webserver Zugriff zu verschaffen.

    Bei PHP können beim Kompilieren die Konfigurationsoption --enable-force-cgi-redirect und zur Laufzeit die Konfigurationsdirektiven doc_root und user_dir benutzt werden, um diesen Angriff zu verhindern, falls der Verzeichnisbaum des Servers Verzeichnisse mit Zugriffsbeschränkungen beinhaltet. Ausführliche Informationen über die verschiedenen Kombinationen siehe weiter unten.


Fall 1: Nur öffentliche Dateien vorhanden

Wenn der Server keine Inhalte hat, die durch Passwort oder IP-basierte Zugriffskontrolle geschützt sind, werden diese Konfigurationsoptionen nicht benötigt. Wenn der Webserver keine Redirects erlaubt oder keine Möglichkeit hat, dem PHP-Binary mitzuteilen dass es sich um eine sicher umgeleitete Anfrage handelt, kann die Option --enable-force-cgi-redirect im configure-Script angegeben werden. Nichtsdestotrotz müssen Sie sicherstellen, dass Ihre PHP-Skripte nicht auf die eine oder andere Art des Aufrufs angewiesen sind, weder direkt durch http://my.host/cgi-bin/php/dir/script.php noch durch einen Redirect http://my.host/dir/script.php.

Beim Apache kann der Redirect durch den Gebrauch von AddHandler und Action konfiguriert werden (siehe unten).


Fall 2: --enable-force-cgi-redirect benutzen

Diese beim Kompilieren verwendete Option verhindert grundsätzlich den Aufruf von PHP mit einer URL wie http://my.host/cgi-bin/php/secretdir/script.php. Stattdessen parst PHP in diesem Modus nur dann, wenn der Aufruf durch einen korrekten Redirect des Webservers erfolgte.

Normalerweise wird der Redirect in der Apache-Konfiguration mit den folgenden Einträgen festgelegt:

Action php-script /cgi-bin/php
AddHandler php-script .php

Diese Option wurde nur mit dem Apache Webserver getestet und ist abhängig davon, wie Apache die nicht standardmäßige CGI-Umgebungsvariable REDIRECT_STATUS bei Redirect-Anfragen setzt. Sollte Ihr Webserver keine Möglichkeit unterstützen, zu übermitteln, ob es sich um einen direkte Aufruf oder einen Redirect handelt, können Sie diese Option nicht verwenden und müssen einen der anderen hier beschriebenen Wege gehen, die CGI-Version zu nutzen.


Fall 3: doc_root oder user_dir festlegen

Aktiven Inhalt, wie beispielsweise Skripts und ausführbare Dateien, in den Dokumentverzeichnissen des Webservers abzulegen, wird manchmal als unsichere Methode angesehen. Wenn, beispielsweise aufgrund von Konfigurationsfehlern, die Skripte nicht ausgeführt, sondern als reguläre HTML-Dokumente angezeigt werden kann dies ein Durchsickern von geistigem Eigentum und sicherheitsrelevanter Informationen (Passwörter!) zur Folge haben. Deshalb ziehen es viele Systemadministratoren vor, eine zweite Verzeichnisstruktur für Skripte einzurichten, auf die nur durch das PHP-CGI zugegriffen werden kann. Diese werden dann stets interpretiert und nicht angezeigt.

Auch wenn die Methode zum sichergestellten Verhindern einer Umleitung von Anfragen (wie im vorangegangenen Kapitel beschrieben) nicht verfügbar ist, ist es notwendig, ein doc_root für Skripte zusätzlich zum Web-Dokumentenverzeichnis einzurichten.

Sie können das PHP-Skriptverzeichnis durch die Direktive doc_root in der Konfigurationsdatei festlegen, oder Sie setzen die Umgebungsvariable PHP_DOCUMENT_ROOT. Wenn sie gesetzt ist, wird die CGI-Version von PHP den Namen der zu öffnenden Datei stets aus doc_root und der Pfadinformation der Anfrage zusammensetzen, sodass man sicher sein kann, dass außerhalb dieses Verzeichnisses keine Skripte ausgeführt werden (außer user_dir, siehe unten).

Eine weitere hier nützliche Option ist user_dir. Wenn das user_dir nicht gesetzt ist, hat nur doc_root Einfluss auf die zu öffnende Datei. Der Aufruf einer URL wie http://my.host/~user/doc.php hat nicht zum Ergebnis, dass eine Datei im Home-Verzeichnis des Benutzers geöffnet wird, sondern eine Datei namens ~user/doc.php unterhalb des doc_root (Ja, ein Verzeichnisname, der mit einer Tilde anfängt [~]).

Ist das user_dir beispielsweise auf public_php gesetzt, wird eine Anfrage wie http://my.host/~user/doc.php eine Datei namens doc.php im Verzeichnis public_php im Heimatverzeichnis des Benutzers öffnen. Wenn das Heimatverzeichnis des Benutzers /home/user ist, so ist die ausgeführte Datei /home/user/public_php/doc.php.

Die user_dir-Expansion erfolgt ohne Berücksichtigung der doc_root Einstellung. So können Zugriffe auf die Dokumenten- und Benutzerverzeichnisse separat gesteuert werden.


Fall 4: PHP-Parser außerhalb des Webverzeichnisbaums

Eine sehr sichere Sache ist es, das PHP-Parser-Binary irgendwo außerhalb des Webverzeichnisbaums zu platzieren, beispielsweise in /usr/local/bin. Der einzige Nachteil dieses Verfahrens ist, dass eine Zeile ähnlich der folgenden:

#!/usr/local/bin/php

als erste Zeile in jeder Datei, die PHP-Tags enthält, stehen muss. Außerdem muss die Datei ausführbar sein. Ansonsten ist sie genauso zu behandeln wie ein beliebiges CGI-Script in Perl oder sh oder anderen gebräuchlichen Scriptsprachen, die den #! shell-escape-Mechanismus nutzen, um sich selbst aufzurufen.

Damit PHP bei dieser Konfiguration die PATH_INFO- und PATH_TRANSLATED-Informationen korrekt auswertet, sollte der PHP-Parser mit der Option --enable-discard-path kompiliert werden.


Apache-Modul

Wenn PHP als Apache-Modul eingesetzt wird, übernimmt es die Benutzerrechte des Apache (üblicherweise user "nobody"). Das hat verschiedene Auswirkungen auf Sicherheit und Authentifizierung, z.B.: Wenn Sie PHP zum Zugriff auf eine Datenbank benutzen, es sei denn diese Datenbank hat eine integrierte Zugriffskontrolle, müssen Sie dem Benutzer "nobody" Zugriffsrechte auf die Datenbank erteilen. Das heißt, dass ein böswilliges Skript auch Benutzerkennung und Passwort auf die Datenbank zugreifen, und sie verändern könnte. Es ist durchaus möglich, dass ein Web-Spider über die Webseite eines Datenbankadministrators stolpert, und alle Ihre Datenbanken löscht. Sie können sich dagegen mit Apache Authentifizierung schützen, oder ein eigenes Zugangsmodell unter Verwendung von LDAP, .htaccess Dateien, etc. entwerfen, und diesen Code als Teil Ihrer PHP Skripte einbinden.

Es wurde festgestellt, dass wenn einmal die Sicherheitsmaßnahmen so weit eingerichtet sind dass dem PHP User (in diesem Fall ein Apache User) nur mehr ein geringes Risiko bleibt, PHP daran gehindert wird, virenverseuchte Dateien in das Benutzerverzeichnis zu schreiben. Oder vielleicht wurde es auch daran gehindert, auf Datenbanken zuzugreifen oder diese gar zu verändern. In gleicher Weise wird auch davor abgehalten, "gute" oder "bösartige" Dateien zu schreiben, oder "gute" bzw. "bösartige" Datenbanktransaktionen durchzuführen.

Ein häufig gemachter Fehler in Punkto Sicherheit ist Apache Root-Rechte zu erteilen, oder die Möglichkeiten von Apache in einer anderen Weise auszuweiten.

Die Ausweitung der Benutzerrechte für Apache auf root ist sehr gefährlich, und kann dem gesamten System schaden, denn mit sudo, chroot, oder anderwärtig als root zu arbeiten sollte niemand anders als den Sicherheitsprofis überlassen werden.

Es gibt auch ein paar einfachere Lösungen. Mit open_basedir() können Sie kontrollieren, welche Verzeichnisse PHP benutzen darf oder nicht. Sie können auch einen Bereich nur für Apache einrichten, um alle webbasierten Aktivitäten auf nicht-Benutzer- bzw. nicht-System-Dateien einzuschränken.


Dateisystem - Sicherheit

PHP ist von den in den meisten Serversystemen implementierten Sicherheitseinstellungen hinsichtlich der Berechtigungen auf Datei- und Verzeichnisebene abhängig. Dies verleiht Ihnen Kontrolle darüber, welche Dateien in dem Dateisystem gelesen werden dürfen. Vorsicht ist bei weltweit lesbaren Dateien geboten um sicherzustellen, dass diese sicher von allen Usern mit Zugriff auf dieses Dateisystem (nur) gelesen werden können.

Da PHP entwickelt wurde um Zugriffe auf das Dateisystem auf Benutzebene zu erlauben, ist es natürlich auch möglich ein PHP Skript zu schreiben das Ihnen erlaubt Systemdateien wie /etc/passwd zu lesen, Ethernetverbindungen zu modifizieren, enorme Druckaufträge zu senden, etc. Dies hat offensichtliche Implikationen, indem Sie sicherstellen müssen, dass alle von Ihnen zu lesenden bzw. zu schreibenden Dateien auch die richtigen sind.

Stellen Sie sich folgendes Skript vor, in dem ein User zum Ausdruck bringt, dass gerne eine Datei in seinem Heimatverzeichnis löschen möchte. Dies geht von einer Situation aus, in der ein PHP Web-Interface regelmäßig zum Dateimanagement verwendet wird, und der Apache User ist auch berechtigt, in seinem Heimatverzeichnis Dateien zu löschen.

Beispiel 5-1. Schlechte Variablenprüfung führt zu....

<?php
// Löschen einer Datei aus dem Heimatverzeichnis des Users
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");
echo "$file_to_delete wurde gelöscht!";
?>
Da der Benutzername über ein User-Formular zu posten ist, kann jeder einen Benutzer- und Dateinamen von jemand anderen übertragen, und Dateien löschen. In diesem Fall empfiehlt es sich, eine andere Form der Authentifizierung zu verwenden. Stellen Sie sich vor was passieren würde, wenn die übertragenen Variablen "../etc/" und "passwd" beinhalten würden. Der Code würde dann effektiv lesen:

Beispiel 5-2. ... Ein Angriff auf das Dateisystem

<?php
// löscht eine Datei irgendwo auf der Festplatte, wo der 
// Benutzer die nötigen Rechte besitzt. Wenn PHP root hat:
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd wurde gelöscht!";
?>
Es gibt zwei wichtige Kriterien die Sie beachten sollten, um diese Dinge zu vermeiden:

  • Erteilen Sie dem PHP Web-user (Binärdatei) nur eingeschränkte Rechte.

  • Prüfen Sie alle übertragenen Variablen.

Hier ist ein verbessertes Skript:

Beispiel 5-3. Etwas sicherere Prüfung des Dateinamens

<?php
// löscht eine Datei von der Festplatte, auf die
// der PHP user Zugriff hat. 
$username = $_SERVER['REMOTE_USER']; // verwendet eine 
                                     // Authentifizierungsmethode
$homedir = "/home/$username";

$file_to_delete = basename("$userfile"); // den Pfad entfernen
unlink ($homedir/$file_to_delete);

$fp = fopen("/home/logging/filedelete.log","+a"); //logge die Löschung
$logstring = "$username $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);

echo "$file_to_delete wurde gelöscht!";
?>
Auch dies nicht völlig makellos. Wenn Ihr Authentifizierungssystem Benutzern erlauben sollte, deren eigene Logins zu kreieren, und ein Benutzer wählt den Login "../etc", ist das System wieder aufgedeckt. Aus diesem Grund ziehen Sie es vielleicht vor, einen besseren Check zu schreiben:

Beispiel 5-4. Sicherere Dateinamensprüfung

<?php
$username = $HTTP_SERVER_VARS['REMOTE_USER']; // verwendet eine 
                                              // Authentifizierungsmethode
$homedir = "/home/$username";

if (!ereg('^[^./][^/]*$', $userfile))
    die('bad filename'); // "DIE", gehen Sie nicht weiter

if (!ereg('^[^./][^/]*$', $username))
     die('bad username'); // "DIE", gehen Sie nicht weiter
//etc...
?>

Abhängig vom Betriebssystem gibt es eine große Anzahl Dateien mit der Sie sich befassen sollten, inklusive Einträge für Geräte (/dev/ oder com1), Konfigurationsdateien (/etc/ Dateien und die .ini Dateien), gut bekannte Verzeichnisse (/home/, My Documents), etc. Aus diesem Grund ist es gewöhnlich einfacher eine Vorgangsweise einzuführen, bei der außer den von Ihnen explizit erlaubten Dingen alles verboten ist.


Datenbank - Sicherheit

Heutzutage sind Datenbanken die Hauptkomponenten jeder Webbasierten Applikation, aufgrund welcher Websites verschiedene dynamische Inhalte anbieten können. Nachdem heikle oder geheime Informationen in solch einer Datenbank gespeichert werden können, sollten Sie deren Schutz ernsthaft bedenken.

Um Informationen zu bekommen oder zu speichern, müssen Sie eine legitime Abfrage senden, das Ergebnis holen, und die Verbindung schließen. Heutzutage ist die allgemein verwendete Abfragesprache für solche Interaktionen die Structured Query Language (SQL). Sehen Sie, wie sich ein Angreifer an einer SQL Abfrage zu schaffen machen kann.

Sie werden merken, dass PHP Ihre Datenbank alleine nicht schützen kann. Die folgenden Abschnitte sind eine Einführung in die Grundlagen, wie man innerhalb von PHP Skripten auf Datenbanken zugreift und diese manipuliert.

Denken Sie an diese einfache Regel: tief gestaffelte Verteidigung. Je mehr Platz Sie den Maßnahmen zum Schutz Ihrer Datenbank geben, desto geringer ist die Wahrscheinlichkeit, dass ein Angreifer Erfolg hat, und gespeicherte Geheiminformationen aufdeckt oder missbraucht. Gutes Design des Datenbankschemas, und die Applikation wird mit Ihren größten Befürchtungen fertig.


Datenbanken designen

Der Erste Schritt liegt immer im Erstellen der Datenbank, außer Sie wollen eine bereits existierende Dritter verwenden. Ist eine Datenbank erstellt, ist sie einem Eigentümer zugewiesen, welcher das Kommando zum Erstellen ausgeführt hat. Gewöhnlich kann nur der Eigentümer (oder ein Superuser) alles mit den Objekten in dieser Datenbank machen, und um anderen Benutzern die Verwendung zu erlauben, müssen Rechte vergeben werden.

Applikationen sollten sich mit der Datenbank nie als deren Eigentümer oder als ein Superuser verbinden, da diese Benutzer jede gewollte Abfrage ausführen können, um z.B. das Schema zu modifizieren (z.B. Tabellen löschen) oder den gesamten Inhalt löschen.

Sie können verschiedene Datenbanknutzer mit sehr limitierten Rechten auf Datenbankobjekte für jeden Aspekt Ihrer Applikation anlegen. Nur die wirklich benötigten Rechte sollten gewährt werden, und vermeiden Sie, dass der gleiche Benutzer in verschiedenen Anwendungsfällen mit der Datenbank interagieren kann. Das heißt, dass Eindringlinge, welche unter Verwendung einer dieser Referenzen Zugriff auf Ihre Datenbank erlangt haben, nur so viele Änderungen durchführen können, wie es Ihre Applikation kann.

Implementieren Sie nicht alle Geschäftslogik in die Webapplikation (z.B. Ihr Skript), sondern tun Sie das im Datenbankschema unter Verwendung von Sichten, Triggern, oder Regeln. Wenn sich das System entwickelt, werden neu zu öffnende Ports zu der Datenbank vorgesehen, und Sie müssen die Logik in jedem Datenbank-Client neu implementieren. Überdies können Trigger verwendet werden, um transparent und automatisch mit Feldern umzugehen, welche beim debuggen Ihrer Applikation oder beim Zurückverfolgen von Transaktionen oft einen Einblick gewähren.


Zur Datenbank verbinden

Vielleicht wollen Sie die Verbindungen über SSL herstellen, um die Client/Server Kommunikation für eine erhöhte Sicherheit zu verschlüsseln, oder aber auch ssh verwenden, um die Netzwerkverbindung zwischen den Clients und dem Datenbankserver zu verschlüsseln. Ist eines davon realisiert, wird ein Monitoring Ihres Verkehrs und das Erlangen von Informationen zu harter Arbeit.


Verschlüsseltes Speichermodell

SSL/SSH schützt zwar die gerade auf dem Weg befindlichen Daten vom Client zum Server, jedoch nicht die dauernd in einer Datenbank gespeicherten Daten. SSL ist ein "auf-der-Leitung" Protokoll.

Hat ein Angreifer direkten Zugriff auf Ihre Datenbank (den Webserver umgehend), können die gespeicherten heiklen Daten aufgedeckt oder zweckentfremdet werden, außer wenn die Information von der Datenbank selbst geschützt ist. Die Daten zu verschlüsseln ist ein guter Weg, diese Gefahr zu mildern, doch bieten nur wenige Datenbanken diese Art der Verschlüsselung von Daten.

Der einfachste Weg, dieses Problem zu umgehen ist, erst einmal Ihr eigenes Verschlüsselungspaket zu erstellen, und dieses dann in Ihren PHP Skripten zu nutzen. PHP kann Ihnen in diesem Fall mit seinen verschiedenen Erweiterungen helfen, wie z.B. Mcrypt and Mhash, welche eine große Auswahl an Verschlüsselungsalgorhythmen abdecken. Das Skript verschlüsselt die Daten vor dem Speichern, und entschlüsselt diese wieder beim Erhalt. Siehe die Verweise für weitere Beispiele, wie Verschlüsselung arbeitet.

Im Fall von wirklich versteckten Daten, wenn deren unverfälschte Repräsentation nicht nötig ist (z.B. keine Anzeige), ist hashing ebenfalls überlegenswert. Das bekannte Beispiel für das Hashing ist das Speichern des MD5 hash eines Passwortes in einer Datenbank, anstatt des Passwortes selbst. Siehe auch crypt() und md5().

Beispiel 5-5. Verwenden eines hashed Passwortfeldes

// Speichern des Passwort hash
$query  = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
            addslashes($username), md5($password));
$result = pg_exec($connection, $query);

// Afragen, ob der User das richtige Passwort übermittelt hat
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
            addslashes($username), md5($password));
$result = pg_exec($connection, $query);

if (pg_numrows($result) > 0) {
    echo "Welcome, $username!";
}
else {
    echo "Authentication failed for $username.";
}

SQL Injection

Viele Entwickler sind sich nicht bewusst, wie man sich an SQL Abfragen zu schaffen machen kann und nehmen an, dass eine SQL Abfrage ein vertrauenswürdiges Kommando ist. Das heißt, dass SQL Abfragen Zugriffskontrollen hinters Licht führen, und dadurch Standard Authentifizierungs- und Authorisationschecks umgehen können, und manchmal können SQL Abfragen sogar Zugriff zu Kommandos auf Betriebssystemebene erlauben.

Direkt SQL Command Injection ist eine Technik, wo ein Angreifer SQL Kommandos erstellt oder existierende verändert, um versteckte Daten sichtbar zu machen, wertvolle Daten zu überschreiben, oder sogar gefährliche Kommandos auf Systemebene des Datenbank-Hosts auszuführen. Dies wird durch die Applikation erreicht, welche den Input des Benutzers mit statischen Parametern kombiniert, um eine SQL Abfrage zu erstellen. Die folgenden Beispiele basieren - leider - auf wahren Begebenheiten.

Dank dem Mangel an Input Validierungen, und dem Verbinden zum Datenbankserver als ein Superuser oder jemand der Benutzer anlegen kann, kann ein Angreifer einen Superuser in Ihrer Datenbank anlegen.

Beispiel 5-6. Die Ergebnisliste in mehrere Seiten aufsplitten ... und Superuser anlegen (PostgreSQL and MySQL)

$offset = argv[0]; // Vorsicht, keine Validierung des Input !
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// mit PostgreSQL 
$result = pg_exec($conn, $query);
// mit MySQL
$result = mysql_query($query);
Normale Benutzer klicken auf die 'nächste' bzw. 'vorige' Links, wo $offset in der URL enthalten ist. Das Skript erwartet, dass die ankommende $offset einen Dezimalwert enthält. Ganz gleich, jemand versucht einzubrechen, indem er das folgende in einer urlencode()'d Form an die URL anhängt

// Im Fall von PostgreSQL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--

// Im Fall von MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;

Wenn es passiert ist, würde ihm das Skript einen Zugriff als Superuser präsentieren. Beachten Sie, dass 0; ein gültiges Offset zur ursprünglichen Abfrage liefert, und sie beendet.

Anmerkung: Es ist eine übliche Technik, den SQL Parser mittels dem Kommentarzeichen in SQL -- zu zwingen, den Rest der vom Entwickler geschriebenen Abfrage zu ignorieren.

Ein gangbarer Weg um Passwörter zu finden ist, Ihre Seiten mit den Suchergebnissen hinters Licht zu führen. Der Angreifer braucht nur zu probieren, ob irgendeine übertragene Variable, die in dem SQL Statement verwendet wird, nicht richtig gehandhabt wird. Diese Filter können gewöhnlich in einer vorausgehenden Form gesetzt werden, indem WHERE, ORDER BY, LIMIT und OFFSET Klauseln in SELECT Statements umgebaut werden. Wenn Ihre Datenbank das UNION Konstrukt unterstützt, kann der Angreifer versuchen, eine komplette Abfrage an das Original anzuhängen, um Paßwörter aus einer willkürlichen Tabelle aufzulisten. Die Verwendung von verschlüsselten Passwortfeldern wird ausdrücklich empfohlen.

Beispiel 5-7. Artikel auflisten ... und ein paar Passwörter (irgendein Datenbankserver)

$query  = "SELECT id, name, inserted, size FROM products
                  WHERE size = '$size'
                  ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
Der statische Teil der Abfrage kann mit einem anderen SELECT Statement kombiniert werden, welches alle Passwörter preisgibt

'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--

Wenn diese Abfrage (mit dem ' und --) einer der in $query verwendeten Variablen zugewiesen würde, wäre das "Abfragebiest" erwacht.

SQL UPDATEs sind ebenfalls ein Anlass, Ihre Datenbank anzugreifen. Diese Abfragen sind auch durch das Ändern und Anhängen einer komplett neuen Abfrage gefährdet. Aber der Angreifer könnte auch mit der SET Klausel herumspielen. In diesem Fall muss eine Schemainformation vorhanden sein, um die Abfrage erfolgreich manipulieren zu können. Diese kann durch Untersuchen der Variablennamen im Formular, oder simpel mittels brute force gesammelt werden. Es gibt nicht so viele Namenskonventionen für Felder, welche Passwörter oder Benutzernamen speichern.

Beispiel 5-8. Vom Zurücksetzen eines Passwortes ... zum Erlangen von mehr Rechten (irgendein Datenbankserver)

$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
Aber ein böswilliger Benutzer übermittelt den Wert ' or uid like'%admin%'; -- zu $uid, um das Administrator Passwort zu ändern, oder setzt einfach $pwd auf "hehehe', admin='yes', trusted=100 " (mit dem hinteren Leerzeichen), um mehr Rechte zu erhalten. Dann wird die Abfrage verdreht:

// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";

// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"

Ein furchterregendes Beispiel, wie der Zugriff auf Kommandos auf Betriebssystemebene bei manchen Datenbankservern erfolgen kann.

Beispiel 5-9. Angriff auf das Betriebssystem des Datenbank Hosts (MSSQL Server)

$query  = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
Wenn ein Angreifer den Wert a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- zu $prod überträgt, wird $query zu:

$query  = "SELECT * FROM products 
                    WHERE id LIKE '%a%' 
                    exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);

Der MSSQL Server führt die SQL Statements in dem Batch aus, inklusive einem Kommando zum Anlegen eines neuen Benutzers in der Datenbank Accounts. Würde diese Applikation als sa und der MSSQLSERVER Service mit genügend Rechten laufen, hätte der Angreifer nun ein Konto, mit welchem er Zugriff auf diese Maschine hätte.

Anmerkung: Manche der obigen Beispiele sind an einen spezifischen Datenbankserver gebunden. Das heißt jedoch nicht, dass nicht ein ähnlicher Angriff auf andere Produkte möglich wäre. Ihr Datenbankserver könnte auf andere Weise genauso verwundbar sein.


Techniken zur Vermeidung

Sie könnten sich nun darauf berufen, dass der Angreifer in den meisten Beispielen ein Stück Information über das Datenbankschema haben muss. Sie haben recht, aber Sie wissen nie, wann und wie es genommen werden kann, und wenn es passiert, kann Ihre Datenbank entblößt werden. Wenn Sie ein Open Source, oder öffentlich verfügbares Paket zur Handhabung von Datenbanken verwenden, welches vielleicht zu einem Content Management System oder Forum gehört, können Eindringlinge leicht eine Kopie eines Stücks Ihres Codes erstellen. Es kann auch ein Sicherheitsrisiko sein, wenn es sich um ein schlecht designtes Paket handelt.

Diese Angriffe basieren hauptsächlich auf dem Ausnutzen des Codes, welcher ohne Bedenken auf die Sicherheit geschrieben wurde. Vertrauen Sie nie auf irgendeine Art von Input, speziell wenn er von der Clientseite kommt, selbst wenn er von einer Auswahlbox, einem versteckten Eingabefeld, oder einem Cookie kommt. Das erste Beispiel zeigt, dass solch eine untadelige Abfrage ein Disaster anrichten kann.

  • Stellen Sie nie als Superuser oder Owner einer Datenbank eine Verbindung zur Datenbank her. Verwenden Sie immer speziell angelegte Benutzer mit sehr limitierten Rechten.

  • Prüfen Sie, ob der gegebene Input dem erwarteten Datentyp entspricht. PHP bietet eine große Auswahl an Funktionen zum Validieren des Input, von den einfachsten unter Variablenfunktionen und Character Type Functions (z.B. is_numeric() bzw. ctype_digit()), bis hin zu den Perl kompatiblen Regulären Ausdrücken.

  • Wenn die Applikation numerischen Input erwartet, erwägen Sie die Prüfung der Daten mit is_numeric(), oder die Änderung des Typs mit settype(), oder verwenden Sie die numerische Repräsentation mittels sprintf().

    Beispiel 5-10. Ein sicherer Weg, eine Abfrage zu erstellen

    settype($offset, 'integer');
    $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
    
    // Beachten Sie %d im Formatstring, %s zu verwenden wäre sinnlos
    $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
                     $offset);

  • Escapen Sie jeden nicht numerischen Input, welcher zur Datenbank weitergereicht werden soll mit addslashes() oder addcslashes(). Siehe auch das erste Beispiel. Wie dieses Beispiel zeigt, sind in den statischen Teil der Abfrage eingebrachten Escapes nicht genug, und können leicht gehacked werden.

  • Geben Sie keinerlei datenbankspezifische Informationen aus, speziell über das Schema, egal wie (auf ehrliche oder unehrliche Weise). Siehe auch Fehlerbehandlung und Error Handling and Logging Functions.

  • Sie können stored procedures und vorher definierte Cursor verwenden, um den Datenzugriff zu abstrahieren, sodass Benutzer nicht direkt auf Tabellen oder Views zugreifen, aber diese Lösung hat andere Auswirkungen.

Abgesehen davon profitieren Sie von einer Protokollierung der Abfragen entweder in Ihrem Skript, oder durch die Datenbank selbst, wenn es hilft. Klar, die Protokollierung kann nicht irgendeinen schädlichen Versuch verhindern, aber es kann helfen herauszufinden, welche Applikation umgangen wurde. Das Log ist durch die in ihm enthaltene Information nützlich, und je mehr Details es enthält, desto besser ist es im Allgemeinen.


Fehlerbehandlung

PHP Security hat zwei Seiten der Fehlerbehandlung. Eine ist für die Erhöhung der Sicherheit vorteilhaft, die andere ist schädlich.

Eine Standard-Angriffstaktik beinhaltet die Erstellung eines Profils des anzugreifenden Systems, indem die aufgrund der Einspeisung von unzulässigen Daten zurückgegebenen Fehlermeldungen anhand deren Art und des Kontextes ausgewertet werden. Wenn z.B. ein Angreifer Informationen über eine auf einem eingesendeten Formular basierte Seite zusammengetragen hat, kann er versuchen, Variablen zu überschreiben bzw. zu modifizieren:

Beispiel 5-11. Variablen mit einer eigenen HTML Seite angreifen

<form method="post" action="attacktarget?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo">
<input type="hidden" name="password" value="badfoo">
</form>

Die normalerweise zurückgegebenen PHP Fehler können für den Entwickler hilfreich sein, wenn dieser ein Skript debuggen möchte, Hinweise auf eine nicht korrekt arbeitende Funktion oder Datei, oder die PHP Datei und die Zeilennummer des aufgetretenen Fehlers anzeigen lassen möchte. Das sind alles Informationen, die ausgenutzt werden können. Es ist für einen PHP Entwickler nicht unüblich, show_source(), highlight_string(), oder highlight_file() zur Fehlersuche zu verwenden, jedoch kann dies in einem lebenden System auch versteckte Variablen, ungeprüfte Syntax und andere gefährliche Informationen aufdecken. Speziell gefährlich ist es, Code von bekannten Quellen mit integrierten Debugging Handlern auszuführen, oder weit verbreitete Debuggingtechniken zu verwenden. Wenn ein Angreifer die von Ihnen benutzte generelle Technik herausfindet, kann er versuchen, mit Brute-Force Ihre Seite zu knacken, indem er verschiedene allgemein gebräuchliche Debug Strings sendet:

Beispiel 5-12. Ausnutzen von gebräuchlichen Debugging Variablen

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1"&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>

Ungeachtet der Fehlerbehandlungsmethode führt die Möglichkeit ein System nach Fehlermeldungen sondieren dazu, dass einem Angreifer mehr Informationen geboten werden.

Zum Beispiel weist schon alleine der Stil einer Fehlermeldung darauf hin, dass auf einem System PHP läuft. Wenn der Angreifer auf eine .html Seite kommt und untersuchen möchte welches System im Hintergrund läuft (um nach bekannten Systemschwächen zu suchen), könnte dieser mittels der Einspeisung von falschen Daten herausfinden, dass ein System mit PHP aufgebaut ist.

Ein Fehler einer Funktion gibt Aufschluss darüber, ob ein System eine bestimmte Datenbankapplikation benutzt, oder gibt Hinweise darauf, wie eine Webseite programmiert bzw. entworfen wurde. Dies erlaubt eine tiefere Überprüfung von offenen Datenbank-Ports, oder die Suche nach spezifischen Bugs bzw. Schwächen einer Webseite. Mit der Einspeisung von falschen Daten kann ein Angreifer z.B. die Reihenfolge der Authentifizierung in einem Skript bestimmen (anhand der Zeilennummern in den Fehlermeldungen), wie auch durch "Herumstochern" Missbrauchsmöglichkeiten an verschiedenen Stellen im Script herausfinden.

Eine Fehlermeldung des Dateisystems oder eines generellen PHP-Errors welche Rechte der Server hat, wie auch die Struktur und Organisation der Dateien auf dem Webserver. Vom Entwickler geschriebene Fehlermeldungen können das Problem verschlimmern, bis hin zum Preisgeben von zuvor "versteckten" Informationen.

Es gibt drei bedeutende Lösungen zu diesem Thema. Die erste ist, alle Funktionen zu überprüfen und zu versuchen, die Menge an Fehlermeldungen zu ersetzen. Die zweite ist, die Ausgabe von Fehlermeldungen am laufenden Code generell zu deaktivieren. Die dritte ist, sich unter Verwendung der PHP Funktionen zur Fehlerbehandlung seinen eigenen Error-handler zu schreiben. Abhängig von Ihrer Sicherheitspolitik könnte jede der drei Lösungen für Sie geeignet sein.

Ein Weg, diesen Punkt vorzeitig zu behandeln ist, das PHP eigene error_reporting() zu benutzen, um Ihren Code sicherer zu gestalten und möglicherweise gefährliche Nutzungen von Variablen zu entdecken. Wenn Sie Ihren Code noch vor dem Einsatz mit E_ALL testen, können Bereiche entdecken, in denen Ihre Variablen eventuell für Verseuchung oder andere Modifikationen offen sind. Sind Sie bereit zum Einsatz, können Sie Ihren Code mit E_NONE vor Sondierungen schützen.

Beispiel 5-13. Gefährliche Variablen mit E_ALL finden

<?php
if ($username) {  // Vor Verwendung nicht initialisiert oder geprüft
    $good_login = 1;
}
if ($good_login == 1) { // Wenn der obige Test fehlschlägt, ist vor der
                        // Verwendung nicht initialisiert oder geprüft
    fpassthru ("/highly/sensitive/data/index.html");
}
?>


Verwendung von Register Globals

Ein Feature von PHP zur Erhöhung der Sicherheit ist die Konfiguration von PHP mit register_globals = off. Mit Deaktivierung der Möglichkeit, irgendeine vom Benutzer übertragenen Variable in den PHP Code zu injizieren, können Sie die Anzahl "vergifteter" Variablen reduzieren, welche ein potentieller Angreifer zufügen könnte. Dieser benötigt mehr Zeit, um sich Übermittlungen auszudenken, und Ihre internen Variablen sind effektiv von den übergebenen Benutzervariablen isoliert.

Während dies den benötigten Aufwand mit PHP zu arbeiten leicht erhöht ist dargelegt, dass die Vorteile gegenüber dem Aufwand klar überwiegen.

Beispiel 5-14. Mit register_globals=on arbeiten

<?php
if ($username) {  // kann vom User mit get/post/cookies übermittelt werden
    $good_login = 1; 
}

if ($good_login == 1) { // kann vom User mit get/post/cookies übermittelt werden
    fpassthru ("/highly/sensitive/data/index.html");
}
?>

Beispiel 5-15. Mit register_globals = off arbeiten

<?php
if($_COOKIE['username']){
    // kann nur von einem Cookie kommen
    $good_login = 1;
    fpassthru ("/highly/sensitive/data/index.html");
}
?>
Dies weise genutzt ist es auch möglich, präventive Messungen durchzuführen, um bei versuchten Vorstößen zu warnen. Wenn Sie im Voraus wissen, woher eine Variable kommen soll, können Sie prüfen, ob die übermittelten Daten nicht einen unpassenden Weg genommen haben. Obwohl dies nicht garantiert, dass Daten nicht nur ausgedacht sind, erfordert es von einem Angreifer, auch den richtigen Weg zu finden.

Beispiel 5-16. Entdecken einfacher Manipulationen von Variablen

<?php
if ($_COOKIE['username'] &&
    !$_POST['username'] &&
    !$_GET['username'] ) {
    // Durchführen anderer Checks, ob der Benutzername gültig ist...
    $good_login = 1;
    fpassthru ("/highly/sensitive/data/index.html");
} else {
   mail("admin@example.com", "Possible breakin attempt", $_SERVER['REMOTE_ADDR']);
   echo "Security violation, admin has been alerted.";
   exit;
}
?>
Natürlich bedeutet ein einfaches Deaktivieren von register_globals nicht, dass Ihr Code nun automatisch sicher ist. Jeder Teil mit Daten sollte auch auf andere Arten geprüft werden.


Vom Nutzer übermittelte Daten

In vielen PHP Programmen liegt die größte Schwäche nicht an der Sprache selbst, sondern bloß an Code, der nicht mit dem nötigen Augenmerk auf die Sicherheit geschrieben wurde. Deshalb sollten Sie sich immer Zeit nehmen, die Implikationen eines gegebenen Codestücks zu bedenken, um einen möglichen Schaden durch eine eventuell unerwartete übergebene Variable festzustellen.

Beispiel 5-17. Gefährliche Verwendung von Variablen

<?php
// lösche eine Datei aus dem Benutzer-Verzeichnis... 
// oder vielleicht dem eines anderen Benutzers?
unlink ($evil_var);

// Schreibe die Log-Information von deren Zugriff... 
// oder vielleicht einen /etc/passwd Eintrag?
fputs ($fp, $evil_var);

// Führe etwas triviales aus... oder rm -rf *?
system ($evil_var);
exec ($evil_var);

?>
Sie sollten Ihren Code immer sorgfältig kontrollieren, um eine sorgfältige Prüfung irgendwelcher von einem Web-Browser übertragenen Variablen sicherzustellen, und sich selbst folgende Fragen stellen:

  • Wird sich dieses Skript nur auf die vorgesehenen Dateien auswirken?

  • Kann auf ungewöhnliche oder unerwünschte Daten reagiert werden?

  • Kann dieses Skript auf nicht vorgesehene Art genutzt werden?

  • Kann dies in Verbindung mit anderen Skripten in einer negativen Art benutzt werden?

  • Werden alle Transaktionen ausreichend geloggt?

Wenn Sie sich diese Fragen anstatt danach schon während dem Schreiben des Skriptes stellen, ersparen Sie sich das unangenehme Umschreiben, wenn eine Erhöhung der Sicherheit erforderlich wird. Mit dieser Art zu denken werden Sie die Sicherheit des Systems zwar nicht garantieren, aber sie können helfen, sie zu erhöhen.

Sie könnten auch Überlegungen anstellen, ob Sie nicht register_globals, magic_quotes, oder andere bequeme Einstellungen abschalten, welche Sie in Punkto Gültigkeit, Herkunft, oder Inhalt einer gegebenen Variable durcheinanderbringen könnten. Mit PHP im error_reporting(E_ALL) Modus zu arbeiten kann auch helfen, Sie vor Variablen zu warnen, welche benutzt werden, bevor sie geprüft oder initialisiert wurden (so können Sie verhindern, dass mit ungewöhnlichen Daten gearbeitet wird).


Verstecken von PHP

Generell ist Sicherheit durch Unklarheit eine der schwächsten Formen von Sicherheit. Aber in manchen Fällen ist ein klein Wenig mehr an extra Sicherheit wünschenswert.

Ein paar einfache Techniken helfen PHP zu Verstecken, um einen nach Schwächen in Ihrem System suchenden Angreifer möglicherweise langsamer zu machen. Wenn Sie in Ihrer php.ini expose_php = off setzen, reduzieren Sie damit die ihm zur Verfügung stehenden Informationen.

Eine andere Taktik ist, den Webserver wie z.B. Apache entweder mittels einer .htaccess Direktive oder in der Apache Konfigurationsdatei selbst so konfigurieren, dass dieser verschiedene Dateitypen durch PHP parst. So können Sie irreführende Dateierweiterungen verwenden:

Beispiel 5-18. PHP als andere Sprache ausgeben

# Lasse PHP Code wie andere Arten von Code aussehen
AddType application/x-httpd-php .asp .py .pl
Oder komplett unklar machen:

Beispiel 5-19. Verwenden von unbekannten Typen für PHP Dateierweiterungen

# Lasse PHP Code wie unbekannte Typen aussehen
AddType application/x-httpd-php .bop .foo .133t
Oder verstecken Sie ihn als html Code, was einen leichten Performanceverlust bedeutet, da alle html Dateien durch die PHP Engine geparst werden:

Beispiel 5-20. Verwenden von html Typen für PHP Dateierweiterungen

# Lasse PHP code wie html aussehen
AddType application/x-httpd-php .htm .html
Um dies effektiv arbeiten zu lassen, müssen Sie Ihre PHP Dateien nach den obigen Dateierweiterungen umbenennen. Während dies eine Form der Sicherheit durch Verhüllung ist, ist es ein kleines präventives Maß mit ein paar Nachteilen.


Aktuell bleiben

PHP wird, wie jedes andere große System auch, ständig geprüft und weiterentwickelt. Jede neue Version wird oft sowohl große, als auch kleine Änderungen enthalten, welche die Gesamtsicherheit und Stabilität des Systems betreffenden Punkte (z.B. Sicherheit, Konfiguration) verbessern bzw. vorhandene Mängel beheben.

Wie auch bei anderen Scriptsprachen und Programmen auf Systemebene ist der beste Ansatz ein oftmaliges Update, und sich laufend über die letzten Versionen und deren Änderungen zu informieren.


Kapitel 6. Grundlagen der Syntax

Den HTML-Bereich der Datei verlassen

Während des Parsens einer Datei geht PHP den Text solange einfach durch, bis einer der speziellen Tags gefunden wird, der PHP mitteilt, dass ab nun mit der Interpretation des Textes als PHP Code zu beginnen ist. Der Parser führt nun den Code solange aus, bis er auf einen schließenden PHP Tag stößt, welcher dem Parser mitteilt, den Text ab hier wieder nur einfach durchzugehen. Das ist der Mechanismus der es erlaubt, PHP Code in HTML einzubinden: alles außerhalb der PHP Tags wird einfach alleine gelassen, während alles innerhalb dieser Tags als Code geparsed wird.

Es gibt vier Arten von Tags, welche die Böcke mit PHP Code kennzeichnen. Davon sind nur zwei immer verfügbar (<?php. . .?> and <script language="php">. . .</script>), die anderen können in der Konfigurationsdatei php.ini aktiviert bzw. deaktiviert werden. Die Tags in der Kurzform bzw. im ASP-Stil mögen zwar praktisch erscheinen, sind jedoch nicht so portabel wie die längeren Versionen. Wenn Sie weiters beabsichtigen, PHP Code in XML oder XHTML einzubinden, werden Sie die XML-konformen <?php. . .?> verwenden müssen.

Die von PHP unterstützten Tags sind:

Beispiel 6-1. Möglichkeiten, den HTML-Bereich zu verlassen

1.  <?php echo("In XHTML- oder XML-konformen Dokumenten benutzen Sie diese Syntax\n"); ?>

2.  <? echo ("Die einfachste Möglichkeit: eine SGML-´processing instruction´\n"); ?>
    <?= expression ?> Dies ist eine Abkürzung für "<? echo expression ?>"

3.  <script language="php">
        echo ("manche Editoren(wie FrontPage) mögen
              keine ´processing instructions´");
    </script>

4.  <% echo ("Optional können Sie auch Tags im ASP-Stil verwenden"); %>
    <%= $variable; # Das ist ein Abkürzung fuer "<% echo . . ." %>

Die erste Methode (<?php. . .?>) wird bevorzugt, da sie auch die Verwendung von PHP in XML-konformen Code, wie XHTML, erlaubt.

Die zweite Methode ist nicht immer verfügbar. Die Kurzform der Tags ist nur möglich, wenn diese zuvor aktiviert wurde. Dies kann mittels der Funktion short_tags() (nur PHP 3), dem Setzen der Konfigurationsoption short_open_tag in der PHP Konfigurationsdatei, oder durch das Kompilieren von PHP mit der Option --enable-short-tags. Auch wenn dise Methode standardmäßig in der php.ini.dist aktiviert ist, wird die Verwendung dieser Kurzform nicht empfohlen.

Die vierte Methode ist nur verfügbar, wenn die Konfigurationsoption asp_tags aktiviert ist.

Anmerkung: Die Unterstützung der Tags im ASP-Stil wurde in Version 3.0.4. hinzugefügt.

Anmerkung: Die Verwendung der ´short tags´ sollten Sie vermeiden, wenn Sie Applikationen oder Bibliotheken entwickeln, die verteilt oder auf PHP-Servern eingesetzt werden soll, die nicht unter Ihrer Kontrolle stehen, da die ´short tags´ auf dem einzusetzenden Server nicht unterstützt werden könnten. Stellen Sie also sicher, dass für portablen, weiterverteilbaren Code keine ´short tags´ verwendet werden.

Der schließende Tag für den PHP-Block schließt eine sofort folgende Zeilenschaltung mit ein, falls diese vorhanden ist. Außerdem beinhaltet der schließende Tag ein implizites Semikolon; Sie müssen also die letzte Zeile eines PHP-Blocks nicht mit einem Semikolon beenden.

PHP ermöglicht auch die Verwendung folgender Strukturen:

Beispiel 6-2. Erweitertes Verlassen

<?php
if ($expression) {
    ?>
    <strong>Das ist richtig.</strong>
    <?php
} else {
    ?>
    <strong>Das ist falsch.</strong>
    <?php
}
?>
Dies funktioniert wie erwartet, da PHP nach dem Auffinden eines ?> schließenden Tags einfach alles ausgibt, bis es wieder auf einen öffnenden Tag stößt. Das obige Beispiel ist natürlich gekünstelt, aber für die Ausgabe von großen Textblöcken ist der Ausstieg aus dem Parse-Modus generell effizienter, als den gesamten Text durch echo(), print(), etc. zu jagen.


Abgrenzung von Anweisungen

Einzelne Anweisungen werden genauso voneinander abgetrennt wie in C oder Perl - jedes Statement wird mit einem Semikolon beendet.

Auch der schließende Tag (?>) bedeutet das Ende eines Statements, deshalb sind die folgenden Beispiele gleichwertig:

<?php
    echo "Dies ist ein Test";
?>

<?php php echo "Dies ist ein Test" ?>


Kommentare

PHP unterstützt 'C', 'C++' und Unix-Shell-artige Kommentare. Beispiele:

<?php
    echo "Dies ist ein Test"; // Dies ist ein einzeiliger Kommentar im C++-Stil.
    /* Dies ist ein mehrzeiliger Kommentar
       und noch eine Kommentar-Zeile */
    echo "Dies ist noch ein Test";
    echo "... und ein letzter Test"; # Dies ist ein Shell-artiger Kommentar.
?>

Die einzeiligen Kommentar-Arten kommentieren sämtlichen Text bis zum Zeilenende oder bis zum Ende des aktuellen PHP-Blocks aus, je nachdem, was zuerst eintritt.

<h1>Dies ist ein  <?php # echo "einfaches";?> Beispiel.</h1>
<p>Obige Überschrift wird lauten: 'Dies ist ein Beispiel.'.

Man sollte darauf achten, nicht mehrere ´C´-artigen Kommentare ineinander zu setzen, was vorkommen kann, wenn man große Blöcke auskommentiert.

<?php
/*
   echo "Dies ist ein Test"; /* Dieser Kommentar wird ein Problem verursachen. */
*/
?>

Die einzeiligen Kommentar-Arten kommentieren den Text tatsächlich nur bis zum Zeilenende oder bis zum Ende des aktuellen PHP-Blocks aus, je nachdem, was zuerst eintritt. Das heißt, dass HTML Code nach // ?> ausgegeben wird: ?> steigt aus dem PHP-Modus aus und kehrt in den HTML Modus zurück, ohne dass // dies beeinflussen könnte.


Kapitel 7. Typen

Einführung

PHP unterstützt acht primitive Typen.

Vier skalare Typen:

Zwei zusammengesetzte Typen:

Und zuletzt zwei spezielle Typen:

Anmerkung: In diesem Manual werden Sie oft mixed Parameter finden. Diese Pseudo-Typen weisen darauf hin, dass es mehrere Möglichkeiten für diesen Parameter gibt.

Der Typ einer Variabalen wird normalerweise nicht vom Programmierer bestimmt. Zur Laufzeit von PHP wird entschieden, welchen Typs eine Variable ist, abhängig vom Zusammenhang in dem die Variable benutzt wird.

Anmerkung: Um den Typ und den Wert eines bestimmten Ausdrucks (Expression) zu überprüfen, können Sie var_dump() benutzen.

Wenn Sie zur Fehlersuche einfach nur eine lesbare Darstellung eines Typs benötigen, benutzen Sie gettype(). Um auf einen bestimmten Typ zu prüfen, sollten Sie nicht gettype() benutzen. Stattdessen sollten Sie die is_type Funktionen verwenden.

Wenn sie die Umwandlung in einen bestimmten Variablen-Typ erzwingen wollen, erreichen Sie dies entweder durch cast oder durch Gebrauch der Funktion settype().

Beachten Sie, dass sich eine Variable in bestimmten Situationen unterschiedlich verhalten kann, abhängig vom Typ dem die Variable zu dem Zeitpunkt entspricht. Weitere Informationen entnehmen Sie dem Abschnitt zur Typ-Veränderung.


Boolscher Typ

Das ist der einfachste Typ. Ein boolean drückt einen Wahrheitswert aus. Dieser kann entweder TRUE oder FALSE sein.

Anmerkung: Der boolsche Typ wurde in PHP 4 eingeführt.


Syntax

Um einen boolschen Typ wörtlich anzugeben, benutzen Sie entweder das Schlüsselwort TRUE oder FALSE. Beide unterscheiden sich nicht bezüglich der Groß- und Kleinschreibung.

$foo = True; // $foo wird der Wert TRUE zugewiesen

Üblicherweise verwenden Sie einen der Operatoren, der Ihnen einen boolean Wert liefert, den Sie dann an eine der Kontroll-Strukturen weiterreichen.

// == ist ein Vergleichs-Operator der einen boolschen Wert liefert
if ($action == "show_version") {
    echo "Die Version ist 1.23";
}

// Das ist nicht notwendig:
if ($show_separators == TRUE) {
    echo "<hr>\n";
}

// weil Sie einfach folgendes schreiben können:
if ($show_separators) {
    echo "<hr>\n";
}


Umwandlung nach boolean

Um einen Wert ausdrücklich nach boolean zu konvertieren benutzen Sie entweder die Umwandlung mittels (bool) oder (boolean). In den allermeisten Fällen ist es jedoch nicht notwendig die Umwandlung selbst vorzunehmen. Ein Wert wird automatisch konvertiert, falls ein Operator, eine Funktion oder eine Kontrollstruktur ein boolean Argument erfordert.

Siehe auch Typ-Veränderung.

Bei der Umwandlung nach boolean werden folgende Werte als FALSE angesehen:

Jeder andere Wert wird als TRUE angesehen (einschließlich jeder Resource).

Warnung

-1 wird als TRUE angesehen, wie jede andere Zahl ungleich Null (egal ob negativ oder positiv)!


Integer Typen

Ein Integer ist eine Nummer aus der Menge Z = {..., -2, -1, 0, 1, 2, ...}.

Siehe auch: Ganzzahlen beliebiger Länge und Fließkomma-Zahlen


Syntax

Ganzzahlen können in dezimaler (10-basierter), hexadezimaler (16-basierter) oder oktaler (8-basierter) Schreibweise angegeben werden, wahlweise mit einem vorangestellten Zeichen (- oder +).

Wenn Sie die oktale Schreibweise verwenden, müssen Sie die Zahl mit einer vorangestellten Null 0 schreiben; in hexadezimaler Schreibweise müssen Sie vor die Zahl ein 0x schreiben.

Beispiel 7-1. Integer Literale

$a = 1234; // Dezimalzahl
$a = -123; // eine negative Zahl
$a = 0123; // Oktalzahl (entspricht 83 dezimal)
$a = 0x1A; // Hexadezimalzahl (entspricht 26 dezimal)
Die Größe eines Integer-Wertes ist plattformabhängig, ein Maximalwert von ungefähr zwei Milliarden ist jedoch üblich. (Vorzeichenbehafteter 32-Bit-Wert). PHP unterstützt keine vorzeichenlose Integer-Werte.


Integer Überlauf

Wenn Sie eine Zahl jenseits der Grenzen des Typs Integer angeben, wird diese stattdessen als Typ float interpretiert. Wenn Sie eine Operation ausführen, deren Ergebnis eine Zahl jenseits der Grenzen des Typs Integer ist, wird ebenso eine Zahl vom Typ float zurückgegeben.

$large_number =  2147483647;
var_dump($large_number);
// Ausgabe: int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// Ausgabe: float(2147483648)

// das gilt auch für Integers in hexadezimaler Schreibweise:
var_dump( 0x80000000 );
// Ausgabe: float(2147483648)

$million = 1000000;
$large_number =  50000 * $million;
var_dump($large_number);
// Ausgabe: float(50000000000)

Warnung

Bedauerlicherweise gab es einen Bug in PHP, der die korrekte Funktionsweise verhinderte, wenn negative Zahlen verwendet wurden. Ein Beispiel: Bei der Ausführung von -50000 * $million war das Ergebnis -429496728. Sind beide Operanden positiv gibt gibt es keine Probleme.

Dieses Problem ist in PHP 4.1.0 behoben.

In PHP gibt es keinen Operator für Integer Divisonen. 1/2 ergibt float 0.5.

var_dump( 25/7 );
// Ausgabe: float(3.5714285714286)


Umwandlung nach Integer

Um einen Wert ausdrücklich nach integer zu konvertieren benutzen Sie entweder die Umwandlung mittels (int) oder (integer). In den allermeisten Fällen ist es jedoch nicht notwendig die Umwandlung selbst vorzunehmen. Ein Wert wird automatisch konvertiert, falls ein Operator, eine Funktion oder eine Kontrollstruktur ein integer Argument erfordert.

Siehe auch Typ-Veränderung.


Von Booleans

FALSE ergibt 0 (Null), und TRUE ergibt 1 (eins).


Von Fließkomma-Zahlen

Bei der Umwandlung von float nach integer wird die Zahl in Richtung Null gerundet.

Wenn der float jenseits der Grenzen von integer liegt (üblicherweise +/- 2.15e+9 = 2^31), ist das Ergebnis nicht definiert, weil float nicht genug Präzision besitzt um ein genaues integer Ergebnis zu liefern. Keine Warnung, nicht einmal eine Notiz wird in diesem Fall ausgegeben.

Warnung

Wandeln Sie nie einen Teil eines Ausdrucks nach integer um, da dies manchmal zu unerwarteten Ergebnissen führen kann.

echo (int) ( (0.1+0.7) * 10 ); // Ausgabe: 7!

Für mehr Informationen schauen Sie unter Warnung über float-Präzision nach.


Von Zeichenketten/ Strings

Siehe String Umwandlung


Von anderen Typen

Achtung

Das Verhalten bei der Umwandlung nach integer ist für andere Typen nicht definiert. Zum gegenwärtigen Zeitpunkt ist das Verhalten so, als ob der Wert zuerst nach boolean konvertiert wird. Auf jeden Fall sollten Sie sich auf dieses Verhalten nicht verlassen. Es kann sich ohne Ankündigung ändern.


Fließkomma-Zahlenwerte

Fließkomma-Zahlenwerte ("floats", "doubles" oder "reelle Zahlen") können durch eine der folgenden Anweisungen zugewiesen werden:

$a = 1.234;
$a = 1.2e3;
$a = 7E-10;

Die Größe einer Fließkomma-Zahl ist plattformabhängig, dennoch stellt ein Maximum von ~1.8e308 mit einer Genauigkeit von 14 Nachkomma-Stellen einen üblichen Wert dar (das entspricht 64-Bit im IEEE-Format).

Fließkomma Präzision

Es ist ziemlich normal, dass einfache Dezimalzahlen wie 0.1 oder 0.7 nicht in ihre internen binären Entsprechungen konvertiert werden können, ohne einen kleinen Teil ihrer Genauigkeit zu verlieren. Das kann zu verwirrenden Ergebnissen führen. So wird floor((0.1 + 0.7) * 10) normalerweise 7 statt des erwarteten Wertes 8 zurück geben (als Ergebnis der internen Entsprechung von 7.9999999999....

Das gründet sich auf die Tatsache, dass es unmöglich ist, manche Dezimal-Zahlen durch eine endliche Anzahl an Nachkomma-Stellen darzustellen. Dem Wert 1/3 entspricht z.B. der interne Wert von 0.3333333. . ..

Deshalb sollten Sie nie den Ergebnissen von Fließkomma-Operationen bis auf die letzte Nachkomma-Stelle trauen und nie solche auf Gleichheit prüfen. Benötigen Sie wirklich eine größere Genauigkeit, sollten sie die mathematischen Funktionen beliebiger Genauigkeit oder die Gmp Funktionen benutzen.


Strings / Zeichenketten

Ein String ist eine Folge von Zeichen. In PHP entspricht ein Zeichen einem Byte, das heißt, dass exakt 256 unterschiedliche Zeichen möglich sind. Das impliziert auch, dass PHP keine native Unterstützung für Unicode bietet.

Anmerkung: Für einen String stellt die Länge kein Problem dar. Von PHP-Seite aus gibt es keine praktische Grenze für die Größe eines Strings. Daher gibt es keinen Grund sich Sorgen über lange Strings zu machen.


Syntax

Ein String kann auf drei verschiedene Weisen geschrieben werden.


Einfache Anführungszeichen (Single quoted)

Der leichteste Weg einen einfachen String zu schreiben, ist der Einschluss in einfache Anführungszeichen (das Zeichen ').

Um ein einfaches Anführungszeichen wörtlich auszugeben, muss dieses mit einem Backslash (\) escaped werden, wie in vielen anderen Programmiersprachen auch. Wenn Sie innerhalb eines Strings einen Backslash vor einem einfachen Anführungszeichen oder am Ende eines Strings ausgeben wollen, müssen Sie diesen verdoppeln. Beachten Sie: wenn Sie versuchen irgendwelche anderen Zeichen zu escapen, wird der Backslash ebenfalls ausgegeben! Daher besteht für gewöhnlich keine Notwendigkeit den Backslash selbst zu escapen.

Anmerkung: In PHP 3 wird eine Warnung auf der Stufe E_NOTICE ausgegeben, wenn das passiert.

Anmerkung: Anders als bei den zwei anderen Schreibweisen werden Variablen innerhalb von single-quoted Strings nicht ausgewertet.

echo 'Das ist ein einfacher String';
echo 'Sie können ebenso einen Zeilenumbruch einfügen,
auf diese Art.';

echo 'Arnold sagte einmal: "I\'ll be back"';
// Ausgabe: ... "I'll be back"

echo 'Sind Sie sicher, dass Sie C:\\*.* löschen wollen?';
// Ausgabe: ... dass Sie C:\*.* löschen wollen?

echo 'Sind Sie sicher, dass Sie C:\*.* löschen wollen?';
// Ausgabe: ... dass Sie C:\*.* löschen wollen?

echo 'Ich versuche einen Zeilenumbruch an diesem Punkt: \n ein Zeilenumbruch';
// Ausgabe: ... diesem Punkt: \n ein Zeilenumbruch'

$var = "nur zum Vergnügen";
echo 'Das mache ich $var';
// Ausgabe: Das mache ich $var


Doppelte Anführungszeichen (Double quoted)

Wenn ein String in doppelten Anführungszeichen (") eingeschlossen ist, versteht PHP mehr Escape-Folgen für spezielle Zeichen:

Tabelle 7-1. Nicht ausgewertete / übergangene Zeichen:

ZeichenfolgeBedeutung
\nZeilenvorschub (LF oder 0x0A als ASCII-Code)
\rWagenrücklauf (CR oder 0x0D als ASCII-Code)
\thorizontaler Tabulator (HT oder 0x09 als ASCII-Code
\\Backslash / Rückstrich
\$Dollar-Symbol
\"doppelte Anführungszeichen
\[0-7]{1,3} die Zeichenfolge, die dem regulären Ausdruck entspricht ist ein Zeichen in Oktal-Schreibweise
\x[0-9A-Fa-f]{1,2} die Zeichenfolge, die dem regulären Ausdruck entspricht ist ein Zeichen in Hexadezimal-Schreibweise

Noch einmal: wenn Sie versuchen, irgend ein anderes Zeichen zu escapen wird der Backslash ebenfalls ausgegeben!

Der wichtigste Vorteil von double-quoted Strings ist die Tatsache, dass Variablennamen ausgewertet werden. Für Details siehe String Analyse (parsing)


Heredoc

Eine andere Möglichkeit Strings einzufassen, besteht im Gebrauch der heredoc-Syntax ("<<<"). Hierfür ist nach <<< ein Bezeichner zu setzen. Nun folgt der eigentliche String und dann derselbe Bezeichner um den String abzuschließen.

Der schließende Bezeichner muss in der ersten Spalte der Zeile stehen. Die verwendeten Bezeichner müssen den gleichen Regeln entsprechen wie alle anderen PHP-Labels auch: Sie dürfen lediglich alphanumerische Zeichen und den Unterstrich enthalten und müssen mit einem Unterstrich oder einem Buchstaben beginnen.

Warnung

Es ist sehr wichtig zu beachten, dass die Zeile mit dem schließenden Bezeichner keine anderen Zeichen enthält, ausgenommen möglicherweise ein Semikolon (;). Das bedeuted im Besonderen, dass der Bezeichner nicht eingerückt werden darf und es dürfen keine Leerzeichen oder Tabulatoren vor oder nach dem Semikolon stehen.

Heredoc-Text funktioniert wie ein String innnerhalb doppelter Anführungszeichen, nur ohne doppelte Anführungszeichen. Anführungszeichen innerhalb von heredoc-Texten müssen also keiner Sonderbehandlung (escapen) unterzogen werden, aber Sie können dennoch die oben aufgeführten Escape-Anweisungen verwenden. Variablen werden ausgewertet, aber besondere Aufmerksamkeit muss komplexen Variablen gewidmet werden, genau wie bei Strings.

Beispiel 7-2. Beispiel zur String-Festlegung per "heredoc"-Methode:

<?php
$str = <<<EOD
Beispiel eines Strings
über mehrere Script-Zeilen
durch Gebrauch der heredoc-Syntax.
EOD;

/* komplexeres Beispiel, mit Variablen */
class foo {
    var $foo;
    var $bar;

    function foo() {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'Mein Name';

echo <<<EOT
Mein Name ist "$name". Ich schreibe einige $foo->foo.
Nun schreibe ich gerade einige {$foo->bar[1]}.
Dies sollte ein großes 'A' schreiben: \x41
EOT;
?>

Anmerkung: Die heredoc Unterstützung wurde in PHP 4 eingeführt.


Variablen-Analyse (parsing)

Wird ein String in doppelten Anführungszeichen oder mit heredoc angegeben, werden enthaltene Variablen ausgewertet (geparst).

Es gibt zwei Syntax-Typen, eine einfache und eine komplexe. Die einfache Syntax ist die geläufigste und bequemste. Sie bietet die Möglichkeit eine Variable, einen Array-Wert oder eine Objekt-Eigenschaft auszuwerten (parsen).

Die komplexe Syntax wurde in PHP 4 eingeführt und ist an den geschweiften Klammern {}erkennbar, die den Ausdruck umschließen.


Einfache Syntax

Sobald ein Dollarzeichen ($) auftaucht, wird der Parser versuchen, gierig so viele Zeichen wie möglich zu bekommen, um einen gültigen Variablennamen zu bilden. Schließen Sie Ihren Varaiblennamen in geschweifte Klammern ein, wenn Sie ausdrücklich das Ende des Namens angeben wollen.

$beer = 'Heineken';
echo "$beer's Geschmack ist großartig";  // funktioniert, "'" ist kein gültiges
                                         // Zeichen für einen Variablennamen
echo "Er hat einige $beers getrunken";   // funktioniert nicht, 's' ist ein gültiges
                                         // Zeichen für einen Variablennamen
echo "Er hat einige ${beer}s getrunken"; // funktioniert

Auf ähnliche Weise können Sie erreichen, dass ein Array-Index oder eine Objekt-Eigenschaft ausgewertet wird. Bei Array-Indizes markiert die schließende eckige Klammer (]) das Ende des Index. Für Objekt-Eigenschaften gelten die gleichen Regeln wie bei einfachen Variablen, obwohl es bei Objekt-Eigenschaften keinen Trick gibt, wie dies bei Variablen der Fall ist.

$früchte = array( 'Erdbeere' => 'rot' , 'Banane' => 'gelb' );

// Beachten Sie: außerhalb von String-Anführungszeichen funktioniert das anders.
echo "Eine Banane ist $früchte[Banane].";

echo "Dieses Quadrat ist $quadrat->breite Meter breit.";

// Funktioniert nicht. Für eine Lösung siehe die komplexe Syntax.
echo "Dieses Quadrat ist $quadrat->breite00 Zentimeter breit.";

Für irgendetwas Komplexeres sollten Sie die komplexe Syntax nutzen.


Komplexe (geschweifte) Syntax

Diese wird nicht komplex genannt, weil etwa die Syntax komplex ist, sondern weil Sie auf diesem Weg komplexe Ausdrücke einbeziehen können.

Tatsächlich können Sie jeden beliebigen Wert einbeziehen, der im Namensbereich in Strings gültig ist. Schreiben Sie den Ausdruck einfach auf die gleiche Art und Weise, wie außerhalb des Strings, und umschließen diesen mit { und }. Da Sie '{' nicht escapen können, wird diese Syntax nur erkannt, wenn auf { unmittelbar $ folgt. (Benutzen Sie "{\$" oder "\{$" um ein wörtliches "{$" zu erhalten.) Einige Beispiele, um dies zu verdeutlichen:

$great = 'fantastisch';
echo "Das ist { $great}"; // funktioniert nicht, Ausgabe: Das ist { fantastisch}
echo "Das ist {$great}";  // funktioniert, Ausgabe: Das ist fantastisch
echo "Dieses Quadrat ist {$square->width}00 Zentimeter breit."; 
echo "Das funktioniert: {$arr[4][3]}";

// Das ist aus dem gleichen Grund falsch
// wie $foo[bar] außerhalb eines Strings falsch ist.
echo "Das ist falsch: {$arr[foo][3]}";

echo "So sollten Sie es machen: {$arr['foo'][3]}";
echo "Sie können sogar schreiben {$obj->values[3]->name}";
echo "Das ist der Wert der Variable mit Namen $name: {${$name}}";


Zugriff auf Zeichen in Strings

Auf Zeichen innerhalb von Strings kann durch die Angabe des nullbasierten Offsets in geschweiften Klammern nach dem String, auf das gewünschte Zeichen zugegriffen werden.

Anmerkung: Für Abwärtskompatibilität können Sie immer noch die Array-Klammern verwenden. Diese Syntax wird jedoch seit PHP 4 missbilligt.

Beispiel 7-3. Einige String-Beispiele

<?php
// Zuweisung eines Strings.
$str = "Dies ist eine Zeichenkette";

// Erweiterung dieses Strings.
$str = $str . " mit etwas zusätzlichem Text";

// andere Möglichkeit zum Erweitern incl. Anweisung für Neue-Zeile.
$str .= " und einer neuen Zeile am Ende.\n";

/* 
Nach diesen drei Operationen enthält $str:
"Dies ist eine Zeichenkette mit etwas zusätzlichem Text und einer neuen Zeile am Ende.\n."
*/

// Dieser String wird am Ende zu: '<p>Nummer: 9</p>'
$num = 9;
$str = "<p>Nummer: $num</p>";

// Dieser wird zu '<p>Nummer: $num</p>'
$num = 9;
$str = '<p>Nummer: $num</p>';

// Das erste Zeichen eines Strings.
$str = 'Das ist ein Test.'
$first = $str{0};                // $first enthält "D"

// Das letzte Zeichen eines Strings.
$str = 'Das ist immer noch ein Test.'
$last = $str{strlen($str)-1};    // $last enthält "."
?>


Nützliche Funktionen

Zeichenketten / Strings können mittels des '.'(dot)-Operators miteinander verbunden werden. Beachten Sie, dass dafür nicht der '+' (Additions)-Operator verwendet werden kann Für mehr Informationen schauen Sie bitte unter den Zeichenketten-Operatoren nach.

Es gibt eine Menge nützlicher Funktionen zur String-Manipulation.

Für allgemeine Funktionen schauen Sie sich den Abschnitt über String Funktionen an, und für fortgeschrittenes Suchen & Ersetzen die Funktionen zu Regulären Ausdrücken (in zwei Ausführungen: Perl Kompatibel und POSIX erweitert).

Weiterhin gibt es auch noch Funktionen für URL-Strings, und Funktionen zum Verschlüsseln/Entschlüsseln von Strings (mcrypt und mhash).

Schließlich, falls Sie immer noch nicht das gefunden haben wonach Sie suchen, schauen Sie unter den Zeichen-Typen Funktionen nach.


Umwandlung von Zeichenketten / Strings

Sobald ein String als numerischer Wert ausgewertet wird, wird der resultierende Wert und Typ wie folgt festgelegt.

Der String wird als float ausgewertet, wenn er eines der Zeichen '.', 'e' oder 'E' enthält. Ansonsten wird er als Integer-Wert interpretiert.

Der Wert wird durch den Anfangsteil des Strings bestimmt. Sofern der String mit gültigen numerischen Daten beginnt, werden diese als Wert benutzt. Andernfalls wird der Wert 0 (Null) sein. Gültige numerische Daten sind ein optionales Vorzeichen, gefolgt von einer oder mehreren Zahlen (optional mit einem Dezimalpunkt). Wahlweise kann auch ein Exponent angegeben werden. Der Exponent besteht aus einem 'e' oder 'E', gefolgt von einer oder mehreren Zahlen.

$foo = 1 + "10.5";               // $foo ist float   (11.5)
$foo = 1 + "-1.3e3";             // $foo ist float   (-1299)
$foo = 1 + "bob-1.3e3";          // $foo ist integer (1)
$foo = 1 + "bob3";               // $foo ist integer (1)
$foo = 1 + "10 Kleine Schweine"; // $foo ist integer (11)
$foo = 4 + "10.2 Ferkel";        // $foo ist float   (14.2)
$foo = "10 Schweine " + 1;       // $foo ist integer (11)
$foo = "10.0 Schweine " + 1;     // $foo ist float   (11)
$foo = "10.0 Schweine " + 1.0;   // $foo ist float (11)

Weitere Informationen über solche Umwandlungen finden Sie in den UNIX Manualseiten unter strtod(3).

Wenn Sie irgendein Beispiel dieses Abschnitts testen wollen, können Sie dieses per "Copy und Paste" übernehmen. Fügen Sie die folgende Zeile Ihrem Skript hinzu und Sie sehen selbst was passiert:

echo "\$foo==$foo; Typ ist " . gettype ($foo) . "<br />\n";


Arrays

Ein Array in PHP ist eigentlich eine geordnete Abbildung. Eine Abbildung ist ein Typ der Werte auf Schlüssel abbildet. Dieser Typ ist auf mehrere Arten optimiert, so dass Sie ihn auf verschiedene Weise benutzen können: als reales Array, als Liste (Vektor), als Hash-Tabelle (das ist eine praktische Anwendung einer Abbildung), als Verzeichnis, als Sammlung, als Stapel (Stack), als Warteschlange (Queue) und möglicherweise mehr. Da Sie ein weiteres PHP-Array als Wert benutzen können, ist es ziemlich einfach möglich Baumstrukturen zu simulieren.

Die Erklärung dieser Strukturen sprengt den Rahmen dieses Handbuchs, aber Sie finden zumindest ein Beispiel für jede dieser Strukturen. Für weitergehende Informationen verweisen wir auf externe Literatur zu diesem breit gefächerten Thema.


Syntax

Angabe mit array()

Ein array kann mit Hilfe des Sparchkonstrukts array() erzeugt werden. Es benötigt eine bestimmte Anzahl von Komma-getrennten Schlüssel => Wert Paaren.

Ein Schlüssel ist entweder eine Zahl vom Typ integer oder ein string. Wenn ein Schlüssel die Standard-Darstellung einer integer Zahl ist, wird es als solche interpretiert werden, (z.B. "8" wird als 8 interpretiert, während "08" als "08" interpretiert werden wird).

Ein Wert kann irgendetwas sein.

Falls Sie einen Schlüssel weglassen, wird das Maximum des Integer- Indizes genommen und der neue Schlüssel wird dieses Maximum + 1 sein. Das gilt auch für negative Indizes, da ein integer negativ sein kann. Ist zum Beispiel der höchste Index -6 wird der neue Schlüssel den Wert -5 haben. Falls es bis dahin keine Integer-Indizes gibt, wird der Schlüssel zu 0 (Null). Falls Sie einen Schlüssel angeben dem schon ein Wert zugeordnet wurde, wird dieser Wert überschrieben.

Wenn Sie true als Schlüssel benutzen, wird dies als Schlüssel vom Typ integer 1 ausgewertet. Benutzen Sie false als Schlüssel wird dies als Schlüssel vom Typ integer 0 ausgewertet. Die Benutzung von NULL als Schlüssel führt dazu, dass der Schlüssel als leerer String gewertet wird. Verwenden Sie einen leeren String als Schlüssel wird ein Schlüssel mit einem leeren String und seinem Wert erzeugt (oder überschrieben). Das entspricht nicht der Verwendung von leeren Klammern.

Sie können keine Arrays oder Objekte als Schlüssel benutzen. Der Versuch wird mit einer Warnung enden: Illegal offset type.

array( [Schlüssel =>] Wert
     , ...
     )
// Schlüssel ist entweder ein string oder integer
// Wert kann irgendetwas sein.


Erzeugen / Verändern mit der eckigen Klammer-Syntax

Sie können ein bestehendes Array durch explizites Zuweisen von Werten verändern.

Weisen Sie dem Array Werte zu indem Sie den Schlüssel in eckigen Klammern angeben. Sie können den Schlüssel auch weglassen. In diesem Fall schreiben Sie einfach ein leeres Klammerpaar ("[]") hinter den Variablennamen.
$arr[Schlüssel] = Wert;
$arr[] = Wert;
// Schlüssel ist entweder ein string oder ein nicht-negativer integer
// Wert kann irgendetwas sein.
Falls $arr bis dahin nicht existiert, wird es erzeugt. Das ist also eine alternative Syntax um ein Array zu erzeugen. Um einen bestimmten Wert zu ändern, weisen Sie diesem einfach einen neuen Wert zu. Wenn Sie ein Schlüssel/Wert Paar entfernen möchten, benutzen Sie unset().


Nützliche Funktionen

Es gibt viele nützliche Funktionen um mit Arrays zu arbeiten. Schauen Sie unter dem Abschnitt Array Funktionen nach.

Anmerkung: Mit unset() können Sie Schlüssel eines Arrays löschen. Halten Sie sich vor Augen, dass das Array NICHT neu indiziert wird.

$a = array( 1 => 'eins', 2 => 'zwei', 3 => 'drei' );
unset( $a[2] );

/* erzeugt ein Array das wie folgt definiert worden wäre:
   $a = array( 1=>'eins', 3=>'drei');
   und NICHT
   $a = array( 1 => 'eins', 2 => 'drei');
*/

Die foreach Kontrollstruktur gibt es speziell für Arrays. Damit ist es leicht ein Array zu durchlaufen.


Array do's und don'ts

Warum ist $foo[bar] falsch?

Sie sollten immer Anführungszeichen für einen assoziativen Index eines Arrays benutzen. Zum Beispiel sollten Sie $foo['bar'] und nicht $foo[bar] benutzen. Aber warum ist $foo[bar] falsch? Vieleicht kennen Sie folgende Syntax aus alten Skripts:

$foo[bar] = 'Feind';
echo $foo[bar];
// usw

Es ist falsch, funktioniert aber. Warum ist es dann falsch? Der Grund ist, dass dieser Code eine undefinierte Konstante enthält (bar) anstatt eines Strings ('bar'- beachten Sie die Anführungszeichen) und PHP könnte in Zukunft Konstanten definieren, die unglücklicherweise für Ihren Code, den gleichen Namen verwenden. Es funktioniert, weil die undefinierte Konstante in einen String mit gleichem Namen umgewandelt wird.

Wie im Abschnitt Syntax ausgeführt, muss zwischen den eckigen Klammern ('[' und ']') ein Ausdruck stehen. Das heißt, dass Sie Dinge ähnlich diesen schreiben können:

echo $arr[ foo(true) ];

Das ist ein Beispiel dafür, wie Sie den Rückgabewert einer Funktion als Array-Index verwenden können. Ebenso kennt PHP Konstanten, vielleicht haben Sie die E_* Konstanten schon einmal gesehen.

$error_descriptions[E_ERROR]   = "Ein schwerwiegender Fehler ist aufgetreten";
$error_descriptions[E_WARNING] = "PHP hat eine Warnung ausgegeben";
$error_descriptions[E_NOTICE]  = "Das ist nur eine informelle Notiz";

Beachten Sie, dass E_ERROR ebenso ein gültiger Bezeichner ist, genau wie bar im ersten Beispiel. Das letzte Beispiel entspricht aber tatsächlich dem folgendem Code:

$error_descriptions[1] = "Ein schwerwiegender Fehler ist aufgetreten";
$error_descriptions[2] = "PHP hat eine Warnung ausgegeben";
$error_descriptions[8] = "Das ist nur eine informelle Notiz";

weil E_ERROR gleich 1 ist, usw.

Aber wie ist es dann möglich dass $foo[bar] funktioniert? Es funktioniert, weil bar aufgrund seiner Syntax als Konstante ausgewertet wird. In diesem Fall jedoch existiert keine Konstane mit dem Namen bar. PHP nimmt an, dass Sie bar wörtlich gemeint haben, wie den String 'bar', aber vergessen haben, die Anführungszeichen zu setzen.


Aber warum ist es schlecht?

Eines Tages könnte sich das PHP Team entscheiden eine weitere Konstante oder ein Schlüsselwort hinzuzufügen und dann geraten Sie in Schwierigkeiten. Zum Beispiel können Sie bereits die Wörter empty und default auf diese Art nicht benutzen, weil es speziele Schlüsselwörter sind.

Anmerkung: Wenn Sie error_reporting auf E_ALL setzen, werden Sie bemerken, dass PHP jedesmal Notices ausgibt, wenn Sie einen index benutzen, der nicht definiert wurde. (Fügen Sie die Zeile error_reporting(E_ALL); in Ihr Skript ein).

Anmerkung: Innerhalb eines string in doppelten Anführunfszeichen gilt eine andere Syntax. Für mehr Details schauen Sie unter Variablen-Analyse in Strings nach.


Beispiele

Der Array-Typ in PHP ist sehr vielseitig. Hier folgen einige Beispiele um Ihnen die Mächtigkeit von Arrays zu veranschaulichen.

// Das hier
$a = array('Farbe'     => 'rot'
          ,'Geschmack' => 'süß'
          ,'Form'      => 'rund'
          ,'Name'      => 'Apfel'
          ,4                  // Schlüssel ist 0
          );

// ist komplett gleichwertig mit
$a['Farbe']     = 'rot';
$a['Geschmack'] = 'süß';
$a['Form']      = 'rund';
$a['Name']      = 'Apfel';
$a[]            = 4;          // Schlüssel ist 0

$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
/* ergibt das Array: array( 0 => 'a' , 1 => 'b' , 2 => 'c' ),
   oder einfacher: array('a', 'b', 'c')
*/

Beispiel 7-4. Verwenden von array()

// Array als (Eigenschafts-)Abbildung
$map = array('version'    => 4
            ,'OS'         => 'Linux'
            ,'Sprache'    => 'englisch'
            ,'short_tags' => true
            );
            
// strikt numerische Schlüssel
$array = array(7
              ,8
              ,0
              ,156
              ,-10
              );
// Dies entspricht: array( 0 => 7, 1 => 8, ...)

// wechselnde Schlüssel
$wechselnd = array(10          // Schlüssel: 0
                  ,5    =>  6
                  ,3    =>  7
                  ,'a'  =>  4
                  ,11          // Schlüssel: 6 (Maximum der Integer-Indices war 5)
                  ,'8'  =>  2  // Schlüssel: 8 (integer!)
                  ,'02' => 77  // Schlüssel: '02'
                  ,0    => 12  // 10 wird mit dem neuen Wert 12 überschrieben
                  );
                  
// leeres Array
$leer = array();

Beispiel 7-5. Sammlung

$farben = array('rot','blau','grün','gelb');

foreach ($farben as $farbe) {
    echo "Gefällt Ihnen $farbe?\n";
}

/* Ausgabe:
Gefällt Ihnen rot?
Gefällt Ihnen blau?
Gefällt Ihnen grün?
Gefällt Ihnen gelb?
*/

Beachten Sie, dass es gegenwärtig nicht möglich ist die Werte eines Arrays direkt in einer solchen Schleife zu ändern. Eine Lösung ist folgendes:

Beispiel 7-6. Sammlung

foreach ($farben as $key => $farbe) {
    // funktioniert nicht:
    //$farbe = strtoupper($farbe);
    
    //funktioniert:
    $farben[$key] = strtoupper($farbe);
}
print_r($farben);

/* Ausgabe:
Array
(
    [0] => ROT
    [1] => BLAU
    [2] => GRÜN
    [3] => GELB
)
*/

Dieses Beispiel erzeugt ein Array, dessen Schlüssel bei eins beginnt.

Beispiel 7-7. 1-basierter Index

$erstes_viertel  = array(1 => 'Januar', 'Februar', 'März');
print_r($erstes_viertel);

/* Ausgabe:
Array 
(
    [1] => 'Januar'
    [2] => 'Februar'
    [3] => 'März'
)
*/

Beispiel 7-8. Füllen eines realen Arrays

// Füllen eines Arrays mit allen Inhalten eines Verzeichnisses
$handle = opendir('.');
while ($file = readdir($handle)) 
{
    $files[] = $file;
}
closedir($handle);

Arrays sind geordnet. Diese Ordnung können Sie mit Hilfe verschiedener Sortierfunktionen verändern. Für mehr Informationen schauen Sie unter dem Abschnitt zu den Array Funktionen nach.

Beispiel 7-9. Sortien eines Array

sort($files);
print_r($files);

Weil der Wert eines Arrays irgendetwas sein kann, kann dieser Wert wiederum ein Array sein. Somit können Sie rekursive und multidimensionale Arrays erzeugen.

Beispiel 7-10. Rekursive and multidimensionale Arrays

$fruits = array ( "früchte"  => array("a" => "Orange"
                                     ,"b" => "Banane"
                                     ,"c" => "Apfel"
                                     )
                , "nummern"  => array(1
                                     ,2
                                     ,3
                                     ,4
                                     ,5
                                     ,6
                                     )
                , "löcher"   => array("erstens"
                                     ,5 => "zweitens"
                                     ,"drittens"
                                     )
                );

Objekte

Objekt-Initialisierung

Um ein Objekt zu initialisieren benutzen sie die Angabe new, dadurch wird das Objekt einer Variablen-Instanz zugewiesen.

<?php
class foo {
    function do_foo() { 
        echo "Doing foo."; 
    }
}

$bar = new foo;
$bar->do_foo();
?>

Für eine ausführliche Darstellung lesen Sie das Kapitel Klassen und Objekte


Resource

Eine Resource ist eine spezielle Variable, die eine Referenz auf eine externe Resource enthält. Resourcen werden von bestimmten Funktionen erzeugt und benutzt. Eine Liste dieser Funktionen und der entsprechenden Resource-Typen finden Sie im Anhang.

Anmerkung: Der Resource-Typ wurde in PHP 4 eingeführt.


Freigabe von Resourcen

Aufgrund des Reference-Counting Systems, das mit PHP 4's Zend-Egine eingeführt wurde, wird automatisch entdeckt, wenn auf eine Resource nicht mehr zugegriffen wird (wie in Java). Wenn dies der Fall ist werden alle Resourcen, die für diese Resource in Gebrauch waren, durch den "Müllsammler" (garbage collector) freigegeben. Aus diesem Grund ist es selten jemals notwendig, Speicher manuell durch Aufruf von free_result-Funktionen freizugeben.

Anmerkung: Persistente Datenbank-Links stellen einen Sonderfall dar, sie werden durch den gc (garbage collector) nicht zerstört. Siehe auch Persistente Datenbankverbindungen.


NULL

Der spezielle NULL Wert steht dafür, dass eine Varaiable keinen Wert hat. NULL ist der einzig mögliche Wert des Typs NULL.

Anmerkung: Der Null-Typ wurde in PHP 4 eingeführt.

Eine Variable wird als NULL interpretiert, wenn

  • ihr die Konstannte NULL als Wert zugewiesen wurde.

  • ihr bis jetzt kein Wert zugewiesen wurde.

  • sie mit unset() gelöscht wurde.


Syntax

Es gibt nur einen Wert des Typs NULL, das Schlüsselwort NULL. Groß-/Kleinschreibung spielt keine Rolle.

$var = NULL;

Siehe auch is_null() und unset().


Typen-Tricks

PHP erfordert (bzw. unterstützt) keine explizite Typ-Definitionen bei der Deklaration von Variablen; der Typ einer Variablen wird durch den Zusammenhang bestimmt in dem die Variable benutzt wird. Das bedeutet, dass bei der Zuweisung einer Zeichenkette / eines Strings zu einer Variablen var diese Variable var zum Typ String wird. Sollten Sie dananch der Variablen var einen Integer-Wert zuweisen, wird sie zu einem Integer-Typ.

Ein Beispiel für die automatische Typ-Konvertierung von PHP ist der Plus-Operator '+'. Ist einer der zu addierenden Werte vom Typ float, werden alle Werte als float-Typ gbehandelt. Auch das Ergebnis der Addition wird vom Typ float sein. Andernfalls werden die Werte als integer-Typen angesehen und das Ergebnis wird ebenfalls vom Typ Integer sein. Beachten Sie, dass hierdurch NICHT der Typ der Operanden selbst beeinflusst wird; der Unterschied liegt einzig und allein in der Auswertung dieser Operanden.

$foo = "0";                         // $foo ist vom Typ String (ASCII 48)
$foo += 2;                          // $foo ist jetzt vom Typ Integer (2)
$foo = $foo + 1.3;                  // $foo ist nun vom Typ float (3.3)
$foo = 5 + "10 Sehr kleine Ferkel"; // $foo ist vom Typ Integer (15)
$foo = 5 + "10 Kleine Schweine";    // $foo ist vom Typ Integer (15)

Wenn Ihnen die beiden letzten Beispiele merkwürdig erscheinen, beachten Sie die String-Umwandlung.

Wenn Sie die Auswertung einer Variablen als einen speziellen Typ erzwingen wollen, beachten sie den Abschnitt in Typ-Umwandlung. Wollen Sie den Typ einer Variable ändern, schauen Sie bei settype() nach.

Um die Beispiele dieses Kapitels auszuprobieren, können Sie die Funktion var_dump() verwenden.

Anmerkung: Das Verhalten einer automatischen Umwandlung zum Typ Array ist zur Zeit nicht definiert.

$a = "1";       // $a ist ein String
$a[0] = "f";  // Was ist mit den String offsets? Was passiert?

Weil PHP die Indizierung innerhalb von Strings mittels der gleichen Syntax wie bei der Array-Indizierung unterstützt, führt das o.a. Beispiel zu einem Problem: Soll $a zu einem Array werden, dessen erstes Element ein "f" ist oder soll "f" das erste Zeichen des Strings $a werden?

Aus diesem Grund ist das Ergebnis der automatischen Umwandlung seit PHP 3.0.12 und auch in PHP 4.0b3-RC4 nicht definiert. Lösungen werden noch dikutiert.


Typ-Umwandlung

Typ-Umwandlung in PHP funktioniert vielfach wie in C: Der Name des gewünschten Typs wird vor der umzuwandelnden Variablen in Klammern gesetzt.

$foo = 10;           // $foo ist ein Integer-Wert
$bar = (float) $foo; // $bar ist vom Typ float

Folgende Umwandlungen sind möglich:

  • (int), (integer) - nach integer

  • (bool), (boolean) - nach boolean

  • (float), (double), (real) - nach float

  • (string) - nach string

  • (array) - nach array

  • (object) - Wandlung zum Objekt

Anmerkung: Ansttat eine Variable in einen String umzuwandeln, können Sie die Variable auch in doppelte Anführungszeichen einschließen.

Beachten sie, dass Tabulatoren und Leerzeichen innerhalb der Klammern erlaubt sind. Deshalb sind die folgenden Beispiele identisch:

$foo = (int) $bar;
$foo = ( int ) $bar;

Es ist nicht immer offenkundig, was bei der Typ-Umwandlung geschieht. Für weitere Informationen schauen Sie unter folgenden Abschnitten nach:

Wenn Sie eine Umwandlung eines Arrays zu einem String vornehmen oder erzwingen, ist das Ergebnis das Wort Array. Wenn Sie eine Umwandlung eines Objekts zu einem String vornehmen oder erzwingen, ist das Ergebnis das Wort Objekt.

Bei der Umwandlung einer skalaren oder String-Variablen zu einem Array wird die Variable das erste Element des Arrays:

$var = 'ciao';
$arr = (array) $var;
echo $arr[0];        // gibt 'ciao' aus

Sobald eine skalare oder String-Variable in ein Objekt gewandelt wird, wird die Variable zu einem Attribut des Objekts; der Eigenschafts-Name wird 'scalar':

$var = 'ciao';
$obj = (object) $var;
echo $obj->scalar;   // gibt 'ciao' aus


Kapitel 8. Variablen

Grundlegendes

Variablen werden in PHP dargestellt durch ein Dollar-Zeichen ($) gefolgt vom Namen der Variablen. Bei Variablen-Namen wird zwischen Groß- und Kleinschreibung unterschieden (case-sensitive).

Variablen-Namen werden in PHP nach den gleichen Regeln wie andere Bezeichner erstellt. Ein gültiger Variablen-Name beginnt mit einem Buchstaben oder einem Unterstrich ("_"), gefolgt von einer beliebigen Anzahl von Buchstaben, Zahlen oder Unterstrichen. Als regulärer Ausdruck (regular expression) würde das wie folgt ausgedrückt: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'.

Anmerkung: Unserem Zweck entspricht also ein Buchstabe von a bis z bzw. A bis Z oder einem ASCII-Zeichen von 127 bis 255 (0x7f bis 0xff).

$var = "Du";
$vaR = "und";
$Var = "ich";
$vAr = "wir lernen PHP"
echo "$var $vaR $Var, $vAr"; // gibt "Du und ich, wir lernen PHP" aus

$4site  = 'nicht jetzt';     // ungültig, da Anfang eine Zahl
$_4site = 'nicht jetzt';     // gültig, da Unterstrich am Anfang
$täbyte = 'irgendwas';       // gültig, da 'ä' dem ASCII-Wert 228 entspricht

Variablen werden in PHP 3 durch ihren Wert bestimmt. Das heisst, wenn Sie einer Variablen einen Ausdruck zuweisen, wird der gesamte Inhalt des Originalausdrucks in die Zielvariable kopiert. Die Folge ist, dass eine Variable, die ihren Inhalt von einer anderen Variablen erhalten hat, ihren Inhalt behält, auch wenn Sie danach den Inhalt der anderen (Quell- / Ursprungs-)Variablen ändern. Die Inhalte der Ziel- und Quellvariablen sind also insoweit unabhängig voneinander. Für weitere Informationen lesen Sie bitte Expressions / Ausdrücke.

PHP 4 bietet eine andere Möglichkeit der Wertzuweisung bei Variablen: Zuweisung durch Referenzierung. Das bedeutet, dass der Wert der neuen Variablen eine Referenz zur Ursprungs-Variablen darstellt (mit anderen Worten: Der Wert ist ein Alias bzw. Zeiger auf den Inhalt der Ursprungsvariablen). Beide Variablen zeigen also auf die selbe(n) Speicherstelle(n). Änderungen der neuen Variablen ändern auch deren Ursprungs- Variable und umgekehrt. Der Wert / Inhalt wird also nicht kopiert. Die Übertragung geschieht dadurch auch schneller als in PHP 3. Dies wird sich aber nur bei umfangreichen Schleifen oder bei der Übertragung von grossen Arrays oder Objekten bemerkbar machen.

Für die Zuweisung per Referenz müssen Sie lediglich ein & der (Ausgangs-, Quell-) Variablen voranstellen, die sie einer anderen Variablen zuweisen wollen. Der folgende Skript- Ausschnitt wird zweimal 'Mein Name ist Bob' ausgeben:

<?php
$foo = 'Bob';             // 'Bob' der Variablen $foo zuweisen.
$bar = &$foo;             // Zeiger auf $foo in $bar erzeugen.
$bar = "My name is $bar"; // $bar verändern...
echo $foo;                // $foo wurde dadurch ebenfalls verändert.
echo $bar;
?>

Zu beachten ist, dass nur Variablenbezeichner referenziert werden können.

<?php
$foo = 25;
$bar = &$foo;     // Gültige Zuweisung.
$bar = &(24 * 7); // Ungültig, da kein Variablenbezeichner
                  // zugewiesen wird.
function test() {
    return 25;
}

$bar = &();   // Ungültig.
?>


Vordefinierte Variablen

PHP bietet jedem ausgeführtem Skript eine Vielzahl von vordefinierten Variablen an. Viele dieser Variablen können jedoch nicht vollständig erläutert werden, da sie abhängig sind vom Web-Server, der Version und dem Setup des Web- Servers sowie weiteren Faktoren. Einige dieser Variablen stehen nicht zur Verfügung, wenn PHP-Skripte per Kommando- Zeilen-Aufruf ausgeführt werden.

Ungeachtet dieser Faktoren folgt nun eine Liste von vordefinierten Variablen innerhalb einer Basis-PHP 3- Installation als Modul und einer Basis-Installation des Apache-Web-Servers in der Vers. 1.3.6.

Eine Liste aller vordefinierten Variablen (und weitere nützliche Informationen) erhalten Sie durch Lesen der Infos zu (und den Gebrauch) der phpinfo()-Funktion.

Anmerkung: Diese Liste ist weder vollständig noch erhebt sie Anspruch auf Vollständigkeit. Sie dient lediglich als Anleitung zu den möglicherweise zu erwartenden Arten von vordefinierten Variablen und dem Zugriff darauf.


Apache-Variablen

Diese Variablen werden durch den Apache-Web-Server erzeugt. Sollten Sie einen anderen Web-Server nutzen, gibt es keine Garantie, dass dieser die selben Variablen unterstützt. Es könnten einige sein; es könnten aber auch hier nicht aufgeführte sein. Viele dieser Variablen werden in den CGI 1.1 Spezifikationen aufgeführt. Darauf sollten Sie vorbereitet sein.

Beachten Sie, dass nur wenige, wenn überhaupt, dieser Variablen zur Verfügung stehen (oder tatsächlich eine beliebige Bedeutung haben), wenn Sie PHP per Kommandozeile aufrufen.

$GATEWAY_INTERFACE

Die Revision der CGI-Spezifikation, die der Web-Server benutzt, z.B. 'CGI/1.1'.

$SERVER_NAME

Der Host-Name des Web-Servers, der das Skript ausführt. Das kann auch der Name eines virtuellen Servers sein.

$SERVER_SOFTWARE

Der Identifikations-String des Web-Servers (aus den Headern), sobald er Anforderungen beantwortet.

$SERVER_PROTOCOL

Name und Revision des Informations-Protokolls, über das die Seite angefordert wurde, z.B. 'HTTP/1.0'.

$REQUEST_METHOD

Welche Methode zum Zugriff auf die Seite benutzt wurde, z.B. 'GET', 'HEAD', 'POST', 'PUT'.

$QUERY_STRING

Der Abfrage-(Query-)String (falls vorhanden), mit dem auf die Seite zugegriffen wurde.

$DOCUMENT_ROOT

Das Verzeichnis des gerade ausgeführten Skripts aus Sicht des in der Konfigurations-Datei des Servers definierten Dokument-Wurzel-Verzeichnisses.

$HTTP_ACCEPT

Inhalt des Accept:-Headers der aktuellen Anforderung (so es einen solche Header gibt).

$HTTP_ACCEPT_CHARSET

Inhalt des Accept-Charset:-Headers der aktuellen Anforderung (sofern es einen gibt). Beispiel: 'iso-8859-1,*,utf-8'.

$HTTP_ACCEPT_ENCODING

Inhalt des Accept-Encoding:-Headers der aktuellen Anforderung (wenn es einen gibt). Beispiel: 'gzip'.

$HTTP_ACCEPT_LANGUAGE

Inhalt des Accept-Language:-Headers in der aktuellen Anforderung, sofern dieser Header existiert. Beispiel: 'en'.

$HTTP_CONNECTION

Inhalt des Connection:-Headers des aktuellen Request, so er vorhanden ist. Beispiel: 'Keep-Alive'.

$HTTP_HOST

Inhalt des Host:-Headers der aktuellen Anforderung, wenn er existiert.

$HTTP_REFERER

Die Adresse (URL) - sofern vorhanden - der Seite, von der aus auf die aktuelle Seite gesprungen wurde. Dieser wird vom Browser des Benutzers gesetzt. Nicht alle Browser unterstützen dies.

$HTTP_USER_AGENT

Inhalt der User_Agent:-Header-Angabe der aktuellen Anfrage (wenn eine Angabe existiert). Dabei handelt es sich um eine Zeichenkette, welche der Browser benennt, mit dem die aktuelle Seite aufgerufen wurde, z.B. Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Abgesehen von anderen Dingen können Sie diesen Wert zusammen mit der get_browser() Funktion dazu verwenden, ihre Web-Seiten in Abhängigkeit von den Möglichkeiten des jeweils benutzten Browsers anzeigen zu lassen.

$REMOTE_ADDR

Die IP-Adresse, von der aus gerade auf die Web-Seite zugegriffen wird.

$REMOTE_PORT

Der Port, der zum Zugriff auf ihren Web-Server seitens des Anwender-Computers benutzt wird.

$SCRIPT_FILENAME

Der absolute Pfadname des gerade ausgeführten Skripts.

$SERVER_ADMIN

Der Inhalt der in der Konfigurations-Datei des Web-Servers (Apache) stehenden Angabe zum SERVER_ADMIN. Bei virtuellen Hosts der dafür eingetragene Wert.

$SERVER_PORT

Der vom Server für den Web-Server benutzte Kommunikations- Port (normalerweise '80'). Verwenden Sie z.B. SSL, wird dieser Port derjenige sein, den Sie für sicheres HTTP definiert haben.

$SERVER_SIGNATURE

Sofern eingeschaltet, enthält diese Zeichenkette die Server- Version und den virtuellen Host-Namen. Sie wird den durch den Server generierten Seiten hinzu gefügt.

$PATH_TRANSLATED

In Abhängigkeit vom Datei- / File-System der Pfad des aktuellen Skripts, nachdem der Server das virtuelle Mapping in ein reales Mapping umgesetzt hat (nicht der Dokument-Wurzel-Pfad).

$SCRIPT_NAME

Enthält den Pfad des aktuellen Skripts. Nützlich für Seiten, die auf sich selbst verweisen müssen.

$REQUEST_URI

Die URI, die durch den Zugriff auf die aktuelle Seite gegeben ist, z.B. '/index.html'.


Umgebungs- / Environment-Variablen

Diese Variablen werden aus der Umgebung, in der PHP läuft, in den globalen Namensbereich von PHP importiert. Viele werden durch die jeweilige Shell, in der PHP läuft, unterstützt bzw. gebildet. Da es verschiedenste Systemumgebungen mit den unterschiedlichsten Shell`s gibt, ist es nicht möglich, eine abschließende Liste der definierten Umgebungs-Variablen aufzustellen. Lesen Sie deshalb in der Anleitung zu ihrer Shell nach, um eine Liste dieser systembezogenen Variablen zu erhalten.

Andere Umgebungs-Variablen beinhalten die CGI-Variablen, die ohne Rücksicht darauf, ob PHP als Web-Server-Modul oder im CGI-Modus läuft, gesetzt werden.


PHP-Variablen

Diese Variablen werden durch PHP selbst erzeugt. $HTTP_*_VARS Variablen stehen nur zur Verfügung, wenn die Option track_vars in der php.ini auf "on" gesetzt ist. Wenn dies der Fall ist, werden diese Variablen immer gesetzt, selbst wenn es leere Arrays sind. Das verhindert, dass ein böswilliger Nutzer diese Variablen manipuliert.

Anmerkung: Seit PHP 4.0.3 ist track_vars immer aktiviert, ohne Rücksicht auf die Einstellungen in der Konfigurationsdatei.

Anmerkung: Die neuen "Superglobals" stehen seit der PHP Version 4.1.0. zur Verfügung. Im 4.1.0 Release Announcement können Sie mehr Details nachlesen. Dieses sind die Arrays $_GET, $_POST, $_ENV, $_SERVER, $_COOKIE, $_REQUEST $_FILES und $_SESSION und werden informell als Superglobals bezeichnet, weil sie immer zur Verfügung stehen, ohne Berücksichtigung des Geltungsbereichs.Damit sind die alten, beziehungsweise die $HTTP_*_VARS Arrays veraltet.

Wenn register_globals aktiviert ist,stehen auch diese Variablen im globalen Namensbereich des Skripts zur Verfügung; z.B. getrennt von den Arrays $HTTP_*_VARS und $_*. Verwandte Informationen erhalten Sie im Kapitel über Sicherheit unter dem Abschnitt Verwendung von Register Globals.

$argv

Ein Array von Argumenten, die dem Skript übergeben werden. Wird das Skript an der Befehlszeile aufgerufen, ermöglicht dies C-ähnlichen Zugriff auf die Kommando- Zeilen-Parameter. Beim Aufruf per GET-Methode enthält dieses Array die Abfragewerte.

$argc

Anzahl der per Kommando-Zeile dem Skript übergebenen Parameter (wenn von dort aufgerufen).

$PHP_SELF

Der Dateiname des gerade ausgeführten Skripts, relativ zum Wurzel-Verzeichnis des Dokuments. Bei Kommando-Zeilen- Aufrufen ist diese Variable nicht verfügbar.

$HTTP_COOKIE_VARS

Ein assoziatives Array von Variablen, das dem aktuellen Skript über HTTP-Cookies übergeben wurde.

$_COOKIE

Ein assoziatives Array von Variablen, das dem aktuellen Skript über HTTP-Cookies übergeben wurde. Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_GET_VARS

Ein assoziatives Array von Variablen, das dem aktuellen Skript per HTTP-GET-Methode übergeben wurde.

$_GET

Ein assoziatives Array von Variablen, das dem aktuellen Skript per HTTP-GET-Methode übergeben wurde.Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_POST_VARS

Ein assoziatives Array aus Varaiblen, welches dem aktuellen Skript per HTTP-POST-Methode übergeben wurde.

$_POST

Ein assoziatives Array aus Variablen, welches dem aktuellen Skript per HTTP-POST-Methode übergeben wurde. Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_POST_FILES

Ein assoziatives Array aus Variablen, das Informationen über per HTTP POST-Methode hochgeladene Dateien enthält. Siehe Dateiuploads mit POST für Informationen über den Inhalt der $HTTP_POST_FILES. Eingeführt in PHP 4.0.0.

$_FILES

Ein assoziatives Array aus Variablen, das Informationen über per HTTP POST-Methode hochgeladene Dateien enthält. Siehe Dateiuploads mit POST für Informationen über den Inhalt der $_FILES.Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_ENV_VARS

Ein assoziatives Array aus Variablen, die dem aktuellen Skript über die Umgebung zur Verfügung stehen.

$_ENV

Ein assoziatives Array aus Variablen, die dem aktuellen Skript über die Umgebung zur Verfügung stehen. Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_SERVER_VARS

Ein assoziatives Array aus Variablen, die dem aktuellen Skript vom jeweiligen HTTP-Server übermittelt werden. Diese Variablen sind analog zu den oben beschriebenen Apache-Variablen.

$_SERVER

Ein assoziatives Array aus Variablen, die dem aktuellen Skript vom jeweiligen HTTP-Server übermittelt werden. Diese Variablen sind analog zu den oben beschriebenen Apache-Variablen. Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.

$HTTP_SESSION_VARS

Ein assoziatives Array aus Session-Variablen, die dem aktuellen Skript übergeben wurden.

$_SESSION

Ein assoziatives Array aus Session-Variablen, die dem aktuellen Skript übergeben wurden. Automatisch global in jedem Geltungsbereich. Werden dem Array $_SESSION neue Einträge hinzugefügt, werden diese automatisch als Session-Variablen registriert, genau so als ob die Funktion session_register() aufgerufen worden wäre. Eingeführt in PHP 4.1.0.

$_REQUEST

Ein assoziatives Array zusammengesetzt aus den GET, POST und Cookie Variablen. Mit anderen Worten - alle Informationen die vom Nutzer kommen und denen aus Sichtweise der Sicherheit nicht zu trauen ist. Automatisch global in jedem Geltungsbereich. Eingeführt in PHP 4.1.0.


Geltungsbereich von Variablen

Der Geltungsbereich einer Variablen ergibt sich aus dem Zusammenhang, in dem sie definiert wurde. Meistens besteht dieser aus einem einzigen Bereich. Dieser beinhaltet auch den Bereich für Dateien, die per "include"- oder "require"-Anweisung eingebunden wurden, z.B.:

$a = 1;
include "b.inc";

Die Variable $a ist auch in der eingebundenen Datei b.inc verfügbar. In benutzerdefinierten Funktionen wird ein auf die Funktion beschränkter Geltungsbereich eingeführt. Jede in einer Funktion benutzte Variable ist zunächst auf den lokalen Bereich der Funktion beschränkt, z.B.:

$a = 1; // globaler Bereich

function test () { 
    echo $a; // Referenz auf einen lokalen Variablen-Bereich
} 

test ();

Dieses Skript erzeugt keine Bildschirm-Ausgabe, da sich die Echo- Anweisung auf eine lokale Variable namens $a bezieht und dieser kein Wert im lokalen Bezug zugewiesen worden ist. Dies ist ein kleiner Unterschied zu C, wo globale Variablen auch in Funktionen vorhanden sind, es sei denn, sie werden durch eine funktionsinterne Definition überschrieben. Das kann zu Problemen führen, denn in PHP müssen global geltende Variablen innerhalb von Funktionen als solche definiert werden. Ein Beispiel:

$a = 1;
$b = 2;

function Sum()
{
    global $a, $b;

    $b = $a + $b;
} 

Sum();
echo $b;

Das obige Skript gibt "3" aus. Durch das Deklararieren der Variablen $a und $binnerhalb der Funktion als global, weisen alle Referenzen zu beiden Variablen auf die nun globalen Werte. Es gibt keine Beschränkungen bei der Anzahl an globalen Variablen, die durch eine Funktion verändert werden können.

Eine weitere Möglichkeit besteht in der Verwendung des speziellen $GLOBALS PHP-Array. Das obige Beispiel kann damit auch so geschrieben werden:

$a = 1;
$b = 2;

function Sum()
{
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 

Sum();
echo $b;

Das $GLOBALS-Array ist ein assoziatives Array mit dem Bezeichner der globalen Variablen als Schlüssel und dem Inhalt dieser Variablen als Wert des Array-Elements.

Ein weiterer wichtiger Anwendungszweck von Variablen-Bereichen ist die static-Variable. Eine statische Variable existiert nur in einem lokalen Funktions-Bereich, der Wert geht beim Verlassen dieses Bereichs aber nicht verloren. Schauen Sie das folgende Beispiel an:

function test ()
{
    $a = 0;
    echo $a;
    $a++;
}

Diese Funktion ist sinnlos, da sie bei jedem Aufruf $a auf 0 setzt und "0" ausgibt. Die Anweisung $a++, welche den Wert erhöht, macht keinen Sinn, da der Wert von $a beim Verlassen der Funktion verloren geht. Um eine sinnvolle Zählfunktion zu implementieren, die ihren aktuell gesetzten Wert nicht vergisst, müssen Sie die Variable $aals "static" deklarieren:

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

Jetzt wird bei jedem Aufruf der test()-Funktion der aktuelle Wert von $a ausgegeben und dann um 1 erhöht.

Static-Variablen ermöglichen auch einen Weg zum Umgang mit rekursiven Funktionen. Das sind Funktionen, die sich selbst aufrufen. Hierbei besteht die Gefahr, so genannte Endlos- Schleifen zu programmieren. Sie müssen also einen Weg vorsehen, diese Rekursion zu beenden. Die folgende einfache Funktion zählt rekursiv bis 10. Die statische Variable $count wird benutzt, um die Rekursion zu beenden:

function test()
{
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        test ();
    }
    $count--;
}


Variable Variablen

Manchmal ist es komfortabel, variable Variablen-Bezeichner zu benutzen. Das bedeutet, einen Variablen-Namen zu setzen und dynamisch zu gebrauchen. Eine normale Variable wird wie folgt gebildet:

$a = "Hallo";

Eine variable Variable nimmt den Wert einer Variablen und behandelt ihn als Bezeichner der Variablen. Im obigen Beispiel kann Hallo als Variablen-Name gebraucht werden, indem man zwei $-Zeichen benutzt, also schreibt:

$$a = "Welt";

Nun existieren in der PHP-Symbol-Struktur zwei definierte und gespeicherte Variablen: $a mit dem Inhalt "Hallo" und $Hallo mit dem Inhalt "Welt". Deshalb wird die Anweisung

echo "$a ${$a}";

zur genau gleichen Ausgabe führen wie:

echo "$a $Hallo";

also zu: Hallo Welt.

Wenn Sie variable Variablen mit Arrays verwenden, müssen Sie eine Doppeldeutigkeit beachten. Wenn Sie nämlich $$a[1] schreiben, dann muss der Parser wissen, ob Sie $a[1] als Variable oder $$a als Variable und dann [1] als Index dieser Variablen verwenden wollen bzw. gemeint haben. Die Syntax zur Lösung dieser Doppeldeutigkeit: Verwenden Sie im ersten Fall ${$a[1]} und im zweiten Fall ${$a}[1].


Variablen ausserhalb von PHP

HTML-Formulare (GET and POST)

Sobald ein Formular an ein PHP-Skript übergeben wird, wird jede Variable dieses Formulars dem Skript automatisch verfügbar gemacht. Dafür sorgt PHP. Falls die Konfigurationsoption track_vars auf "on" gesetzt ist, werden diese Variablen in diesen assoziativen Arrays abgelegt $HTTP_POST_VARS, $HTTP_GET_VARS und/oderr $HTTP_POST_FILES, entsprechend der Quelle, aus der die fragliche Variable kommt.

Für weitere Informationen über diese Variablen lesen Sie bitte den Abschnitt über Vordefinierte Variablen.

Beispiel 8-1. Einfache Formular-Variablen

<form action="foo.php" method="post">
    Name: <input type="text" name="username"><br>
    <input type="submit">
</form>

Wird dieses Formular abgeschickt, steht der Wert des Textfeldes in der Variable $HTTP_POST_VARS['username'] zur Verfügung. Wenn in der Konfigurationsdatei die Option register_globals auf "on" gesetzt ist, steht die Variable auch als $username global zur Verfügung.

Anmerkung: Die Konfigurationseinstellung zu magic_quotes_gpc betrifft Get, Post and Cookie Werte. Ist diese Einstellung aktiv wird der Wert (It's "PHP!") automatisch zu (It\'s \"PHP!\"). Escaping ist notwendig, wenn Sie ihre Daten in eine Datenbank einfügen wollen. Siehe auch: addslashes(), stripslashes() und magic_quotes_sybase.

Im Zusammenhang mit Formular-Variablen versteht PHP auch Arrays (siehe auch die verwandte Faq). Sie können z.B. die betreffenden Variablen gruppieren oder dieses Leistungsmerkmal nutzen, um Werte aus Mehrfach-Auswahl-Bereichen zu erhalten.

Beispiel 8-2. Komplexere Formular-Variablen

<form action="array.php" method="post">
    Name:  <input type="text" name="personal[name]"><br>
    Email: <input type="text" name="personal[email]"><br>
    Bier: <br>
    <select multiple name="bier[]">
        <option value="binding">Binding
        <option value="warsteiner">Warsteiner
        <option value="stauder">Stauder
        <option value="stuttgarter">Stuttgarter Schwabenbräu
    </select>
    <input type="submit">
</form>

In PHP 3 ist die Verwendung von Arrays in Formularvariablen auf eindimensionale Arrays beschränkt. In PHP 4 besteht diese Einschränkung nicht mehr.


IMAGE SUBMIT Variablen-Bezeichner

Zur Übertragung eines Formulars kann auch ein Bild (Image) statt eines Übertragungs-Schalters (Submit-Button) benutzt werden, dessen Tag wie folgt aussieht:

<input type="image" src="image.gif" name="sub">

Klickt der Benutzer irgendwo auf das Bild, wird das entsprechende Formular an den Web-Server übertragen. Hierbei sind zwei zusätzliche Variablen vorhanden, sub_x und sub_y. Diese enthalten die Koordinaten des Klick-Punktes innerhalb des Bildes. Die Erfahreneren werden sagen, dass die Variablen, die vom Browser gesendet werden einen Punkt enthalten statt eines Unterstrichs. Dieser Punkt wird von PHP automatisch in einen Unterstrich verwandelt.


HTTP-Cookies

PHP unterstützt HTTP-Cookies, wie sie in Netscape's Spec definiert sind. Cookies ermöglichen die Daten-Speicherung innerhalb der jeweiligen Browser-Umgebung zur Weiterleitung oder wiederholten Identifikation von Benutzern. Sie können Cookies erzeugen, indem Sie die Funktion setcookie() benutzen. Cookies sind Teil des HTTP-Headers, deshalb muss die setcookie-Funktion aufgerufen werden, bevor irgendeine Ausgabe an den Browser gesendet wird. Dabei handelt es sich um die gleiche Einschränkung, die auch für die header()-Funktion gilt. Alle Cookies, die der Client an sie sendet werden in PHP-Variablen umgesetzt, genau wie die Daten bei den GET- und POST-Methoden.

Wenn Sie einem einzelnen Cookie mehrere Wert zuweisen wollen müssen Sie dem Cookie-Namen [] hinzufügen. Z.B.:

SetCookie ("MeinCookie[]", "Ich teste", time()+3600);

Bedenken Sie, dass ein Cookie ein vorhergehendes Cookie gleichen Namens überschreibt, es sei denn, der Pfad oder die Domain ist anders. Für eine Warenkorb-Anwendung können Sie deshalb z.B. einen Zähler bilden und diesen weiterleiten:

Beispiel 8-3. SetCookie-Beispiel

$Count++;
setcookie("Count", $Count, time()+3600);
setcookie("Cart[$Count]", $item, time()+3600);

Umgebungs- / Environment-Variablen

PHP sorgt automatisch für die Verfügbarkeit der Umgebungs- Variablen als normale PHP-Variablen.

echo $HOME;  /* Zeigt die HOME-Umgebungs-Variable (sofern gesetzt). */

Da Informationen per GET, POST und Cookie-Mechanismen übergeben werden, ist es manchmal das Beste, Umgebungs-Variablen explizit auszulesen. Dadurch wird die richtige Version eingelesen. Hierfür kann die getenv()-Funktion genutzt werden. Den Wert einer Umgebungs-Variablen können Sie per putenv()- Funktion setzen.


Punkte in eingelesenen Variablen-Bezeichnern

Normalerweise verändert PHP die Variablen-Bezeichner nicht, wenn sie einem Skript übergeben werden. Es sollte aber beachtet werden, dass der Punkt (".") kein gültiger Bestandteil eines Variablen-Bezeichners ist. Deshalb achten Sie auf folgendes:
$varname.ext;  /* ungültiger Variablen-Bezeichner */
Der PHP-Parser sieht eine Variable namens $varname, gefolgt von einem Zeichenketten-Verbindungs-Operator, dieser wiederrum gefolgt von der offenen Zeichenkette 'ext' (also nicht eingegrenzt durch '"' und auch keinem Schlüssel oder reserviertem Bezeichner entsprechend). Das kann natürlich nicht zum gewünschten Ergebnis führen.

Deshalb ist es wichtig zu wissen, dass PHP in den ihm übergebenen Variablen alle Punkte (.) automatisch durch einen Unterstrich (_) ersetzt.


Bestimmung des Variablen-Typs

Da PHP den Typ der Variablen bestimmt und (im Allgemeinen) selbst eine entsprechende Umformung vornimmt, ist es nicht immer klar, welchen Typ eine Variable gerade hat. PHP beinhaltet einige Funktionen, die dies herausfinden. Als da sind: gettype(), is_long(), is_double(), is_string(), is_array() und is_object().


Kapitel 9. Konstanten

Eine Konstante ist ein Bezeichner (Name) für eine simple Variable. Wie der Name schon ausdrückt, kann sich der Wert einer Konstanten zur Laufzeit eines Skripts nicht ändern (eine Ausnahme bilden die Magischen Konstanten, die aber tatsächlich keine Konstanten sind.) Eine Konstante unterscheidet zwischen Groß- und KLeinschreinbung (case-sensitive). Nach gängiger Konvention werden Konstanten immer in Großbuchstaben geschrieben.

Der Name einer Konstanten folgt den gleichen Regeln wie alle anderen Bezeichner in PHP. Ein gültiger Name beginnt mit einem Buchstaben oder einem Unterstrich, gefolgt von beliebig vielen Buchstaben, Nummern oder Understrichen. Als regulärer Ausdruck geschrieben: [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

Anmerkung: Für unsere Zwecke ist ein Buchstabe a-z, A-Z und die ASCII-Zeichen von 127 bis 255 (0x7f-0xff).

Der Gültigkeitsbereich einer Konstanten ist global -- Sie können unabhängig vom Gültigkeitsbereich überall auf eine Konstante zugreifen.


Syntax

Eine Konstante können Sie über die Funktion define() definieren. Einmal definiert, kann eine Konstane weder verändert noch gelöscht werden.

Konstanten können nur scalare Daten (boolean, integer, float und string) enthalten.

Den Wert einer Konstanten erhalten Sie ganz einfach durch die Angabe ihres Namens. Einer Konstanten sollten Sie nicht,wie bei Variablen, ein $ voranstellen. Ebenso können Sie die Funktion constant() benutzen um den Wert einer Konstanten auszulesen, wenn Sie den Namen der Konstanten dynamisch erhalten wollen. Benutzen Sie get_defined_constants() um eine Liste aller definierten Konstanten zu erhalten.

Anmerkung: Konstanten und (globale) Variablen befinden sich in unterschiedlichen Namensräumen. Das hat zum Beispiel zur Folge, dass TRUE und $TRUE grundsätzlich unterschiedlich sind.

Falls Sie eine undefinierte Konstante verwenden, nimmt PHP an, dass Sie den Namen der Konstanten selber meinen. Wenn das passiert wird eine Notice ausgegeben. Benutzen Sie die Funktion defined() um herauszufinden, ob eine Konstante definiert ist.

Das hier sind die Unterschiede zwischen Konstanten und Variablen:

  • Konstanten haben kein Dollarzeichen ($) vorangestellt;

  • Konstanten können nur über die Funktion define() definiert werden, nicht durch einfache Zuweisung;

  • Konstanten können überall definiert werden und auf Ihren Wert können Sie ohne Rücksicht auf Namensraumregeln von Variablen zugreifen;

  • Sobald Konstanten definiert sind, können sie nicht neu definiert oder gelöscht werden; und

  • Konstanten können nur skalare Werte haben.

Beispiel 9-1. Definiton von Konstanten

<?php
define("CONSTANT", "Hallo Welt.");
echo CONSTANT; // Ausgabe: "Hallo Welt."
echo Constant; // Ausgabe: "Constant" und eine Notice.
?>


Vordefinierte Konstanten

PHP stellt jedem Skript eine Reihe von vordefinierten Konstanten zur Verfügung. Viele dieser Konstanten werden jedoch von verschiedenen Erweiterungen definiert, die nur zur Verfügung stehen, wenn diese Erweiterungen selbst zur Verfügung stehen, entweder über dynamisches Laden zur Laufzeit oder sie sind einkompiliert.

Es gibt vier magische Konstanten, die sich abhängig davon, wo sie eingesetzt werden, einen unterschiedlichen Wert haben. Zum Beispiel hängt der Wert der Konstanten __LINE__ davon ab, in welcher Zeile ihres Skripts Sie diese Konstante verwenden. Diese besonderen Konstanten sind unabhängig von Groß-/Kleinschreibung und sind folgende:

Tabelle 9-1. Einige "magische" PHP "Konstanten"

NameBeschreibung
__LINE__ Die aktuelle Zeilennummer einer Datei.
__FILE__ Der vollständige Pfad- und Dateiname einer Datei.
__FUNCTION__ Der Name einer Funktion. Steht seit PHP 4.3.0 zur Verfügung.
__CLASS__ Der Name einer Klasse. Steht seit PHP 4.3.0 zur Verfügung.

Eine Liste vordefinierter Konstanten finden Sie im Abschnitt Vordefinierte Konstanten.


Kapitel 10. Ausdrücke

Ausdrücke (Expressions) sind die wichtigsten Bausteine von PHP. In PHP ist fast alles, was geschrieben wird, ein Ausdruck. Die einfachste, aber auch zutreffenste Definition für einen Ausdruck ist "alles, was einen Wert hat".

Die grundlegendste Formen von Ausdrücken sind Konstanten und Variablen. Wenn man "$a = 5" schreibt, weist man $a den Ausdruck ´5´ zu. ´5´ hat offensichtlich den Wert 5. Anders ausgedrückt: ´5´ ist ein Ausdruck mit dem Wert 5 (in diesem Fall ist ´5´ eine Integer-Konstante).

Nach dieser Zuweisung würde man erwarten, dass der Wert von $a nun ebenfalls 5 ist, wenn man also $b = $a schreibt, sollte dasselbe dabei herauskommen, als hätte man $b = 5 geschrieben. Anders ausgedrückt: $a wäre ebenfalls ein Ausdruck mit dem Wert 5. Wenn alles richtig funktioniert, wird genau das passieren.

Etwas kompliziertere Beispiele für Ausdrücke sind Funktionen:

function foo () {
    return 5;
}

Angenommen, Sie sind mit dem Konzept von Funktionen vertraut (wenn Sie es nicht sind, lesen Sie das Kapitel über Funktionen), dann würden Sie annehmen, dass die Eingabe von $c = foo() grundsätzlich daselbe bedeutet, als würde man schreiben $c = 5,und genau das trifft zu. Funktionen sind Ausdrücke mit dem Wert ihres Rückgabewertes. Da foo() den Wert 5 zurückgibt, ist der Wert des Ausdruckes ´foo()´ 5. Normalerweise geben Funktionen nicht einfach einen statischen Wert zurück, sondern berechnen irgendetwas.

Natürlich müssen Werte in PHP keine Integer-Zahlen sein, und oft sind sie es auch nicht. PHP unterstützt drei skalare Datentypen: integer values (Integer-Zahlen),floating point values (Fließkommazahlen) und string values (Zeichenketten). (Skalare sind Datentypen, die man nicht in kleinere Stücke ´brechen´ kann, im Gegensatz zu Arrays). PHP unsterstützt auch zwei zusammengesetzte (nicht-skalare) Datentypen: Arrays und Objekte. Jeder dieser Datentypen kann Variablen zugewiesen und von Funktionen zurückgegeben werden.

Bis hierhin sollten Benutzer von PHP/FI 2 keine Veränderung bemerkt haben. PHP fasst den Begriff ´Ausdruck´ aber noch viel weiter, wie es auch andere Programmiersprachen tun. PHP ist in dem Sinne eine ausdrucksoriente Sprache, dass fast alles ein Ausdruck ist. Zurück zu dem Beispiel, mit dem wir uns schon beschäftigt haben: ´$a = 5´. Es ist einfach zu erkennen, dass hier zwei Werte enthalten sind: Der Wert der Integer-Konstanten ´5´ und der Wert von $a, der auf 5 geändert wird. In Wirklichkeit ist aber noch ein zusätzlicher Wert enthalten, nämlich der Wert der Zuweisung selbst. Die Zuweisung selbst enthält den zugewiesenen Wert, in diesem Fall 5. In der Praxis bedeutet dies, dass ´$a = 5´, egal was es tut, immer einen Ausdruck mit dem Wert 5 darstellt. Folglich ist ´$b = ($a = 5)´ gleichbedeutend mit ´$a = 5; $b = 5;´ (ein Semikolon markiert das Ende einer Anweisung). Da Wertzuweisungen von rechts nach links geparst werden, kann man auch ´$b = $a = 5´ schreiben.

Ein anderes gutes Beispiel für die Ausdrucksorientierung von PHP sind Prä- und Post-Inkrement sowie die entsprechenden Dekremente. Benutzer von PHP/FI 2 und vielen anderen Sprachen sind vermutlich mit den Notationen ´variable++´ und ´variable--´ vertraut. Dies sind Inkrement- und Dekrement-Operatoren. IN PHP/FI 2 hat das Statement ´$a++´ keinen Wert (es ist kein Ausdruck) und daher kann man es nicht als Wert zuweisen oder in irgendeiner Weise benutzen. PHP erweitert die Eigenschaften von Dekrement und Inkrement, indem es die beiden ebenfalls zu Ausdrücken macht. In PHP gibt es, wie in C, zwei Arten von Inkrementen - Prä-Inkrement und Post-Inkrement. Grundsätzlich erhöhen sowohl Prä- als auch Post-Inkrement den Wert der Variable, und der Effekt auf die Variable ist derselbe. Der Unterschied ist der Wert des Inkrement-Ausdruckes. Das Prä-Inkrement, das ´++$variable´ geschrieben wird, enthält als Wert den Wert der erhöhten Variabe (PHP erhöht den Wert der Variable, bevor es ihren Wert ausliest, daher der Name ´PRÄ-Inkrement´). Das Post-Inkrement, das ´$variable++´ geschrieben wird, enthält dagegen den ursprünglichen Wert der Variablen vor der Erhöhung (PHP erhöht den Wert der Variablen, nachdem es ihren Wert ausgelesen hat, daher der Name ´POST-Inkrement´).

Ein sehr gebräuchlicher Typ von Ausdrücken sind Vergleichsausdrücke. Diese Ausdrücke geben entweder 0 (=FALSCH) oder 1 (=WAHR) zurück. PHP unterstützt > (größer), >= (größer oder gleich), == (gleich), != (ungleich), < (kleiner), und <= (kleiner oder gleich). Diese Ausdrücke werden meistens in bedingten Anweisungen, wie z. B. in if-Anweisungen, verwendet.

Im letzten Beispiel für Ausdrücke befassen wir uns mit kombinierten Zuweisungs- und Operator-Ausdrücken. Wir haben schon gezeigt, wie man den Wert von $a um 1 erhöht, nämlich indem man einfach ´$a++´ oder ´++$a´ schreibt. Aber was tut man, wenn man den Wert um mehr als eins erhöhen will, z. B. um 3? Man könnte mehrer Male ´$a++´ schreiben, aber das ist offensichtlich weder effizient noch sehr komfortabel. Viel üblicher ist es, einfach ´$a = $a + 3´ zu schreiben. ´$a + 3´ gibt den Wert von $a plus 3 zurück, dieser wird wieder $a zugewiesen, was dazu führt, dass $a nun um 3 erhöht wurde. In PHP - wie in einigen anderen Programmiersprachen, z. B. in C - kann man dies aber noch kürzer schreiben, was mit der Zeit klarer wird und auch einfacher zu verstehen ist. Um 3 zu dem aktuellen Wert hinzuzufügen, schreibt man ´$a += 3´. Das bedeutet exakt: "Nimm´ den Wert von $a, addiere 3 hinzu und weise $a den entstandenen Wert zu". Zusätzlich dazu, dass diese Schreibweise kürzer und klarer ist, resultiert sie auch in einer schnelleren Ausführung. Der Wert von ´$a += 3´ ist, wie der Wert einer regulären Zuweisung, der zugewiesene Wert. Es ist zu beachten, dass dieser Wert NICHT 3, sondern dem kombinierten Wert von $a plus 3 entspricht (Das ist der Wert, der $a zugewiesen wird). Jeder Operator, der zwei Elemente verbindet, kann in dieser Schreibweise verwendet werden, z. B. ´$a -= 5´ (vermindert den Wert von $a um 5) oder ´$a *= 7´ (multipliziert den Wert von $a mit 7 und weist das Ergebnis $a zu), usw.

Es gibt einen weiteren Ausdruck, der Ihnen vielleicht seltsam vorkommt, wenn Sie ihn bisher noch in keiner Programmiersprache kennengelernt haben, den dreifach konditionalen Operator:

$eins ? $zwei : $drei

Wenn der Wert des ersten Sub-Ausdruckes (hier: $eins) wahr ist (d. h. nicht NULL), dann wird der Wert des zweiten Subausdrucks (hier: $zwei) zurückgeben und ist das Ergebnis des konditionalen Ausdrucks. Andernfalls (d. h. wenn der erste Ausdruck falsch ist), wird der Wert des dritten Subausdruckes (hier: $drei) zurückgeben.

Das folgende Beispiel sollte das Verständnis von Prä- und Post-Inkrement und von Ausdrücken im allgemeinen erleichtern:

function verdoppeln($i) {
    return $i*2;
}
$b = $a = 5;        /* Weise den Variablen $a und $b beiden den Wert 5 zu */
$c = $a++;          /* Post-Inkrement, der urspruengliche Wert von $a (also 5)
                       wird $c zugewiesen. */
$e = $d = ++$b;     /* Prae-Inkrement, der erhöhte Wert von $b (= 6) wird $d und
                       $e zugewiesen. */

/* An diesem Punkt sind $d und $e beide gleich 6 */

$f = verdoppeln($d++);  /* Weise $f den doppelten Wert von $d vor 
                       der Erhöhung um eins zu, 2*6 = 12 */
$g = double(++$e);  /* Weise $g den doppelten Wert von $e nach
                       der Erhoehung zu, 2*7 = 14 to $g */
$h = $g += 10;      /* Zuerst wie $g um 10 erhöht und hat schliesslich den Wert
                       24. Der Wert dieser Zuweisung (24) wird dann $h zugewiesen,
                       womit $h ebenfalls den Wert von 24 hat. */

Am Anfang dieses Kapitels hatten wir gesagt, wir würden die verschiedenen Arten von Anweisungen beschreiben und, wie versprochen, Ausdrücke können Anweisungen sein. Trotzdem ist nicht jeder Ausdruck eine Anweisung. In diesem Fall hat eine Anweisung die Form ´Ausdr´ ´;´, d. h. ein Ausdruck gefolgt von einem Semikolon. In ´$b=$a=5;´ ist $a=5 ein gültiger Ausdruck, aber für sich allein keine Anweisung. ´$b=$a=5;´ ist jedoch eine gültige Anweisung.

Ein letzter Punkt, der noch zu erwähnen ist, ist der ´wahr´-Wert von Ausdrücken. In vielen Fällen, hauptsächlich in bedingten Anweisungen und Schleifen, ist man nicht am spezifischen Wert eines Ausdrucks interessiert, sondern kümmert sich nur darum, ob er WAHR oder FALSCH bedeutet (PHP hat keinen speziellen boolean-Datentyp). Der Wahrheitswert eines Ausdrucks in in PHP wird ähnlich bestimmt wie in Perl. Jeder numerische Wert, der nicht NULL ist, bedeutet WAHR, NULL bedeutet FALSCH. Es ist zu beachten, dass negative Werte nicht NULL sind und deshalb als WAHR aufgefasst werden! Eine leere Zeichenkette und die Zeichenkette "0" sind FALSCH; alle anderen Zeichenketten sind WAHR. Nicht-skalare Datentypen (Arrays und Objekte) werden als FALSCH betrachtet, wenn sie keine Elemente enthalten, anderfalls geben sie WAHR zurück.

PHP stellt eine vollständige und mächtige Implementat von Ausdrücken bereit und, deren vollständige Dokumentation den Rahmen dieses Manuals sprengen würde. Die obigen Beispiele sollten Ihnen einen guten Eindruck darüber verschaffen, was Ausdrücke sind und wie man nützliche Ausdrücke konstruieren kann. Im Rest dieses Manuals werden wir ausdr schreiben, um ausdrücken, dass an dieser Stelle jeder gültige PHP-Ausdruck stehen kann.


Kapitel 11. Operatoren


Operator-Rangfolge

Die Operator-Rangfolge legt fest, wie "eng" ein Operator zwei Ausdrücke miteinander verbindet. Zum Beispiel ist das Ergebnis des Ausdruckes 1 + 5 * 3 16 und nicht 18, da der Mulitiplikations-Operator ("*") in der Rangfolge höher steht als der Additions-Operator ("+"). Wenn nötig, können Sie Klammern setzen, um die Rangfolge der Operatoren zu beeinflussen. Zum Beispiel: (1 + 5) * 3 ergibt 18.

Die folgende Tabelle zeigt die Rangfolge der Operatoren, oben steht der Operator mit dem niedrigsten Rang.

Tabelle 11-1. Operator-Rangfolge

AssociativityOperator
links,
linksor
linksxor
linksand
rechtsprint
links= += -= *= /= .= %= &= |= ^= ~= <<= >>=
links? :
links||
links&&
links|
links^
links&
keine Richtung== != ===
keine Richtung< <= > >=
links<< >>
links+ - .
links* / %
rechts! ~ ++ -- (int) (float) (string) (array) (object) @
rechts[
keine Richtungnew

Anmerkung: Obwohl ! einen höheren Rang gegenüber = hat, erlaubt es Ihnen PHP immer noch ähnliche Ausdrücke wie den folgenden zu schreiben: if (!$a =foo()).In diesem Ausdruck wird die Ausgabe von foo() der Variablen $a zugewiesen.


Arithmetische Operatoren

Erinnern Sie sich noch an die Grundrechenarten aus der Schule? Die arithmetischen Operatoren funktionieren genauso:

Tabelle 11-2. Arithmetische Operatoren

BeispielNameErgebnis
$a + $bAdditionSumme von $a und $b.
$a - $bSubtraktionDifferenz von $a und $b.
$a * $bMultiplikationProdukt von $a und $b.
$a / $bDivisionQuotient von $a und $b.
$a % $bModulusRest von $a geteilt durch $b.

Der Divisions-Operator ("/") gibt immer eine Fließkommazahl zurück, sogar wenn die zwei Operanden Ganzzahlen sind (oder Zeichenketten, die nach Ganzzahlen umgewandelt wurden).


Zuweisungsoperatoren

Der einfachste Zuweisungsoperator ist "=". Wahrscheinlich kommt man als erstes auf die Idee, ihn mit "ist gleich" zu bezeichnen. Das ist falsch. In Wirklichkeit bedeutet er, dass dem linken Operanden der Wert des Ausdrucks auf der rechten Seite zugewiesen wird (man müsste ihn also mit "wird gesetzt auf den Wert von" übersetzen).

Der Wert eines Zuweisungs-Ausdruckes ist der zugewiesene Wert. D.h. der Wert des Ausdruckes "$a = 3" ist 3. Das erlaubt es, einige raffinierte Dinge anzustellen:

$a = ($b = 4) + 5 // $a ist nun gleich 9 und $b wurde auf den Wert 4 gesetzt.

Zusätzlich zu dem oben vorgestellten Zuweisungsoperator "=" gibt es "kombinierte Operatoren" für alle binären, arithmetischen und String-Operatoren, die es erlauben, den Wert einer Variablen in einem Ausdruck zu benutzen, und dieser anschließend das Ergebnis des Ausdrucks als neuen Wert zuzuweisen. Zum Beispiel:

$a = 3;
$a += 5; // setzt $a auf den Wert 8, als ob wir geschrieben haetten: $a = $a + 5;
$b = "Hallo ";
$b .= "Du!"; // setzt $b auf den Wert "Hallo Du!", aequivalent zu $b = $b . 
"Du!";

Man beachte, dass die Zuweisung nur den Wert der Ursprungsvarialbe der neuen Variable zuweist (Zuweisung als Wert, sie "kopiert"), weshalb sich Änderungen an der einen Variablen nicht auf die andere auswirken werden. Das kann wichtig sein,wenn man einen großen Array o. ä. in einer Schleife kopieren muss. PHP 4 unterstützt 'assignement by reference' (Zuweisung als Verweis), mit Hilfe der Schreibweise $var = &$othervar;, das funktioniert jedoch nicht in PHP 3. 'Assignement by reference' bedeutet, dass beide Variablen nach der Zuweisung die selben Daten repräsentieren und nichts kopiert wird. Um mehr über Referenzen zu lernen, lesen Sie bitte den Abschnitt Referenzen erklärt.


Bit-Operatoren

Bit-Operatoren erlauben es, in einem Integer bestimmte Bits "ein- oder auszuschalten" (auf 0 oder 1 zu setzen). Wenn beide, der links- und rechsseitge Parameter, Zeichenketten sind, arbeiten die Bit-Operatoren mit den einzelnen Zeichen.

<?php
    echo 12 ^ 9; // Ausgabe '5'

    echo "12" ^ "9"; // Ausgabe:das Backspace-Zeichen (ascii 8)
                     // ('1' (ascii 49)) ^ ('9' (ascii 57)) = #8

    echo "hallo" ^ "hello"; // Gibt die ASCII-Werte #0 #4 #0 #0 #0
                            // 'a' ^ 'e' = #4 aus
?>

Tabelle 11-3. Bit-Operatoren

BeispielNameErgebnis
$a & $bUndBits, die in $a und $b gesetzt sind werden gesetzt.
$a | $bOderBits, die in $a oder $b gesetzt sind werden gesetzt.
$a ^ $bEntweder oder (Xor)Bits, die entweder in $a oder $b gesetzt sind, werden gesetzt aber nicht in beiden.
~ $aNichtDie Bits, die in $a nicht gesetzt sind, werden gesetzt und umgekehrt.
$a << $bNach links verschiebenVerschiebung der Bits von $a um $b Stellen nach links (jede Stelle entspricht einer Mulitplikation mit zwei).
$a >> $bNach rechts verschiebenVerschiebt die Bits von $a um $b Stellen nach rechts (jede Stelle entspricht einer Division durch zwei).

Vergleichs-Operatoren

Vergleichs-Operatoren erlauben es - wie der Name schon sagt - zwei Werte zu vergleichen.

Tabelle 11-4. Vergleichsoperatoren

BeispielNameErgebnis
$a == $bGleichGibt TRUE zurück, wenn $a gleich $b ist.
$a === $bIdentischGibt TRUE zurück wenn $a gleich $b ist und beide vom gleichen Typ sind(nur PHP 4).
$a != $bUngleichGibt TRUE zurück, wenn $a nicht gleich $b ist.
$a <> $bUngleichGibt TRUE zurück, wenn $a nicht gleich $b ist.
$a !== $bNicht identisch Gibt TRUE zurück, wenn $a nicht gleich $b ist, oder wenn beide nicht vom gleichen Typ sind (nur PHP 4).
$a < $bKleiner AlsGibt TRUE zurück, wenn $a kleiner als $b ist.
$a > $bGrößer AlsGibt TRUE zurück, wenn $a größer als $b ist.
$a <= $bKleiner Gleich Gibt TRUE zurück, wenn $a kleiner oder gleich $b ist.
$a >= $bGrößer GleichGibt TRUE zurück, wenn $a größer oder gleich $b ist.

Ein weiter Vergleichs-Operator ist der "?:"- oder Trinitäts-Operator. Er arbeitet genauso wie in C und vielen anderen Programmier-Sprachen.

(ausdr1) ? (ausdr2) : (ausdr3);

Dieser Ausdruck gibt ausdr2 zurück, wenn ausdr1 TRUE zurückgibt und ausdr3, wenn ausdr1 FALSE zurückgibt.


Fehler-Kontroll-Operatoren

PHP unterstützt einen Operator zur Fehlerkontrolle: Das @-Symbol. Stellt man das @ in PHP vor einen Ausdruck werden alle Fehlermeldungen, die von diesem Ausdruck erzeugt werden könnten, ignoriert.

Ist das track_errors-Feature aktiviert, werden alle Fehlermeldungen, die von diesem Ausdruck erzeugt werden, in der Variablen $php_errormsg gespeichert. Da diese Variable mit jedem neuen Auftreten eines Fehlers überschrieben wird, sollte man sie möglichst bald nach Verwendung des Ausdrucks überprüfen, wenn man mit ihr arbeiten will.

<?php
/* Beabsichtigter Dateifehler */
$my_file = @file ('nicht_vorhandene_Datei') or
    die ("Datei konnte nicht geöffnetwerden: Fehler war:'$php_errormsg'");

// Das funktioniert bei jedem Ausdruck, nicht nur bei Funktionen:
$value = @$cache[$key]; 
// erzeugt keine Notice, falls der Index $key nicht vorhanden ist.

?>

Anmerkung: Der @-Operator funktioniert nur bei Ausdrücken. Eine einfache Daumenregel: wenn Sie den Wert von etwas bestimmen können, dann können Sie den @-Operator davor schreiben. Zum Beispiel können Sie ihn vor Variablen, Funktionsaufrufe und vor include() setzen, vor Konstanten und so weiter. Nicht verwenden können Sie diesen Operator vor Funktions- oder Klassendefinitionen oder vor Kontrollstrukturen wie zum Beispiel if und foreach und so weiter.

Siehe auch error_reporting().

Anmerkung: Der @ Fehler-Kontroll-Operator verhindert jedoch keine Meldungen, welche aus Fehlern beim Parsen resultieren.

Warnung

Zum gegenwärtigen Zeitpunkt deaktiviert der "@" Fehler-Kontrolloperator die Fehlermeldungen selbst bei kritischen Fehlern, die die Ausführung eines Skripts beenden. Unter anderem bedeutet das, wenn Sie "@" einer bestimmten Funktion voranstellen, diese aber nicht zur Verfügung steht oder falsch geschrieben wurde, Ihr PHP-Skript einfach beendet wird, ohne Hinweis auf die Ursache.


Operatoren zur Programmausführung

PHP unterstützt einen Operator zur Ausführung externer Programme: Die sog. Backticks (``). Achtung: Die Backticks sind keine einfachen Anführungszeichen! PHP versucht, den Text zwischen den Backticks als Kommandozeilen-Befehl auszuführen. Die Ausgabe des aufgerufenen Programms wird zurückgegeben (d.h. wird nicht einfach ausgegeben, sondern kann einer Variablen zugewiesen werden).

$output = `ls -al`;
echo "<pre>$output</pre>";

Anmerkung: Der Backtick-Operator steht nicht zur Verfügung, wenn der Safe Mode aktiviert ist oder die Funktion shell_exec() deaktiviert wurde.

Siehe auch escapeshellcmd(), exec(), passthru(), popen(), shell_exec() und system().


Inkrement- bzw. Dekrementoperatoren

PHP unterstützt Prä- und Post-Inkrement- und Dekrementoperatoren im Stil der Programmiersprache C.

Tabelle 11-5. Inkrement- und Dekrementoperatoren

BeispielNameAuswirkung
++$aPrä-InkrementErhöht den Wert von $a um eins (inkrementiert $a) und gibt anschließend den neuen Wert von $a zurück.
$a++Post-InkrementGibt zuerst den aktuellen Wert von $a zurück und erhöht dann den Wert von $a um eins.
--$aPrä-DekrementVermindert den Wert von $a um eins (dekrementiert $a) und gibt anschließend den neuen Wert von $a zurück.
$a--Post-DekrementGibt zuerst den aktuellen Wert von $a zurück und erniedrigt dann den Wert von $a um eins.

Ein einfaches Beispiel-Skript:

<?php
echo "<h3>Post-Inkrement</h3>";
$a = 5;
echo "Sollte 5 sein: " . $a++ . "<br />\n";
echo "Sollte 6 sein: " . $a . "<br />\n";

echo "<h3>Pre-Inkrement</h3>";
$a = 5;
echo "Sollte 6 sein: " . ++$a . "<br />\n";
echo "Sollte 6 sein: " . $a . "<br />\n";

echo "<h3>Post-Dekrement</h3>";
$a = 5;
echo "Sollte 5 sein: " . $a-- . "<br />\n";
echo "Sollte 4 sein: " . $a . "<br />\n";

echo "<h3>Pre-Dekrement</h3>";
$a = 5;
echo "Sollte 4 sein: " . --$a . "<br />\n";
echo "Sollte 4 sein: " . $a . "<br />\n";
?>


Logische Operatoren

Tabelle 11-6. Logische Operatoren

BeispielNameErgebnis
$a and $bUndTRUE wenn sowohl $a als auch $b TRUE ist.
$a or $bOderTRUE wenn $a oder $b TRUE ist.
$a xor $bEntweder Oder TRUE wenn entweder $a oder $b TRUE ist, aber nicht beide.
! $aNichtTRUE wenn $a nicht TRUE ist.
$a && $bUndTRUE wenn sowohl $a als auch $b TRUE ist.
$a || $bOderTRUE wenn $a oder $b TRUE ist.

Der Grund dafür, dass es je zwei unterschiedliche Operatoren für die "Und"- und die "Oder"-Verknüpfung gibt ist der, dass die beiden Operatoren jeweils Rangfolgen haben. (siehe auch Operator-Rangfolge.)


Zeichenketten-Operatoren

Es gibt in PHP zwei Operatoren für Zeichenketten. Der erste ist der Vereinigungs-Operator ('.'), dessen Rückgabewert eine zusammengesetzte Zeichenkette aus dem rechten und dem linken Argument ist. Der zweite ist der Vereinigungs-Zuweisungsoperator ('.='), der das Argument auf der rechten Seite an das Argument der linken Seite anhängt. Siehe Zuweisungs-Operatoren für weitere Informationen.

$a = "Hallo ";
$b = $a . "Welt!"; // $b enthält jetzt den Text "Hallo Welt!"

$a = "Hallo ";
$a .= "Welt!";    // $a enthält jetzt den Text "Hallo Welt!"


Array Operatoren

Der einzige Array Operator in PHP ist der + Operator. Das rechsstehende Array wird an das linksstehende Array angehängt, wobei doppelte Schlüssel NICHT überschrieben werden.

$a = array("a" => "Apfel", "b" => "Banane");
$b = array("a" =>"pear", "b" => "Erdbeere", "c" => "Kirsche");

$c = $a + $b;

var_dump($c);
array(3) {
  ["a"]=>
  string(5) "Apfel"
  ["b"]=>
  string(6) "Banane"
  ["c"]=>
  string(7) "Kirsche"
}


Kapitel 12. Kontroll-Strukturen

Jedes PHP-Skript besteht aus einer Reihe von Anweisungen. Eine Anweisung kann aus einem Funktionsaufruf, einer Schleife, einer bedingten Anweisung oder einem Befehl, der nichts macht (eine leere Anweisung), bestehen. Jede Anweisung endet gewöhnlich mit einem Semikolon. Darüber hinaus können Anweisungen zu einer Anweisungsgruppe zusammengefasst werden, welche durch geschweifte Klammern begrenzt wird. Eine Anweisungsgruppe ist auch eine Anweisung. Die unterschiedlichen Arten von Anweisungen werden in diesem Abschnitt erläutert.


if

Das if-Konstrukt ist eine der wichtigsten Möglichkeiten vieler Programmier-Sprachen, PHP eingeschlossen. Es erlaubt die bedingte Ausführung von Programmteilen. PHP kennt eine if-Struktur, die ähnlich der Programmiersprache C ist:

if (ausdr)
    Anweisung

Wie im Abschnitt über Ausdrücke beschrieben, wird ausdr auf seinen boolschen Wertinhalt ausgewertet. Wenn ausdr als TRUE ausgewertet wird, führt PHP die Anweisung aus, falls die Auswertung FALSE ergibt, wird sie übergangen. Mehr Informationen welche Werte als FALSE ausgewertet werden finden Sie im Abschnitt 'Umwandlung nach boolean'.

Das folgende Beispiel wird a ist größer als b anzeigen, wenn $a größer als $b ist:

if ($a > $b)
    print "a ist größer als b";

Oft werden Sie die bedingte Ausführung von mehr als einer Anweisung wollen. Selbstverständlich ist es nicht erforderlich, jede Anweisung mit einer if-Bedingung zu versehen. Statt dessen können Sie mehrere Anweisungen in Gruppen zusammenfassen. Z.B. wird der folgende Programm-Code a ist größer als b anzeigen, wenn $a größer als $b ist. Danach wird der Wert von $a in $b gespeichert:

if ($a > $b) {
    print "a ist größer als b";
    $b = $a;
}

If-Anweisungen können beliebig oft innerhalb anderer if-Anweisungen definiert werden. Das ermöglicht ihnen völlige Flexibilität bei der bedingten Ausführung verschiedenster Programmteile.


else

Häufig ist es erforderlich, eine Anweisung auszuführen, wenn eine bestimmte Bedingung erfüllt ist und eine andere Anweisung, falls sie nicht erfüllt ist. Dafür gibt es else. Else erweitert eine if-Anweisung um die Ausführung von Anweisungen, sobald der Ausdruck der if-Anweisung als FALSE ausgewertet wird. Der folgende Code wird z.B. a ist größer als b anzeigen, wenn $a größer ist als $b, anderenfalls a ist NICHT größer als b:

if ($a > $b) {
    print "a ist größer als b";
} else {
    print "a ist NICHT größer als b";
}

Die else-Anweisung wird nur ausgeführt, wenn der if-Ausdruck als FALSE ausgewertet wurde und wenn bei vorhandenen elseif-Ausdrücken diese ebenfalls FALSE sind (siehe elseif).


elseif

Elseif ist, wie der Name schon sagt, eine Verbindung von if und else. Wie else erweitert sie eine if-Anweisung um die Ausführung anderer Anweisungen, sobald die normale if-Bedingung als FALSE angesehen wird. Anders als bei else wird die Ausführung dieser alternativen Anweisungen nur durchgeführt, wenn die bei elseif angegebene alternative Bedingung als TRUE angesehen wird. Der folgende Code wird z.B. a ist größer als b, a ist gleich b oder a ist kleiner als b ausgeben:

if ($a > $b) {
    print "a ist größer als b";
} elseif ($a == $b) {
    print "a ist gleich b";
} else {
    print "a ist kleiner als b";
}

Es kann mehrere elseif-Anweisungen innerhalb einer if-Anweisung geben. Die erste elseif-Bedingung (falls vorhanden), die TRUE ist, wird ausgeführt. In PHP kann man auch 'else if' schreiben (zwei Wörter). Das Verhalten ist identisch zu 'elseif' (ein Wort). Die Bedeutung der Syntax ist leicht unterschiedlich (falls Sie mit C vertraut sind, das ist das gleiche Verhalten) aber der Grundtenor ist der, dass beide Schreibweisen, bezogen auf das Ergebnis, sich exakt gleich verhalten.

Die elseif-Anweisung wird nur ausgeführt, wenn die vorausgehende if-Bedingung sowie jede vorherige elseif-Bedingung FALSE ist und die aktuelle elseif-Bedingung TRUE ist.


Alternative Syntax für Kontroll-Strukturen

PHP bietet eine alternative Syntax für einige seiner Kontroll-Strukturen, als da sind if, while, for, foreach und switch. Immer muss die öffnende Klammer durch einen Doppelpunkt ":" und die schließende Klammer durch ein endif;, endwhile;, endfor;, endforeach; oder endswitch; ersetzt werden.

<?php if ($a == 5): ?>
    A ist gleich 5
<?php endif; ?>

Im obigen Beispiel ist der HTML-Bereich "A ist gleich 5" in eine if-Anweisung mit alternativer Syntax eingebettet. Der HTML-Bereich wird nur ausgegeben, wenn $a gleich 5 ist.

Die alternative Syntax kann auch auf else und elseif angewendet werden. Es folgt eine if-Struktur mit elseif und else im alternativen Format:

if ($a == 5):
    print "a ist gleich 5";
    print "...";
elseif ($a == 6):
    print "a ist gleich 6";
    print "!!!";
else:
    print "a ist weder 5 noch 6";
endif;

Siehe auch while, for und if für weitere Beispiele.


while

While-Schleifen sind die einfachste Form von Schleifen in PHP. Sie funktionieren genau wie in C. Die Grundform einer while-Anweisung lautet:

while (ausdr) Anweisung

Die Bedeutung einer while-Anweisung ist einfach. Sie weist PHP an, einen in ihr eingebetteten Befehl so lange zu wiederholen, wie die while-Bedingung als TRUE ausgewertet wird. Der Wert der Bedingung wird immer am Anfang der Schleife geprüft. Wird der Wert während der Ausführung der Anweisungen innerhalb der while-Schleife verändert, endet die Ausführung dieses Anweisungsblocks erst mit dem Ende der Iteration (Jeder Schleifendurchlauf ist eine Iteration). Falls die while-Bedingung bereits zu Beginn FALSE ist, werden die Anweisungen der while-Schleife nicht ein einziges Mal durchlaufen.

Wie bei der if-Anweisung kann man mehrere Anweisungen innerhalb der gleichen while-Schleife angeben, indem man sie mit geschweiften Klammern umschließt oder die alternative Syntax gebraucht:

while (ausdr): Anweisung ... endwhile;

Die folgenden Beispiele sind identisch; beide geben Zahlen von 1 bis 10 aus:

/* Beispiel 1 */

$i = 1;
while ($i <= 10) {
    print $i++;  /* es wird erst $i ausgegeben,
                    bevor der Wert erhöht wird
                    (Post-Inkrement) */
}
 
/* Beispiel 2 */
 
$i = 1;
while ($i <= 10):
    print $i;
    $i++;
endwhile;


do..while

Do..while-Schleifen sind den while -Schleifen sehr ähnlich, außer dass der Wahrheitsgehalt des Ausdrucks erst am Ende jedes Durchlaufs geprüft wird, statt am Anfang. Der Hauptunterschied zu gewöhnlichen while-Schleifen ist der, dass die Schleife bei do..while in jeden Fall einmal durchlaufen wird (die Bedingung wird erst am Ende einer Iteration geprüft), wogegen es bei while-Schleifen durchaus passieren kann, dass die Schleife nie durchlaufen wird (die Bedingung wird immer am Anfang eines Durchlaufs überprüft. Wird diese Bedingung von Anfang an als FALSE ausgewertet endet die Ausführung der Schleife sofort).

Es gibt nur eine Syntax für do..while-Schleifen:

$i = 0;
do {
    print $i;
} while ($i>0);

Die obige Schleife wird genau einmal durchlaufen, da nach der ersten Wiederholung die Erfüllung der Bedingung geprüft wird. Da diese aber nicht erfüllt, also FALSE ist ($i ist nicht größer als 0), wird die Schleifenausführung beendet.

Erfahrene C-Anwender kennen auch die Möglichkeit, Programm-Blöcke mit do..while(0) einzuschliessen und dann die break Anweisung zu benutzen. Der folgende Programm-Ausschnitt zeigt dies:

do {
    if ($i < 5) {
        print "i ist nicht groß genug";
        break;
    }
    $i *= $factor;
    if ($i < $minimum_limit) {
        break;
    }
    print "i ist ok";

    ...bearbeite i...

} while(0);

Es ist nicht weiter tragisch, wenn Sie dieses Beispiel nicht oder nur zum Teil verstehen. Sie können auch ohne dieses 'Feature' effektive PHP-Programme und Skripte schreiben.


for

For-Schleifen sind die komplexesten Schleifen in PHP. Sie funktionieren wie ihr Gegenstück in C. Die Syntax einer for-Schleife sieht so aus:

for (ausdr1; ausdr2; ausdr3) Anweisung

Der erste Ausdruck (ausdr1) wird beim Schleifenbeginn (ohne jegliche Vorbedingung) geprüft bzw. ausgeführt.

Zu Beginn jedes Durchlaufs wird nun ausdr2 geprüft. Wenn dieser TRUE ist, fährt die Schleife fort mit der Ausführung der nachfolgenden Anweisung. Ist das Ergebnis FALSE, wird die Schleife beendet.

Am Ende jedes Durchlaufs wird ausdr3 geprüft (ausgeführt).

Jeder Ausdruck kann leer sein. Ist ausdr2 leer, wird die Schleife endlos oft durchlaufen (PHP wertet diesen, wie in C, implizit als TRUE). Das ist nicht so sinnlos, wie Sie vielleicht glauben, weil man häufig eine Schleife erst durch eine bedingte break -Anweisung statt durch eine unwahr werdende for-Bedingung beenden möchte.

Beachten Sie die folgenden Beispiele. Alle geben Zahlen von 1 bis 10 aus:

/* Beispiel 1 */
 
for ($i = 1; $i <= 10; $i++) {
    print $i;
}
 
/* Beispiel 2 */
 
for ($i = 1;;$i++) {
    if ($i > 10) {
        break;
    }
    print $i;
}
 
/* Beispiel 3 */
 
$i = 1;
for (;;) {
    if ($i > 10) {
        break;
    }
    print $i;
    $i++;
}

/* Beispiel 4 */
 
for ($i = 1; $i <= 10; print $i, $i++) ;

Selbstverständlich sieht das erste (oder vielleicht das vierte) Beispiel am besten aus, aber Sie werden noch feststellen, dass es oftmals ganz nützlich sein kann, leere Parameter in for-Schleifen zu verwenden.

PHP unterstützt auch bei for-Schleifen die alternative "Doppelpunkt-Syntax".

for (ausdr1; ausdr2; ausdr3): Anweisung; ...; endfor;

Andere Sprachen haben für das Durchlaufen eines Hash´s oder Arrays eine foreach-Anweisung. PHP 3 hat dies nicht; im Gegensatz zu PHP 4 (vgl. foreach). In PHP 3 kann man dafür eine Kombination von while mit der list()- und each()-Funktion einsetzen. Beispiele finden Sie in der Dokumentation zu diesen Funktionen.


foreach

PHP 4 (nicht PHP 3) enthält ein foreach Konstrukt, genau wie Perl und einige andere Sprachen. Diese ermöglicht es, auf einfache Weise ein Array zu durchlaufen. foreach funktioniert nur in Verbindung mit Arrays. Wenn Sie versuchen foreach mit einer Variable eines anderen Datentyps oder einer nicht initialisierten Variable zu benutzen, gibt PHP einen Fehler aus. Es gibt zwei Syntax-Formen; die zweite ist eine unbedeutende, aber sinnvolle Erweiterung der ersten Syntax:

foreach(array_expression as $value) Anweisung
foreach(array_expression as $key => $value) Anweisung

Die erste Form durchläuft das array_expression-Array. Bei jedem Durchgang wird der Wert des aktuellen Elements $value zugewiesen und der interne Array-Zeiger um eins erhöht. Dadurch wird beim nächsten Durchgang automatisch das nächste Element ausgewertet.

Die zweite Form arbeitet genauso, außer dass bei jedem Durchlauf auch der aktuelle Schlüssel der Variablen $key zugewiesen wird.

Anmerkung: Sobald foreach zum ersten Mal ausgeführt wird, wird der interne Array-Pointer automatisch auf das erste Element des Arrays zurück gesetzt. Das bedeutet, dass Sie vor einem Durchlauf von foreach reset() nicht aufrufen müssen.

Anmerkung: Beachten Sie auch, dass foreach mit einer Kopie des angegebenen Arrays arbeitet, nicht mit dem Array selbst. Deshalb wird auch der Array-Pointer nicht wie bei dem each()-Konstrukt verändert und Veränderungen an ausgegebenen Arrayelementen haben keine Auswirkung auf das originale Array. Trotzdem wird der interne Arrayzeiger des originalen Arrays bei der Verarbeitung bewegt. Angenommen, die foreach-Schleife ist komplett abgearbeitet, wird der interne Arrayzeiger (des originalen Arrays) auf das letzte Element zeigen.

Anmerkung: Fehlermeldungen durch den Gebrauch von '@' zu unterdrücken ist bei foreach nicht möglich.

Beachten Sie, dass die folgenden Beispiele in ihrer Funktionalität identisch sind:

reset ($arr);
while (list(, $value) = each ($arr)) {
    echo "Wert: $value<br>\n";
}

foreach ($arr as $value) {
    echo "Wert: $value<br>\n";
}

Auch hier funktioniert alles gleich:

reset ($arr);
while (list($key, $value) = each ($arr)) {
    echo "Schlüssel: $key; Wert: $value<br>\n";
}

foreach ($arr as $key => $value) {
    echo "Schlüssel: $key; Wert: $value<br>\n";
}

Noch einige Beispiele, die die Anwendung verdeutlichen:

/* foreach Beispiel 1: Nur der Wert */

$a = array (1, 2, 3, 17);

foreach ($a as $v) {
    print "Aktueller Wert von \$a: $v.\n";
}

/* foreach Beispiel 2:
Wert (mit Ausgabe des Array-Schlüssels zur Veranschaulichung) */

$a = array (1, 2, 3, 17);

$i = 0; /* nur zu Veranschaulichung */

foreach($a as $v) {
    print "\$a[$i] => $v.\n";
    $i++;
}

/* foreach Beispiel 3: Schlüssel und Wert */

$a = array (
    "eins" => 1,
    "zwei" => 2,
    "drei" => 3,
    "siebzehn" => 17
);

foreach($a as $k => $v) {
    print "\$a[$k] => $v.\n";
}

/* foreach Beispiel 4: multidimensionale Arrays */

$a[0][0] = "a";
$a[0][1] = "b";
$a[1][0] = "y";
$a[1][1] = "z";

foreach($a as $v1) {
    foreach ($v1 as $v2) {
        print "$v2\n";
    }
}

/* foreach Beispiel 5: dynamische Arrays */

foreach(array(1, 2, 3, 4, 5) as $v) {
    print "$v\n";
}


break

Break bricht die Ausführung der aktuellen for, foreach while, do..while or switch Anweisungs-Sequenz ab.

Einem break kann optional ein nummerisches Argument angehängt werden, das die Anzahl der abzubrechenden Befehls-Sequenzen enthält.

$arr = array ('eins', 'zwei', 'drei', 'vier', 'stop', 'fünf');
while (list ( , $val) = each ($arr)) {
    if ($val == 'stop') {
        break;  /* Man kann hier auch 'break 1;' schreiben. */
    }
    echo "$val<br>\n";

/* Benutzung des optionalen Argumentes. */
$i = 0;
    while (++$i) {
        switch ($i) {
            case 5:
                echo "Bei 5<br>\n";
                break 1;  /* Beendet nur switch. */
            case 10:
                echo "Bei 10; quitting<br>\n";
                break 2;  /* Beendet switch und while. */
            default:
                break;
    }
}


continue

Continue wird innerhalb von Schleifen gebraucht. Die Schleife wird an der aktuellen Stelle abgebrochen und es wird der nächste Durchlauf begonnen.

Continue kann optional ein nummerisches Argument erhalten, das angibt, wie viele Ebenen von enhaltenen Schleifen übersprungen werden sollen.

while (list ($key, $value) = each ($arr)) {
    if ($key % 2) { // überspringe ungerade Werte
        continue;
    }
    tue_was_mit_ungerade ($value);
}

$i = 0;
while ($i++ < 5) {
    echo "Außn<br>\n";
    while (1) {
        echo "&nbsp;&nbsp;Mitte<br>\n";
        while (1) {
            echo "&nbsp;&nbsp;Innen<br>\n";
            continue 3;
        }
        echo "Das wird nie ausgegeben.<br>\n";
    }
    echo "Dies auch nicht.<br>\n";
}


switch

Die switch-Anweisung ist gleichbedeutend einer Reihe von if-Anweisungen mit dem gleichen Parameter. Häufig wollen Sie ein und dieselbe Variable (bzw. den selben Ausdruck) mit verschiedensten Werten vergleichen und in Abhängigkeit vom Auswertungsergebnis verschiedene Programmteile ausführen. Genau das ermöglicht die switch-Anweisung.

Die folgenden zwei Beispiele zeigen zwei verschiedene Wege, das Gleiche zu bewirken; eines gebraucht mehrere if-Anweisungen, das andere eine switch-Anweisung:

if ($i == 0) {
    print "i ist gleich 0";
}
if ($i == 1) {
    print "i ist gleich 1";
}
if ($i == 2) {
    print "i ist gleich 2";
}
 
switch ($i) {
    case 0:
        print "i ist gleich 0";
        break;
    case 1:
        print "i ist gleich 1";
        break;
    case 2:
        print "i ist gleich 2";
        break;
}

Es ist wichtig, die Ausführung einer switch-Anweisung zu verstehen, um Fehler zu vermeiden. Die switch-Anweisung wird Zeile für Zeile (also Anweisung für Anweisung) abgearbeitet. Zu Beginn wird nichts ausgeführt. Erst wenn bei einem case-Teil eine Entsprechung zum switch-Ausdruck vorliegt, werden die darin enthaltenen Anweisungen von PHP ausgeführt. PHP fährt dann mit der Abarbeitung des restlichen Codes innerhalb des switch-Blocks fort oder bis zum ersten Auftreten einer break-Anweisung. Ohne break am Ende eines case-Teils werden also noch die folgenden case-Blöcke ausgeführt. Zum Beispiel:

switch ($i) {
    case 0:
        print "i ist gleich 0";
    case 1:
        print "i ist gleich 1";
    case 2:
        print "i ist gleich 2";
}

Wenn hier $i gleich 0 ist, würde PHP alle print-Anweisungen ausführen! Ist $i gleich 1, werden die letzten beiden print-Befehle ausgeführt und wenn $i = 2 ist, wird nur der letzte print-Befehl ausgeführt. Deshalb ist es wichtig break-Anweisungen zu setzen (abgesehen von bestimmten Fällen, in denen Sie diese mit Absicht weglassen).

Bei einer switch-Anweisung wird die Bedingung also nur einmal überprüft und das Ergebnis mit jeder case-Anweisung verglichen. Bei einem elseif-Befehl wird die Bedingung neu geprüft. Ist ihre Bedingung komplizierter als ein einfacher Vergleich und/oder in einer umfangreichen Schleife eingebettet, kann eine switch-Anweisung schneller als mehrere if-Befehle sein.

Der Anweisungsteil von case kann auch leer sein. Dann wird die Kontrolle einfach an den nächsten case-Teil übergeben.

switch ($i) {
    case 0:
    case 1:
    case 2:
        print "i ist kleiner als 3 aber nicht negativ";
        break;
    case 3:
        print "i ist gleich 3";
}

Ein Spezialfall ist default. Dieser Fall trifft auf alles zu, was nicht von den voranstehenden case-Ausdrücken erfasst wurde und sollte als letzte case Anweisung angegeben werden. Zum Beispiel:

switch ($i) {
    case 0:
        print "i ist gleich 0";
        break;
    case 1:
        print "i ist gleich 1";
        break;
    case 2:
        print "i ist gleich 2";
        break;
    default:
        print "i ist weder 0, 1 noch 2";
}

Der case-Ausdruck kann eine Prüfung einfacher Typen sein, also von Integer- oder Fließkomma-Zahlen oder von Strings/Zeichenketten. Arrays oder Objekte können nicht benutzt werden, es sei denn, sie wurden in einfache Typen umgewandelt.

Die alternative Syntax der Kontrollstrukturen gilt auch für switch-Sequenzen. Mehr Informationen dazu erhalten Sie unter Alternative Syntax für Kontroll-Strukturen.

switch ($i):
    case 0:
        print "i ist gleich 0";
        break;
    case 1:
        print "i ist gleich 1";
        break;
    case 2:
        print "i ist gleich 2";
        break;
    default:
        print "i ist weder 0, 1 noch 2";
endswitch;


declare

Das Sprachkonstrukt declare wird dazu verwendet, um Ausführungsdirektiven für einen Codeblock anzugeben. Die Schreibweise von declare ist der anderer Kontrollstrukturen ähnlich:

declare (Direktive) Anweisung

Die Directive gibt Ihnen die Möglichkeit, das Verhalten des declare-Blocks zu bestimmen. Zur Zeit wird nur eine Direktive erkannt: die ticks (Weiter unten finden Sie mehr Informationen zu den ticks).

Der Anweisungsteil des declare-Blocks wird ausgeführt - wie genau diese Ausführung passiert und welche Nebeneffekte während der Ausführung auftreten, hängt von der Direktive ab, die Sie im directive-Block angegeben haben.


Ticks

Ein tick ist ein Ereigniss, das bei jedem N-ten Autreten der low-level Anweisungen innerhalb des declare Blocks, die vom Parser ausgeführt werden, auftritt. Der Wert von N wird durch die Angabe von ticks=N innerhalb des declare-Blocks in dem directive Abschnitt bestimmt.

Das Ereignis/die Ereignisse, die bei jedem tick eintreten, legen Sie mit der Funktion register_tick_function() fest. Weitere Einzelheiten können Sie dem Beispiel unten entnehmen. Beachten Sie, dass mehr als ein Ereigniss für jeden tick eintreten kann.

Beispiel 12-1. Profil eines Bereichs von PHP Code

<?php
// Funktion, die bei Aufruf die Zeit aufzeichnet
function profile ($dump = FALSE)
{
    static $profile;

    // Rückgabe der gespeicherten Zeit aus profile, danach löschen
    if ($dump) {
        $temp = $profile;
        unset ($profile);
        return ($temp);
    }

    $profile[] = microtime ();
}

// Einen tick handler bestimmen
register_tick_function("profile");

// Funktion vor dem declare-Block initialisieren
profile ();

// Ausführen eines Code-Blocks, jede 2te Anweisung löst einen tick aus

declare (ticks=2) {
    for ($x = 1; $x < 50; ++$x) {
        echo similar_text (md5($x), md5($x*$x)), "<br />;";
    }
}

// Ausgabe der gespeicherten Daten aus dem Profiler
print_r (profile (TRUE));
?>
Dieses Beispiel 'profiliert' den PHP Code der im 'declare'-Block steht, indem die Zeit festgehalten wird, zu der jede zweite low-level Anweisung im Codeblock ausgeführt wird. Diese Information können Sie dazu benutzen, langsame Bereiche innerhalb bestimmter Codesegmente zu idebtifizieren. Das gleiche Ziel können Sie auch mit anderen Methoden erreichen: die Benutzung von ticks ist bequemer und einfacher zu implementieren.

Ticks sind gut für Debugging, einfaches Multitasking, Hintergrund I/O und viele andere Aufgaben geeignet.

Siehe auch register_tick_function() und unregister_tick_function().


return

Wird die return() Anweisung innerhalb einer Funktion aufgerufen, wird die Ausführung der Funktion sofort beendet und das Argument als Wert des Funktionsaufrufs zurückgegeben. return() beendet auch die Ausführung einer eval() Anweisung oder einer Skriptdatei.

Erfolgt der Aufruf innerhalb des globalen Bereichs, wird die Ausführung des aktuellen Skripts beendet. Wurde das aktuelle Skript include()ed oder require()ed, wird die Kontrolle an das aufrufende Skript zurückgegeben. Wurde das aktuelle Skript include()ed, wird der Wert, der return() zugewiesen wurde, als Wert des Aufrufs von include() zurückgegeben. Wird return() inerhalb des Hauptskripts aufgerufen, wird die Ausführung beendet. Handelt es sich bei dem Skript um eine Datei, die über die Einträge auto_prepend_file oder auto_append_file in der Konfigurationsdatei aufgerufen wurde, wird die Ausführung dieses Skripts beendet.

Anmerkung: Beachten Sie, dass return() ein Sprachkonstrukt und keine Funktion ist. Deshalb brauchen Sie die Klammern um die Argumente nicht zu schreiben -- tatsächlich ist es eher gebräuchlich, diese wegzulassen, als die Klammern zu benutzen, obwohl es keinen Unterschied ausmacht.


require()

Die require() Anweisung bindet eine Datei ein und führt diese aus.

require() bindet eine Datei ein und führt diese aus. Genaue Informationen wie die Einbindung funktioniert ist in der Dokumentation für include() beschrieben.

require() und include() sind in jeder Hinsicht gleichwertig mit der einen Ausnahme: der Umgang mit Fehlern. include() erzeugt ein Warning während require() in einem Fatal Error endet. Mit anderen Worten: scheuen Sie sich nicht, require() zu benutzen, wenn Sie möchten, dass eine fehlende Datei die Ausführung ihres Skripts beendet. include() verhält sich anders, ihr Skript wird weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen include_path gesetzt haben.

Beispiel 12-2. Grundlegende require() Beispiele

<?php

require 'prepend.php';

require $somefile;

require ('somefile.txt');

?>

Weitere Beispiele finden Sie in der Dokumentation zu include().

Anmerkung: Für frühere Versionen als PHP 4.0.2 gilt folgendes: require() wird immer versuchen die Zieldatei zu lesen, selbst wenn die Zeile in der die Anweisung steht, nie ausgeführt wird. Eine bedingte Anweisung hat keine Auswirkungen auf require(). Wenn jedoch die Zeile in der require() steht, nie ausgeführt wird, wird auch der Code der Zieldatei nie ausgeführt werden. Ähnliches gilt für Schleifenstrukturen, diese beeinflussen das Verhalten von require() nicht. Obwohl der Code, der in der Zieldatei enthalten ist, zur Schleife gehört, wird require() selbst nur einmal ausgeführt.

Warnung

Windows PHP Versionen, kleiner als PHP 4.3, erlauben den Zugriff auf Remote-Dateien mit dieser Funktion nicht, selbst wenn allow_url_fopen aktiviert ist.

Siehe auch include(), require_once(), include_once(), eval(), file(), readfile(), virtual() und include_path.


include()

Die include()-Anweisung bindet die angegebene Datei ein und wertet sie aus.

Die untenstehende Dokumentation gilt ebenso für require(). Diese beiden Konstrukte sind in jeder Hinsicht gleichwertig mit der einen Ausnahme: der Umgang mit Fehlern. include() erzeugt ein Warning während require() in einem Fatal Error endet. Mit anderen Worten, verwenden Sie require(), wenn Sie möchten, dass eine fehlende Datei die Ausführung ihres Skripts beendet. include() verhält sich anders, ihr Skript wird weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen include_path gesetzt haben.

Wenn eine Datei eingebunden wird, erbt der enthaltene Code den Geltungsbereich von Variablen der Zeile in der die Anweisung steht. Ab dieser Zeile stehen alle verfügbaren Variablen in der aufgerufenen Datei im aufrufenden Skript zur Verfügung.

Beispiel 12-3. Grundlegende include() Beispiel

vars.php
<?php

$color = 'green';
$fruit = 'appel';

?>

test.php
<?php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

Steht include im aufrufenden Skript innerhalb einer Funktion, verhält sich der gesamte Code der aufgerufenen Datei genau so, als ob Sie diesen Code innerhalb dieser Funktion definiert hätten. Aus diesem Grund hat dieser Code den Geltungsbereich der Variablen dieser Funktion.

Beispiel 12-4. Include innerhalb einer Funktion

<?php

function foo()
{
global $color;

    include 'vars.php';

    echo "A $color $fruit";
}

/* vars.php ist im Geltungsbereich von foo(),  *
 * d.h. $fruit steht außerhalb dieses Bereichs *
 * NICHT zur Verfügung. $color schon, da wir   *
 * diese Variable als global definiert haben  */

foo();                    // A green apple
echo "A $color $fruit";   // A green

?>

Beim Einbinden einer Datei wechselt der Parser vom PHP-Modus zu Beginn der Zieldatei in den HTML-Modus und kehrt am Ende der eingebunden Datei wieder in den PHP-Modus zurück. Deshalb muss jeglicher Code innerhalb der eingebundenen Datei, der als PHP-Code ausgeführt werden soll, von gültigen PHP-Start- und Ende-Tags eingefaßt sein.

Wenn "URL fopen wrappers" in PHP aktiviert sind (in der Standardkonfiguration ist das der Fall) können Sie als Pfad der einzubindenden Datei auch eine URL (via HTTP oder anderen unterstützen Wrappern - eine Liste der unterstützen Protokolle finden Sie unter Anhang I) statt einer lokalen Pfadangabe angeben. Falls der Zielserver die Zieldatei als PHP-Code interpretiert, können Sie an die einzubindende Datei Variablen in einem Request-String übergeben, genauso wie bei HTTP GET. Streng genommen ist das nicht das Gleiche, wie diese Datei einzubinden und diesem den Geltungsbereich des Vater-Skripts zu vererben; das Skript wird auf dem Remote-Server ausgeführt und danach wird das Ergebnis in das lokale Skript eingebunden.

Warnung

Windows PHP Versionen, kleiner als PHP 4.3, erlauben den Zugriff auf Remote-Dateien mit dieser Funktion nicht, selbst wenn allow_url_fopen aktiviert ist.

Beispiel 12-5. include() über HTTP

<?php

/* Dieses Beispiel geht davon aus, dass www.example.com so konfiguriert     *
 * ist, dass .php-Dateien geparst werden und keine .txt Dateien. Also meint *
 * 'Funkt' hier, dass die Variablen $foo und $bar innerhalb der             *
 * angeforderten Datei zur Verfügung stehen                                 */

// Funkt. nicht; file.txt wird von www.example.com nicht als PHP geparst

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Funkt. nicht; schaut nach einer lokalen Datei namens
// 'file.php?foo=1&bar=2' im lokalen Dateisystem

include 'file.php?foo=1&bar=2';

// Funkt
include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;
$bar = 2;
include 'file.txt';  // Funkt.
include 'file.php';  // Funkt.

?>
Siehe auch Zugriff auf entfernte Dateien, fopen() und file() für verwandte Informationen

Da include() und require() spezielle Sprachkonstrukte sind, müssen Sie diese innerhalb einer bedingten Anweisung in einen Anweisungsblock setzen.

Beispiel 12-6. include() und bedingte Blöcke

<?php

// Das ist FALSCH und führt nicht zum gewünschten Ergebnis.
 

if ($bedingung)
    include $datei;
else
    include $andere_datei;


// Das ist KORREKT.
if ($bedingung) {
    include $datei;
} else {
    include $andere_datei;
}

?>

Der Umgang mit Returns: Es ist möglich eine return() -Anweisung innerhalb einer eingebunden Datei anzugeben, um die Ausführung innerhalb dieser Datei abzubrechen und zum aufrufenden Skript zurück zu kehren. Ebenso ist die Rückgabe von Werten aus einer eingebunden Datei möglich. Sie können den Wert eines include-Aufrufs auf die gleiche Art und Weise nutzen, wie Sie es bei einer Funktion machen würden.

Anmerkung: In PHP 3 darf eine return-Anweisung nicht innerhalb eines Blocks auftreten, es sei denn, es ist ein Funktions-Block. In diesem Fall gilt return() für diese Funktion und nicht für die ganze Datei.

Beispiel 12-7. include() und die return() Anweisung

return.php
<?php

$var = 'PHP';

return $var;

?>

noreturn.php
<?php

$var = 'PHP';

?>

testreturns.php
<?php

$foo = include 'return.php';

echo $foo; // gibt 'PHP' aus

$bar = include 'noreturn.php';

echo $bar; // gibt 1 aus

?>

$bar hat den Wert 1, weil include erfolgreich war. Beachten Sie die Unterschiede in den obigen Beispielen. Das erste nutzt return() innerhalb der eingebundenen Datei im Gensatzt zum zweiten Beispiel. Weitere Möglichkeiten Dateien in Variablen "einzubinden" bieten ihnen die Funktionen fopen() und file() oder include() im Zusammenspiel mit den Funktionen zur Ausgabesteuerung.

Siehe auch require(), require_once(), include_once(), readfile(), virtual()und include_path.


require_once()

Die require_once()-Anweisung bindet eine Datei ein und führt diese zur Laufzeit des Skripts aus. Das Verhalten ist ähnlich der require()-Anweisung mit dem einzigen Unterschied, dass einmal eingebundener Code aus einer Datei nicht nocht einmal eingebunden wird. Lesen Sie die Dokumentation zu require() um mehr Informationen über die Arbeitsweise dieser Anweisung zu erhalten.

require_once() sollten Sie in den Fällen benutzen, wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden und interpretiert werden soll und Sie sicher stellen wollen, dass diese Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, usw.

Weitere Beispiele zu require_once() und include_once() können Sie dem PEAR-Code entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist.

Anmerkung: require_once() steht ab PHP 4.01pl2 zur Verfügung.

Anmerkung: Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten von require_once() und include_once() nicht unbedingt ihren Erwartungen entspricht.

Beispiel 12-8. require_once() und Groß-/Kleinschreibung

require_once("a.php"); // bindet a.php ein
require_once("A.php"); // bindet a.php auf Windows nochmal ein!

Warnung

Windows PHP Versionen, kleiner als PHP 4.3, erlauben den Zugriff auf Remote-Dateien mit dieser Funktion nicht, selbst wenn allow_url_fopen aktiviert ist.

Siehe auch: require(), include(), include_once(), get_required_files(), get_included_files(), readfile() und virtual().


include_once()

Die Anweisung include_once() schließt zur Ausführungszeit die angegebene Datei ein und wertet diese aus. Dies ist ähnlich der include()-Anweisung; mit dem Unterschied, dass einmal eingebundener Code nicht nochmals eingebunden wird. Wie der Name vermuten lässt, wird ie Datei nur ein einziges Mal eingebunden.

include_once() sollten Sie in den Fällen benutzen, wenn die gleiche Datei in einem bestimmten Bereich mehrmals eingebunden und interpretiert werden soll und Sie sicher stellen wollen, dass diese Datei nur exakt einmal eingebunden wird, um Probleme mit Wiederholungen bei Funktions-Definitionen und Wertzuweisungen zu Variablen zu vermeiden, usw.

Weitere Beispiele zu require_once() und include_once() können Sie dem PEAR-Code entnehmen, welcher im aktuellsten PHP-Source-Code enthalten ist.

Anmerkung: include_once() steht ab PHP 4.01pl2 zur Verfügung.

Anmerkung: Beachten Sie, dass auf auf einem Betriebssystem, das nicht zwischen Groß- und Kleinschreibung unterschiedet (wie z.B. Windows) das Verhalten von include_once() und require_once() nicht unbedingt ihren Erwartungen entspricht.

Beispiel 12-9. include_once() und Groß-/Kleinschreibung

include_once("a.php"); // bindet a.php ein
include_once("A.php"); // bindet a.php auf Windows nochmal ein!

Warnung

Windows PHP Versionen, kleiner als PHP 4.3, erlauben den Zugriff auf Remote-Dateien mit dieser Funktion nicht, selbst wenn allow_url_fopen aktiviert ist.

Siehe auch include(), require(), require_once(), get_required_files(), get_included_files(), readfile() und virtual().


Kapitel 13. Funktionen

Vom Nutzer definierte Funktionen

Eine Funktion kann wie folgt definiert werden:

function foo ($arg_1, $arg_2, ..., $arg_n)
{
    echo "Beispielfunktion.\n";
    return $retval;
}

Jeder beliebige korrekte PHP-Code kann in einer Funktion vorkommen, sogar andere Funktionen und Klassen- Definitionen.

In PHP 3 müssen Funktionen definiert sein, bevor man auf sie verweist. In PHP4 ist das nicht mehr erforderlich, außer wenn eine Funktion nur bedingt definiert wird, wie in den beiden untenstehenden Beispielen gezeigt.

Wenn eine Funktion nur unter bestimmten Bedingungen definiert wird, muß die Definition dieser Funktion noch vor deren Aufruf abgearbeitet werden.

Beispiel 13-1. Bedingte Funktionen

<?php

$makefoo = true;

/* Wir können foo() von her aus nicht
   aufrufen, da sie noch nicht existiert,
   aber wir können bar() aufrufen */

bar();

if ($makefoo) {
  function foo ()
  {
    echo "Ich existiere nicht, bis mich die Programmausführung erreicht hat.\n";
  }
}

/* Nun können wir foo() sicher aufrufen,
   da $makefoo als true ausgewertet wurde */

if ($makefoo) foo();

function bar()
{
  echo "Ich existiere sofort nach Programmstart.\n";
}

?>

Beispiel 13-2. Funktionen innerhalb von Funktionen

<?php
function foo() 
{
  function bar() 
  {
    echo "Ich existiere nicht, bis foo() aufgerufen wurde.\n";
  }
}

/* Wir können bar() noch nicht
   aufrufen, da es nicht existiert */

foo();

/* Nun können wir auch bar() aufrufen,
   da sie durch die Abarbeitung von
   foo() verfügbar gemacht wurde */

bar();

?>

PHP unterstützt weder das Überladen von Funktionen, noch ist es möglich, zuvor deklarierte Funktionen neu zu definieren oder die Definition zu löschen.

PHP 3 unterstützt keine variable Anzahl von Parametern, obwohl Vorgabewerte für Parameter unterstützt werden (weitere Informationen finden Sie unter Vorgabewerte für Parameter). PHP 4 unterstützt beides: siehe Variable Parameteranzahl und die Funktionsreferenzen für func_num_args(), func_get_arg() und func_get_args() für weitere Informationen.


Funktionsparameter

Mit einer Parameterliste kann man Informationen an eine Funktion übergeben. Die Parameterliste ist eine durch Kommas getrennte Liste von Variablen und/oder Konstanten.

PHP unterstützt die Weitergabe von Parametern als Werte (das ist der Standard), als Verweise, und als Vorgabewerte. Die Übergabe einer variablen Anzahl von Parametern wird nur von PHP 4 und höher unterstützt, siehe Variable Parameteranzahl und die Funktionsreferenzen für func_num_args(), func_get_arg() und func_get_args() für weitere Informationen. Durch die Übergabe eines Arrays mit Parametern kann man auch in PHP 3 einen ähnlichen Effekt erreichen:

function rechne_array($eingabe)
{
    echo "$eingabe[0] + $eingabe[1] = ", $eingabe[0]+$eingabe[1];
}


Verweise als Parameter übergeben

Normalerweise werden den Funktionen Werte als Parameter übermittelt. Wenn man den Wert dieses Parameters innerhalb der Funktion ändert, bleibt der Parameter außerhalb der Funktion unverändert. Wollen Sie aber genau das erreichen, dann müssen Sie die Parameter als Verweise (Referenzen) übergeben.

Wenn eine Funktion einen Parameter generell als Verweis behandeln soll, setzt man in der Funktionsdefinition ein kaufmännisches Und (&) vor den Parameternamen:

function fuege_etwas_anderes_an (&$string)
{
    $string .= 'und nun zu etwas anderem.';
}
$str = 'Dies ist ein String, ';
fuege_etwas_anderes_an ($str);
echo $str; // Ausgabe: 'Dies ist ein String, und nun zu etwas anderem.'


Vorgabewerte für Parameter

Eine Funktion kann C++-artige Vorgabewerte für skalare Parameter wie folgt definieren:

function machkaffee ($typ = "Cappucino")
{
    return "Ich mache eine Tasse $typ.\n";
}
echo machkaffee ();
echo machkaffee ("Espresso");

Die Ausgabe von diesem kleinen Skript ist:
Ich mache eine Tasse Cappucino.
Ich mache eine Tasse Espresso.

Der Vorgabewert muss ein konstanter Ausdruck sein, darf also (zum Beispiel) keine Variable oder Element einer Klasse sein.

Bitte beachten Sie, dass alle Vorgabewerte rechts von den Nicht-Vorgabeparametern stehen sollten; - sonst wird es nicht funktionieren. Betrachten Sie folgendes Beispiel:

function mach_joghurt ($typ = "rechtsdrehendes", $geschmack)
{
    return "Mache einen Becher $typ $geschmack-joghurt.\n";
}
 
echo mach_joghurt ("Brombeer");   // arbeitet nicht wie erwartet

Die Ausgabe dieses Beispiels ist::
Warning: Missing argument 2 in call to makeyogurt() in 
/usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Mache einen Becher Brombeer-joghurt.

Nun vergleichen Sie bitte oberes Beispiel mit folgendem:

function mach_joghurt ($geschmack, $typ = "rechtsdrehendes")
{
    return "Mache einen Becher $typ $geschmack-joghurt.\n";
}
 
echo mach_joghurt ("Brombeer");   // arbeitet wie erwartet.

... und jetzt ist die Ausgabe:
Mache einen Becher rechtsdrehendes Brombeer-Joghurt.


Variable Anzahl von Parametern

PHP 4 unterstützt eine variable Anzahl von Parametern in benutzerdefinierten Funktionen. Das Handling dieser Parameter fällt mittels der Funktionen func_num_args(), func_get_arg() und func_get_args() sehr leicht.

Es ist keine spezielle Syntax erforderlich. Die Parameter können wie gehabt explizit in den Funktionsdeklarationen angegeben werden, und werden sich wie gewohnt verhalten.


Rückgabewerte

Sie können Werte mit dem optionalen Befehl "return" zurückgeben. Es können Variablen jedes Typs zurückgegeben werden, auch Listen oder Objekte. Die beendet sofort die Funktion, und die Kontrolle wird wieder an die aufrufende Zeile zurückgegeben. Weitere Informationen finden Sie unter return().

function quadrat ($zahl)
{
    return $zahl * $zahl;
}
echo quadrat (4);   // gibt '16' aus.

Es ist nicht möglich, mehrere Werte von einer Funktion zurückzugeben. Ein ähnliches Resultat kann man aber durch die Rückgabe von Listen erreichen.

function kleine_zahlen()
{
   return array (0, 1, 2);
}
list ($null, $eins, $zwei) = kleine_zahlen();

Um von einer Funktion eine Referenz zurückzugeben, müssen Sie den Referenz-Operator & sowohl in der Funktionsdeklaration, als auch bei der Zuweisung des zurückgegebenen Wertes verwenden:

function &returniere_referenz()
{
    return $einereferenz;
}

$neuereferenz =& returniere_referenz();

Weitere Informationen über Referenzen finden Sie im Kapitel Referenzen in PHP.


old_function

Der Befehl old_function erlaubt es, eine Funktion genauso wie bei PHP/FI2 zu definieren (nur "function" wird durch "old_function" ersetzt.

Dieser Befehl sollte nur vom PHP/FI2->PHP3-Konverter genutzt werden.

Warnung

Funktionen, die durch old_function definiert werden, können nicht von PHP selbst aufgerufen werden. Das heißt unter anderem, dass sie nicht in Funktionen wie usort (), array_walk() und register_shutdown_function() benutzt werden können. Dieses Manko können Sie umgehen, indem Sie eine Adapterfunktion (in normalem PHP3) schreiben, welche die old_function aufruft.


Variablenfunktionen

PHP unterstützt das Konzept der Variablenfunktionen. Wenn Sie an das Ende einer Variablen Klammern hängen, versucht PHP eine Funktion aufzurufen, deren Name der aktuelle Wert der Variable ist. Dies kann unter anderem für Callbacks, Funktionstabellen, usw. genutzt werden.

Variablenfunktionen funktionieren nicht mit Sprachkonstrukten wie echo(), print(), unset(), isset(), empty(), include() und require(). Sie müssen Ihre eigenen Wrapperfunktionen verwenden, um diese Konstrukte als variable Funktionen benutzen zu können.

Beispiel 13-3. Beispiel für Variablenfunktionen

<?php
function foo()
{
    echo "In foo()<br>\n";
}

function bar($arg = '')
{
    echo "In bar(); der Parameter ist '$arg'.<br>\n";
}

// Dies ist eine Wrapperfunkiton für echo
function echoit($string)
{
    echo $string;
}

$func = 'foo';
$func();        // Dies ruft foo() auf

$func = 'bar';
$func('test');  // Dies ruft bar() auf

$func = 'echoit';
$func('test');  // Dies ruft echoit() auf
?>

Sie können auch die Methode eines Objektes mittels der variablen Funktionen aufrufen.

Beispiel 13-4. Variable Methode

<?php
class Foo
{
    function Var()
    {
        $name = 'Bar';
        $this->$name(); // Dies ruft die Bar() Methode auf
    }
    
    function Bar()
    {
        echo "Das ist Bar";
    }
}

$foo = new Foo();
$funcname = "Var";
$foo->$funcname();   // Dies ruft $foo->Var() auf

?>

Siehe auch call_user_func(), Variable Variablen und function_exists().


Kapitel 14. Klassen und Objekte

Klassen

Eine Klasse ist eine Sammlung von Variablen und Funktionen, die mit diesen Variablen arbeiten. Eine Klasse wird folgendermaßen definiert:

<?php
class Cart
{
    var $items;  // Artikel in unserem Einkaufswagen
   
    // Füge dem Einkaufswagen $num Artikel der Sorte $artnr zu
 
    function add_item ($artnr, $num)
    {
        $this->items[$artnr] += $num;
    }
   
    // Nimm $num Artikel von $artnr aus dem Einkaufswagen
 
    function remove_item ($artnr, $num)
    {
        if ($this->items[$artnr] > $num) {
            $this->items[$artnr] -= $num;
            return true;
        } else {
            return false;
        }   
    }
}
?>

In diesem Beispiel wird eine Klasse "Cart" definiert. Sie besteht aus einem assoziativen Array von Produkten im Einkaufswagen und zwei Funktionen zum Hinzufügen und Entfernen von Artikeln.

Achtung

Die folgenden warnenden Bemerkungen gelten für PHP 4.

Der Name stdClass ist reserviert, da er intern von Zend benutzt wird. Sie können in PHP keine Klasse mit dem Namen stdClass haben.

Die Funktionsnamen __sleep und __wakeup sind in PHP Klassen "magisch". Sie können in Ihren Klassen keine Funktionen mit diesen Namen haben, außer Sie wollen sie mit dieser "magischen" Funktionalität assoziieren. Mehr Informationen dazu finden Sie weiter unten.

Sämtliche mit __ beginnende Funktionsnamen sind PHP als "magisch" vorbehalten. Es wird empfohlen, in PHP keine Funktionsnamen mit __ zu verwenden, außer Sie möchten dokumentierte "magische" Funktionalität.

Anmerkung: In PHP 4 sind nur konstante Initialisierungen für var Variablen erlaubt. Um Variablen mit nicht konstanten Werten zu initialisieren, benötigen Sie eine Funktion zur Initialisierung, welche beim Erstellen eines Objektes automatisch von der Klasse aufgerufen wird. Eine solche Funktion wird Konstruktor genannt (siehe unten).

<?php
/* Keine wird in PHP 4 funktionieren */
class Cart
{
    var $todays_date = date("Y-m-d");
    var $name = $firstname;
    var $owner = 'Fred ' . 'Jones';
    var $items = array("VCR", "TV");
}

/* So sollte es gemacht werden */
class Cart
{
    var $todays_date;
    var $name;
    var $owner;
    var $items;

    function Cart()
    {
        $this->todays_date = date("Y-m-d");
        $this->name = $GLOBALS['firstname'];
        /* etc. . . */
    }
}
?>

Klassen sind Typen, das heißt sie sind die Blaupausen für reale Variablen. Um sie zu nutzen, muss zunächst eine Variable mit dem Operator new angelegt werden.

<?php
$cart = new Cart;
$cart->add_item("10", 1);

$another_cart = new Cart;
$another_cart->add_item("0815", 3);

Dies erstellt die Objekte $cart und $another_cart aus der Klasse Cart. Dann wird die Funktion add_item() des $cart Objektes aufgerufen, um $cart einen Artikel mit der Artikelnummer 10 hinzuzufügen. 3 Artikel mit der Artikelnummer 0815 werden $another_cart hinzugefügt.

Sowohl $cart als auch $another_cart haben die Funktionen add_item(), remove_item() und die Variable items. Dies sind verschiedene Funktionen und Variablen. Sie können sich Objekte ähnlich den Verzeichnissen in einem Dateisystem vorstellen. Sie können in einem Dateisystem zwei verschiedene Dateien README.TXT haben, solange sie sich in verschiedenen Verzeichnissen befinden. So wie Sie in Verzeichnissen den vollen Pfadnamen eingeben müssen, um jede Datei von dem obersten Verzeichnis aus zu erreichen, müssen Sie auch den vollen Namen der aufzurufenden Funktion angeben: Das heißt für PHP, dass das Hauptverzeichnis der globale Namensbereich, und der Separator des Pfadnamens -> wäre. Deshalb benennen die Namen $cart->items und $another_cart->items auch zwei verschiedene Variablen. Beachten Sie, dass die Variable $cart->items, und nicht $cart->$items genannt wird, da ein Variablenname in PHP nur ein einziges Dollarzeichen hat.

// korrekt, einfaches $
$cart->items = array("10" => 1); 

// falsch, denn $cart->$items wird zu $cart->""
$cart->$items = array("10" => 1);

// richtig aber fraglich, ob dies erwünscht war:
// $cart->$myvar wird zu $cart->items
$myvar = 'items';
$cart->$myvar = array("10" => 1);

Innerhalb einer Klassendefinition ist nicht bekannt, unter welchem Namen das Objekt in Ihrem Programm erreichbar sein wird: Als die Klasse Cart geschrieben wurde war nicht bekannt, dass das Objekt später $cart oder $another_cart genannt wird. Deshalb können Sie innerhalb der Klasse Cart selbst auch nicht $cart->items schreiben. Um nun die eigenen Funktionen und Variablen innerhalb einer Klasse anzusprechen, können Sie die Pseudo-Variable $this verwenden, welche Sie auch als 'meine eigene' oder 'aktuelles Objekt' verstehen können. Deshalb kann '$this->items[$artnr] += $num' auch als 'addiere $num zu $artnr in meinem eigenen Array items', oder 'addiere $num zu $artnr im Array items innerhalb des aktuellen Objektes' lesen.

Anmerkung: Es gibt ein paar angenehme Funktionen, um mit Klassen und Objekten umzugehen. Mehr darüber erfahren Sie im Kapitel Klassen- und Objekt-Funktionen.


extends

Oft braucht man Klassen mit in einer anderen Klasse ähnlichen Variablen und Funktionen. So ist es eine gute Vorgehensweise, eine in allen Ihren Projekten verwendbare Oberklasse zu definieren, und diese dann den Bedürfnissen Ihrer einzelnen Projekte anzupassen. Um dies zu erleichtern, können Klassen andere Klassen erweitern. Die erweiterte bzw. abgeleitete Klasse verfügt über alle Variablen und Funktionen der Basisklasse (dies wird 'Vererbung' genannt, obwohl niemand gestorben ist), und was Sie in der erweiterten Definition hinzufügen. Es ist nicht möglich, etwas von einer Klasse wegzunehmen, d.h. Sie können keine existierenden Variablen oder Funktionen 'wegdefinieren'. Eine Unterklasse ist immer von einer einzigen Oberklasse abhängig, d.h. Mehrfachvererbung wird nicht unterstützt. Klassen werden mittels dem Schlüsselwort 'extends' erweitert.

class Named_Cart extends Cart
{
    var $owner;
  
    function set_owner ($name)
    {
        $this->owner = $name;
    }
}

Hier wird die Klasse Named_Cart definiert, die über alle Variablen und Funktionen von Cart, plus der Variable $owner und der Funktion set_owner() verfügt. Sie können einen bestimmten Einkaufswagen (Named_Cart) auf dem üblichen Weg erstellen, und nun auch den Besitzer (owner) bestimmen und erfragen. Sie können noch immer die normalen Cart Funktionen an Named_Cart anwenden:

$ncart = new Named_Cart;    // Erstellt einen bestimmten Einkaufwagen
$ncart->set_owner("kris");  // den Besitzer festlegen
print $ncart->owner;        // den Besitzer ausgeben
$ncart->add_item("10", 1);  // (vererbte Funktionalität von Cart)

Dies wird auch eine "Eltern-Kind" Beziehung genannt. Sie erstellen eine Klasse ("Eltern"), und erstellen mittels extends eine neue Klasse, die auf der "Eltern"-Klasse basiert: die "Kind"-Klasse. Sie können auch diese neue Unterklasse verwenden und eine neue, auf dieser Klasse basierenden Klasse erstellen.

Anmerkung: Bevor Sie Klassen verwenden können, müssen Sie diese definieren. Wenn Sie wollen, dass Named_Cart die Klasse Cart erweitert, müssen Sie Cart erst definieren. Wenn Sie eine andere Klasse, z.B. Yellow_named_cart erstellen wollen, welche auf Named_Cart basiert, müssen Sie zuerst Named_Cart definieren. Kurz gesagt ist die Reihenfolge, in der die Klassen definiert werden, sehr wichtig.


Konstruktoren

Achtung

In PHP 3 und PHP 4 verhalten sich die Konstruktoren unterschiedlich. Die PHP 4 Semantik wird dringend empfohlen.

Konstruktoren sind Funktionen innerhalb einer Klasse, die automatisch aufgerufen wird, sobald Sie mittels new eine neue Instanz erstellen. In PHP 3 wird eine Funktion zum Konstruktor, wenn sie den gleichen Namen wie die Klasse hat. In PHP 4 wird eine Funktion zum Konstruktor, wenn sie den gleichen Namen wie die Klasse hat, in der sie definiert ist. Der Unterschied ist subtil, aber entscheidend (siehe unten).

// Funktioniert sowohl in PHP 3, als auch in PHP 4.
class Auto_Cart extends Cart
{
    function Auto_Cart()
    {
        $this->add_item ("10", 1);
    }
}

Die Klasse Auto_Cart entspricht der Klasse Cart und hat einen Konstruktor, der Cart bereits mit einem Artikel der Nummer "10" initialisiert, sobald ein neuer Auto_Cart mittels "new" erstellt wird. Konstruktoren können Argumente übernehmen, die optional sein können, was sie sehr praktisch macht. Um eine Klasse auch ohne Parameter verwenden zu können, sollten alle Parameter für Konstruktoren optional sein, indem sie mit Standardwerten ausgestattet werden.

// Funktioniert sowohl in PHP 3, als auch in PHP 4.
class Constructor_Cart extends Cart
{
    function Constructor_Cart($item = "10", $num = 1)
    {
        $this->add_item ($item, $num);
    }
}
 
// Kaufe das gleiche alte Zeug ein.
 
$default_cart = new Constructor_Cart;
 
// Kaufe etwas anderes...
 
$different_cart = new Constructor_Cart("20", 17);

Sie können auch den Operator @ verwenden, um Fehlermeldungen innerhalb des Konstruktors zu unterdrücken, z.B. @new.

Achtung

In PHP 3 haben abgeleitete Klassen und Konstruktoren ein paar Einschränkungen. Sie sollten das folgende Beispiel sorgfältig lesen, um diese Einschränkungen zu verstehen.

class A
{
    function A()
    {
      echo "I am the constructor of A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// In PHP 3 wurde kein Konstruktor aufgerufen.
$b = new B;

In PHP 3 wird bei dem obigen Beispiel kein Konstruktor aufgerufen. Die Regel in PHP 3 besagt: 'Ein Konstruktor ist eine Funktion mit dem selben Namen wie die Klasse'. Der Name der Klasse ist B, und nachdem in Klasse B keine Funktion namens B() existiert, passiert nichts.

Dies ist in PHP 4 mit der Einführung einer anderen Regel behoben: Wenn eine Klasse keinen Konstruktor hat, wird der Konstruktor der Basisklasse aufgerufen, so dieser existiert. Das obige Beispiel hätte in PHP 4 also 'I am the constructor of A.<br>' ausgegeben.

class A
{
    function A()
    {
        echo "I am the constructor of A.<br>\n";
    }

    function B()
    {
        echo "I am a regular function named B in class A.<br>\n";
        echo "I am not a constructor in A.<br>\n";
    }
}

class B extends A
{
    function C()
    {
        echo "I am a regular function.<br>\n";
    }
}

// Dies ruft B() als Konstruktor auf.
$b = new B;

In PHP 3 wird die Funktion B() in der Klasse A plötzlich zum Konstruktor in Klasse B, auch wenn dies nie beabsichtigt war. Die Regel in PHP 3 lautet: 'Ein Konstruktor ist eine Funktion mit dem gleichen Namen wie die Klasse'. PHP 3 kümmert sich nicht darum, ob die Funktion in Klasse B definiert, oder ob sie nur vererbt wurde.

Dies ist in PHP 4 mit einer modifizierten Regel behoben: 'Ein Konstruktor ist eine Funktion mit dem selben Namen wie die Klasse, in der sie definiert wurde'. So hätte die Klasse B in dem obigen Beispiel keinen eigenen Konstruktor, und würde der Konstruktor der Basisklasse aufgerufen, welcher 'I am the constructor of A.<br>' ausgeben würde.

Achtung

Weder PHP 3, noch PHP 4 rufen vom Konstruktor der abgeleiteten Klasse aus automatisch Konstruktoren der Basisklasse auf. Wenn angebracht, ist der Aufruf von Konstruktoren aufwärts Ihre Aufgabe.

Anmerkung: In PHP 3 und PHP 4 gibt es keine Destruktoren. Stattdessen können Sie register_shutdown_function() verwenden, um die meisten Effekte von Destruktoren zu simulieren.

Destruktoren sind Funktionen die automatisch aufgerufen werden, wenn ein Objekt entweder mittels unset(), oder durch Verlassen des Gültigkeitsbereiches zerstört wird. Es gibt in PHP keine Destruktoren.


::

Achtung

Die folgende Beschreibung ist nur für PHP 4 gültig.

Manchmal ist es hilfreich, auf Funktionen in Basisklassen bzw. auf Funktionen in Klassen zuzugreifen, die noch keine Instanzen haben. Dafür wird der :: Operator verwendet.

class A
{
    function example()
    {
        echo "I am the original function A::example().<br>\n";
    }
}

class B extends A
{
    function example()
    {
        echo "I am the redefined function B::example().<br>\n";
        A::example();
    }
}

// Es gibt kein Objekt der Klasse A.
// Dies wird folgendes ausgeben
//   I am the original function A::example().<br>
A::example();

// Erstellt ein Objekt der Klasse B.
$b = new B;

// Dies wird folgendes ausgeben
//   I am the redefined function B::example().<br>
//   I am the original function A::example().<br>
$b->example();

Das obige Beispiel ruft die Funktion example() der Klasse A auf. Nachdem noch kein Objekt der Klasse A existiert, können wir nicht $a->example() oder ähnliches schreiben. Stattdessen rufen wir example() als 'Klassenfunktion' auf, d.h. als Funktion der Klasse selbst, und nicht irgendein Objekt dieser Klasse.

Es gibt Klassenfunktionen, aber keine Klassenvariablen. Tatsächlich gibt es zur Zeit des Aufrufs kein Objekt. Deshalb darf eine Klassenfunktion keine Objektvariablen benutzen (aber sie kann lokale und globale Variablen verwenden), und sie darf $this ebenfalls nicht benutzen.

In dem obigen Beispiel definiert Klasse B die Funktion example() neu. Die ursprüngliche Definition in Klasse A ist überschattet und nicht länger verfügbar, außer Sie verweisen mittels des ::-Operators speziell auf example() in Klasse A. Schreiben Sie A::example(), um dies zu tun (Tatsächlich sollten Sie parent::example() schreiben, wie im nächsten Abschnitt beschrieben).

In diesem Kontext besteht ein Objekt, das Objektvariablen haben kann. Deshalb können Sie auch $this und Objektvariablen verwenden, wenn sie von innerhalb einer Objektfunktion verwendet werden.


parent

Wahrscheinlich wollen Sie auch Code schreiben, der sich auch auf Variablen und Funktionen in Basisklassen bezieht. Dies gilt speziell dann, wenn Ihre abgeleitete Klasse eine Verfeinerung oder Spezialisierung von Code in Ihrer Basisklasse ist.

Anstatt in Ihrem Code den wörtlichen Namen der Basisklasse zu verwenden, sollten Sie den speziellen Namen parent verwenden, welcher sich auf den in der Deklaration Ihrer Klasse mittels extends gegebenen Namen Ihrer Basisklasse bezieht. So vermeiden Sie die mehrfache Verwendung des Namens der Basisklasse. Sollte sich Ihr Vererbungsbaum während der Implementation ändern, brauchen Sie nur mehr die extends Deklaration Ihrer Klasse zu ändern.

class A
{
    function example()
    {
        echo "I am A::example() and provide basic functionality.<br>\n";
    }
}

class B extends A
{
    function example()
    {
        echo "I am B::example() and provide additional functionality.<br>\n";
        parent::example();
    }
}

$b = new B;

// Dies ruft B::example() auf, welches wiederum A::example() aufruft.
$b->example();


Objekte serialisieren - Objekte in Sessions

Anmerkung: In PHP 3 verlieren Objekte während des Prozesses der Serialisierung und Deserialisierung ihre Assoziation zur Klasse. Die resultierende Variable ist vom Typ Objekt, hat aber keine Klasse und keine Methoden, weshalb sie ziemlich unbrauchbar ist (Sie wurde wie ein Array, jedoch mit einer ziemlich komischen Syntax).

Achtung

Die folgende Information ist nur für PHP 4 gültig.

serialize() gibt eine Zeichenkette zurück, die eine Byte-Strom-Repräsentation irgendeines in PHP speicherbaren Wertes enthält. unserialize() kann diese Zeichenkette verwenden, um die ursprünglichen Variablenwerte wieder herzustellen. Die Verwendung von serialize zum Speichern eines Objektes wird alle Variablen innerhalb eines Objektes speichern. Die Funktionen in einem Objekt werden nicht gespeichert, sondern nur der Name der Klasse.

Um ein Objekt wieder deserialisieren zu können, muss die Klasse dieses Objektes definiert werden. Das heißt, wenn Sie ein Objekt $a der Klasse A in page1.php haben und dieses serialisieren, erhalten Sie eine Zeichenkette, die sich auf die Klasse A bezieht, und alle Werte der in $a enthaltenen Variablen enthält. Wenn Sie $a der Klasse A in page2.php mittels unserialize wiederherstellen möchten, muss die Definition von Klasse A in page2.php vorhanden sein. Dies kann zum Beispiel durch das Speichern der Klassendefiniton von Klasse A in einer Include-Datei, und das Einbinden dieser Datei sowohl in page1.php und page2.php realisiert werden.

classa.inc:
  class A 
  {
      var $one = 1;
    
      function show_one()
      {
          echo $this->one;
      }
  }
  
page1.php:
  include("classa.inc");
  
  $a = new A;
  $s = serialize($a);
  // speichere $s irgendwo, wo sie page2.php finden kann.
  $fp = fopen("store", "w");
  fputs($fp, $s);
  fclose($fp);

page2.php:
  // Dies ist für das korrekte Arbeiten von unserialize nötig.
  include("classa.inc");

  $s = implode("", @file("store"));
  $a = unserialize($s);

  // Nun verwenden wir die Funktion show_one() des Objektes $a.  
  $a->show_one();

Wenn Sie mit Sessions arbeiten und session_register() verwenden, um Objekte zu registrieren, so werden diese Objekte am Ende der PHP Seite serialisiert, und in jeder folgenden Seite automatisch via unserialize wiederhergestellt. Das heißt, dass diese Objekte auf jeder Ihrer Seite auftauchen können, sobald sie Teil Ihrer Session sind.

Es wird ausdrücklich empfohlen, dass Sie die Klassendefinitionen der so registrierten Objekte in allen Ihren Seiten einbinden, auch wenn Sie diese Klassen eigentlich nicht auf allen Ihren Seiten benötigen. Tun Sie es nicht und wird ein Objekt ohne einer vorhandenen Klassendefinition deserialisiert, verliert es seine Assoziation zur Klasse, und wird zu einem Objekt der Klasse stdClass, ohne irgendwelchen Funktionen. Das bedeutet, dass es ziemlich nutzlos wird.

Würde also $a in dem obigen Beispiel mittels session_register("a") ein Teil einer Session, sollten Sie die Datei classa.inc nicht nur in page1.php und page2.php, sondern in all Ihre Seiten einbinden.


Die "magischen" Funktionen __sleep und __wakeup

serialize() prüft, ob Ihre Klasse eine Funktion mit dem magischen Namen __sleep enthält. Wenn dem so ist, wird diese Funktion vor einer Serialisierung ausgeführt. Sie kann das Objekt aufräumen und soll ein Array mit den Namen aller Variablen des zu serialisierenden Objektes zurückgeben.

Die beabsichtigte Verwendung von __sleep ist, eventuelle Datenbankverbindungen des Objektes zu schließen, noch offene Daten zu committen, oder ähnliche Säuberungsaktionen durchzuführen. Weiters ist diese Funktion hilfreich, wenn Sie sehr große Objekte haben, die nicht komplett gespeichert werden müssen.

Umgekehrt prüft unserialize() die Existenz einer Funktion mit dem magischen Namen __wakeup. Ist diese vorhanden, kann sie Ressourcen des Objektes rekonstruieren.

Die vorgesehene Verwendung von __wakeup ist die Wiederherstellung von Datenbankverbindungen, welche während der Serialisierung verloren gegangen sein könnten, sowie andere Neuinitialisierungen.


Referenzen innherhalb des Konstruktors

Referenzen innerhalb des Konstruktors können zu verwirrenden Resultaten führen. Dieser Abschnitt hilft, Probleme zu vermeiden.

class Foo
{
    function Foo($name)
    {
        // eine Referenz innerhalb des globalen Arrays  $globalref erstellen
        global $globalref;
        $globalref[] = &$this;
        // setze den Namen auf den übergebenen Wert
        $this->setName($name);
        // und gib' ihn aus
        $this->echoName();
    }

    function echoName()
    {
        echo "<br>",$this->name;
    }
	
    function setName($name)
    {
        $this->name = $name;
    }
}

Prüfen wir, ob zwischen $bar1, die mittels dem Operator zum Kopieren = erstellt wurde, und $bar2, die mittels dem Referenzoperator =& erstellt wurde, besteht...

$bar1 = new Foo('set in constructor');
$bar1->echoName();
$globalref[0]->echoName();

/* Ausgabe:
set in constructor
set in constructor
set in constructor */

$bar2 =& new Foo('set in constructor');
$bar2->echoName();
$globalref[1]->echoName();

/* Ausgabe:
set in constructor
set in constructor
set in constructor */

Scheinbar besteht kein Unterschied, aber tatsächlich existiert ein signifikanter: $bar1 und $globalref[0] sind NICHT referenziert, d.h. sie sind NICHT die selbe Variable. Das kommt daher, dass "new" nicht automatisch eine Referenz, sondern eine Kopie zurückgibt.

Anmerkung: Das zurückgeben von Kopien anstatt von Referenzen stellt keinen Performanceverlust dar (da PHP 4 und höher Reference Counting verwendet). Andererseits ist es sehr oft besser, einfach mit Kopien anstatt mit Referenzen zu arbeiten, da die Erstellung von Referenzen etwas Zeit in Anspruch nimmt, während das Erstellen von Kopien so gut wie keine Zeit braucht (sofern keine von ihnen ein großes Array oder Objekt ist, und eines davon geändert wird und das/die andere/n nachträglich. In diesem Fall wäre es besser, Referenzen zu verwenden, um sie alle gleichzeitig zu ändern).

Um das zuvor geschriebene zu beweisen, sehen wir uns den folgenden Code an.

// nun werden wir den Namen ändern. Was erwarten Sie?
// ...dass sowohl $bar1, als auch $globalref[0] ihre Namen ändern...
$bar1->setName('set from outside');

// wie bereits zuvor erwähnt, ist dies nicht der Fall
$bar1->echoName();
$globalref[0]->echoName();

/* Ausgabe:
set from outside
set in constructor */

// lassen Sie uns den Unterschied zwischen $bar2 and $globalref[1] ansehen
$bar2->setName('set from outside');

// glücklicherweise sind sie nicht nur nicht gleich, sondern auch die selbe
// Variable; demnach sind $bar2->name und $globalref[1]->name ebenfalls gleich
$bar2->echoName();
$globalref[1]->echoName();

/* Ausgabe:
set from outside
set from outside */

Ein anderes, letztes Beispiel zum Verständnis:

class A
{
    function A($i)
    {
        $this->value = $i;
        // finden Sie heraus, warum wir hier keine Referenz benötigen
        $this->b = new B($this);
    }

    function createRef()
    {
        $this->c = new B($this);
    }

    function echoValue()
    {
        echo "<br>","class ",get_class($this),': ',$this->value;
    }
}


class B
{
    function B(&$a)
    {
        $this->a = &$a;
    }

    function echoValue()
    {
        echo "<br>","class ",get_class($this),': ',$this->a->value;
    }
}

// überlegen Sie, warum hier die Verwendung einer einfachen Kopie in der
// mit * markierten Zeile zu einem unerwünschten Ergebnis führen würde
$a =& new A(10);
$a->createRef();

$a->echoValue();
$a->b->echoValue();
$a->c->echoValue();

$a->value = 11;

$a->echoValue();
$a->b->echoValue(); // *
$a->c->echoValue();

/*
Ausgabe:
class A: 10
class B: 10
class B: 10
class A: 11
class B: 11
class B: 11
*/


Kapitel 15. Referenzen in PHP

Was Referenzen sind

Referenzen sind in PHP ein Mechanismus um verschiedene Namen für den gleichen Inhalt von Variablen zu ermöglichen. Sie sind nicht mit Zeigern in C zu vergleichen, sondern Aliasdefinitionen für die Symboltabelle. PHP unterscheidet zwischen Variablenname und Variableninhalt, wobei der gleiche Variableninhalt unterschiedliche Namen besitzen kann. Der bestmögliche Vergleich ist der mit Dateinamen und Dateien im Dateisystem von Unix - Variablennamen sind Verzeichniseinträge, während der Variableninhalt die eigentliche Datei darstellt. Referenzen können nun als Hardlinks im Dateisystem verstanden werden.


Was Referenzen leisten

PHP Referenzen erlauben es, zwei Variablennamen sich auf den gleichen Variableninhalt beziehen zu lassen. Das heisst im folgenden Beispiel, dass sich $a und $b auf dieselbe Variable beziehen:

$a =& $b

Anmerkung: $a und $b sind hier gleichwertig, und $a ist nicht nur ein Zeiger auf $b oder umgekehrt, sondern $a und $b zeigen auf den selben Inhalt.

Seit PHP 4.0.4 kann & auch in Verbindung mit new verwendet werden.

$bar =& new fooclass();
$foo =& find_var ($bar);

Anmerkung: Wenn der & Operator nicht verwendet wird, erzeugt PHP eine Kopie des Objekts. Wenn nun $this innerhalb der Klasse verwendet wird, bezieht es sich auf die aktuelle Instanz der Klasse. Die Zuordnung ohne & erzeugt eine Kopie der Instanz (d.h. des Objekts) und $this wird sich auf die Kopie beziehen. In der Regel will man aus Performance- und Speicherverbrausgründen nur eine einzige Instanz einer Klasse erzeugen. Dafür stellt PHP den & bereit.

Eine weitere Einsatzmöglichkeit von Referenzen ist die Übergabe von Parametern an eine Funktion mit pass-by-reference. Hierbei beziehen sich der lokale Variablenname als auch der Variablenname der aufrufenden Instanz auf denselben Variableninhalt:

function foo (&$var) {
    $var++;
}

$a=5;
foo ($a);

Nach der Ausführung hat $a den Wert 6, da sich in der Funktion foo der Variablenname $var auf denselben Variableninhalt bezieht wie $a in der aufrufenden Instanz (hier das Hauptprogramm).

Daneben besteht die Möglichkeit aus Funktionen heraus Werte mit return by-reference zurückzugeben.


Was Referenzen nicht sind

Wie bereits gesagt: Referenzen sind keine Zeiger. Das bedeutet, der folgende Code tut nicht, was zum Beispiel ein C Programmierer erwarten würde:

function foo (&$var) {
    $var =& $GLOBALS["baz"];
}
foo($bar);

Folgendes wird passieren: $var in foo wird zunächst an $bar aus der aufrufenden Instanz, dann aber an $GLOBALS["baz"], gebunden. Es gibt keine Möglichkeit, $bar aus der aufrufenden Instanz mittels Referenz-Mechanismen an etwas anderes zu binden, da $bar in der Funktion foo nicht zur Verfügung steht ($bar wird durch $var repräsentiert; $var verfügt nur über Variableninhalt, besitzt aber keinen name-to-value Eintrag in der Symboltabelle der aufrufenden Instanz).


Referenzen zurückgeben

Das Zurückgeben von Ergebnissen per Referenz aus Funktionen heraus kann manchmal recht nüzlich sein. Hierbei ist folgende Syntax zu beachten:

function &find_var ($param) {
    ...code...
    return $found_var;
}

$foo =& find_var ($bar);
$foo->x = 2;

In diesem Beispiel wird also die Eigenschaft des von find_var gelieferten Objektes gesetzt, nicht die der Kopie, wie es der Fall wäre, wenn die Funktion find_var ihr Ergebnis nicht per Referenz liefern würde.

Anmerkung: Im Gegensatz zur Parameterübergabe per Referenz ist bei der Rückgabe mittels Referenz an beiden Stellen die Angabe des & notwendig.


Referenzen aufheben

Wird eine Referenz aufgehoben, so wird nur die Bindung zwischen einem Variablennamen und dem Variableninhalt entfernt. Der Inhalt der Variablen wird hierbei nicht gelöscht. Betrachten wir folgendes Beispiel:

$a = 1;
$b =& $a;
unset ($a);

Die Variable $b wird nicht gelöscht, sondern es wird nur die Bindung des Variablennamen $a an den Variableninhalt aufgehoben. Dieser Variableninhalt ist immer noch über $b verfügbar.

Wiederum sieht man die Analogie zwischen Unix und den Referenzen: Das Aufheben einer Referenz entspricht einem Aufruf von unlink unter Unix.


Referenzen entdecken

Viele Sprachelemente von PHP sind intern mit der Benutzung von Referenzen implementiert, daher gilt alles bisher gesagte auch für diese Konstrukte:


global References

Die Verwendung von global $var erzeugt im aktuellen Scope eine Referenz auf die globale Variable $var, sie ist also äquivalent zu folgendem:

$var =& $GLOBALS["var"];

Dies hat zur Folge, dass das Anwenden von unset() auf $var keinen Einfluss auf die globale Variable hat.


$this

In einer Objektmethode ist $this immer eine Referenz auf die aufrufende Objektinstanz.


Kapitel 16. HTTP-Authentifizierung mit PHP

Die HTTP-Authentifizierung durch PHP ist nur verfügbar, wenn PHP als Apache-Modul läuft und funktioniert daher nicht mit der CGI-Version. In einem PHP-Skript für ein Apache-Modul kann man die Funktion header() benutzen, um die Nachricht "Authentifizierung notwendig" an den Client-Browser zu senden, damit dieser ein Fenster zur Eingabe von Benutzername/Passwort öffnet. Hat der Benutzer diese eingegeben, wird die URL des PHP-Scripts mit den Variablen $PHP_AUTH_USER, $PHP_AUTH_PW und $PHP_AUTH_TYPE, die den jeweiligen Benutzernamen, das Passwort und den Typ der Identifizierung enthalten, erneut aufgerufen. Momentan wird nur das Authentifizierungsmodell "basic" unterstützt. Näheres hierzu bei der header() Funktion.

Ein Auszug aus einem Skript, das die Clientauthentifizierung auf einer Seite erzwingt, würde so aussehen:

Beispiel 16-1. HTTP-Authentifizierung

<?php
  if(!isset($PHP_AUTH_USER)) {
    Header("WWW-Authenticate: Basic realm=\"My Realm\"");
    Header("HTTP/1.0 401 Unauthorized");
    echo "Text to send if user hits Cancel button\n";
    exit;
  } else {
    echo "Hello $PHP_AUTH_USER.<P>";
    echo "You entered $PHP_AUTH_PW as your password.<P>";
  }
?>

Hinweis: Achten Sie bei den Header-Zeilen für maximale Kompatibilität auf die richtige Schreibweise! Das Schlüsselwort "Basic" sollte genau so geschrieben werden, der Realm-String muss in doppelte (nicht einfache) Anführungszeichen eingeschlossen sein, und in der "HTTP/1.0 401"-Zeile darf nur genau ein Leerzeichen vor dem 401-Code stehen.

Anstatt $PHP_AUTH_USER und $PHP_AUTH_PW einfach nur auszugeben, werden Sie den Benutzernamen und das Passwort auf Gültigkeit überprüfen wollen. Dies kann durch die Abfrage einer Datenbank oder das Einlesen einer Textdatei geschehen.

Vorsicht bei einigen Internet Explorer-Versionen - sie scheinen sehr wählerisch zu sein, was die Reihenfolge der Header angeht. Abhilfe schafft hier das Senden des WWW-Authenticate Headers vor dem HTTP/1.0 401.

Um zu unterbinden, dass ein Skript das Passwort einer durch einen traditionellen externen Mechanismus geschützten Seite ausliest, werden die PHP_AUTH Variablen nicht gesetzt, wenn eine externe Authentifizierung für diese bestimmte Seite aktiviert ist. In diesem Fall kann die $REMOTE_USER Variable benutzt werden, um den Benutzer durch die externe Zugriffskontrolle zu identifizieren.

Konfigurationshinweis: PHP prüft das Vorhandensein einer AuthType Apache-Direktive, um zu entscheiden, ob eine externe Authentifizierung aktiv ist. Vermeiden Sie deshalb diese Konfigurationsdirektive im Kontext der PHP-Authentifizierung (anderenfalls wird jeder Authentifizierungsversuch misslingen).

Zu beachten ist, dass obenstehendes keinesfalls jemanden, der die Kontrolle über eine nichtgeschützte URL hat, davon abhalten kann, Passwörter von geschützten URLs auf dem gleichen Rechner auszulesen.

Sowohl Netscape als auch der Internet Explorer löschen den lokalen Authentifizierungscache des Browserfensters, wenn der Server eine 401-Meldung zurückgibt. Dies kann benutzt werden, um einen Benutzer "auszuloggen" und eine erneute Eingabe des Benutzernamens/Passworts zu erzwingen. Manchmal wird dieses Verhalten für das automatische Ausloggen nach Ablauf einer bestimmten Zeitspanne oder für einen Logout-Button genutzt.

Beispiel 16-2. HTTP-Authentifizierung, mit erneuter Anforderung von Name/Passwort

<?php
  function authenticate() {
   Header( "WWW-Authenticate: Basic realm=\"Test Authentication System\"");
   Header( "HTTP/1.0 401 Unauthorized");
   echo "You must enter a valid login ID and password to access this resource\n";
   exit;
  }

  if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) {
   authenticate();
  } 
  else {
   echo "Welcome: $PHP_AUTH_USER<BR>";
   echo "Old: $OldAuth";
   echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
   echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n";
   echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n";
   echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n";
   echo "</FORM>\n";
  }
?>

Dieses Verhalten wird vom Authentifizierungsstandard HTTP Basic nicht gefordert, daher sollte man sich nie darauf verlassen. Tests mit Lynx haben gezeigt, dass Lynx die Authentifizierungsinformationen bei Erhalt einer 401-Meldung nicht löscht. Ein Klick auf den Zurück- Button und danach auf Vorwärts wird die angeforderte Adresse öffnen (und zwar so lange, bis die Identifizierung der Benutzer geändert wird).

Weiterhin muss beachtet werden, dass dies unter dem Microsoft IIS mit der CGI-Version von PHP aufgrund einer Einschränkung des IIS nicht funktioniert.


Kapitel 17. Cookies

PHP unterstützt HTTP-Cookies. Hierbei handelt es sich um einen Mechanismus, um Informationen beim Client zu speichern und somit wiederkehrende Besucher zu identifizieren oder ihren Weg innerhalb des Angebotes nachzuvollziehen. Cookies können durch die Funktion setcookie() gesetzt werden. Sie sind Bestandteil des HTTP-Headers, was bedeutet, dass die Funktion setcookie() aufgerufen werden muss, bevor irgendeine Ausgabe an den Browser erfolgt. Dies ist die gleiche Einschränkung, der auch die Funktion header() unterliegt. Sie können die Funktionen zur Ausgabesteuerung benutzen, um die Ausgaben des Skriptes zu verzögern, bis entschieden ist, ob Cookies gesetzt bzw. Header gesendet werden sollen oder nicht.

Vom Client gesendete Cookies werden - abhängig von den Konfigurationsvariablen register_globals und variables_order - automatisch in eine Variable geschrieben, wie es auch bei mittels GET oder POST gesendeten Daten geschieht. Sollen einem Cookie mehrere Werte zugewiesen werden, so muss dem Cookienamen lediglich [] angefügt werden.

Seit PHP 4.1.0 werden alle vom Client gesendeten Cookies in dem auto-globalen Array $_COOKIE gespeichert. In älteren PHP-Versionen stehen diese Daten in $HTTP_COOKIE_VARS gespeichert, sofern die Konfigurationsvariable track_vars gesetzt ist.

Weitere Informationen sowie Anmerkungen zu Browser-Bugs finden Sie im Abschnitt setcookie().


Kapitel 18. Steuerung von Dateiuploads

Dateiuploads mit POST

PHP kann Dateiuploads mit jedem RFC-1867 konformen Browser (dazu gehören der Netscape Navigator 3 oder höher, Microsoft Internet Explorer 3 mit einem Patch von Microsoft oder höher ohne Patch) durchführen. Es können sowohl Text- als auch Binärdaten hochgeladen werden. Mit PHP´s Authentifizierungs- und Dateifunktionen besteht volle Kontrolle darüber, wer Dateien hochladen darf und was mit den Dateien geschehen soll, wenn der Upload beendet ist.

Diesbezügliche Konfigurationshinweise: Siehe auch die Anweisungen file_uploads, upload_max_filesize, upload_tmp_dir und post_max_size in der php.ini

PHP unterstützt auch Dateiuploads nach der PUT-Methode, die beispielsweise vom Netscape Composer und den W3C Amaya Clients benutzt wird. Siehe dazu PUT-Unterstützung für nähere Informationen.

Eine Maske für den Dateiupload kann erstellt werden, indem man ein Formular entwirft, das ungefähr so aussieht:

Beispiel 18-1. Formular für den Dateiupload

<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>
Die _URL_ sollte auf eine PHP-Datei verweisen. Das versteckte Feld MAX_FILE_SIZE muss dem Dateieingabefeld vorangestellt werden und den Wert der maximal akzeptierten Dateigröße in Bytes enthalten.

Warnung

Die maximale Dateigröße MAX_FILE_SIZE ist für den Browser nur ein Hinweis und es ist leicht, diese Grenze zu umgehen. Also verlassen Sie sich nicht darauf, dass der Browser Ihrem Wunsch auch nachkommt! Wie auch immer, die PHP-Einstellungen für die maximale Dateigröße können nicht getäuscht werden.

Die für hochgeladene Dateien definierten Variablen sind je nach PHP Version und Konfiguration verschieden. Die Autoglobale $_FILES existiert seit PHP 4.1.0 und das Array $HTTP_POST_FILES seit PHP 4.0.0. Diese Arrays enthalten alle Informationen über Ihre hochgeladenen Dateien. Die Verwendung von $_FILES wird bevorzugt. Ist die PHP Anweisung register_globals auf on, stehen auch entsprechende Variablennamen zur Verfügung. Seit PHP 4.2.0 steht register_globals standardmäßig auf off.

Im Folgenden sind die Inhalte von $_FILES aus unserem Beispielskript aufgelistet. Beachten Sie, dass dies auf der Annahme basiert, dass der Name des Dateiuploads wie in dem obigen Beispielskript userfile ist.

$_FILES['userfile']['name']

Der ursprüngliche Dateiname auf der Client Maschine.

$_FILES['userfile']['type']

Der Mime-Type der Datei, falls der Browser diese Information zur Verfügung gestellt hat. Ein Beispiel wäre "image/gif".

$_FILES['userfile']['size']

Die Größe der hochgeladenen Datei in Bytes.

$_FILES['userfile']['tmp_name']

Der temporäre Dateiname, unter dem die hochgeladene Datei auf dem Server gespeichert wurde.

$_FILES['userfile']['error']

Der Fehlercode im Zusammenhang mit dem hochladen der Datei. ['error'] wurde in PHP 4.2.0 eingeführt.

Anmerkung: In den Versionen vor PHP 4.1.0 war dies $HTTP_POST_FILES, und ist keine 'Autoglobale' Variable wie $_FILES. PHP 3 unterstützt $HTTP_POST_FILES nicht.

Ist register_globals in der php.ini aktiviert, stehen zusätzliche Variablen zur Verfügung. Zum Beispiel entspricht $userfile_name $_FILES['userfile']['name'], $userfile_type entspricht $_FILES['userfile']['type'], etc. Beachten Sie, dass register_globals standardmäßig deaktiviert ist, jedoch wird empfohlen, sich nicht darauf zu verlassen.

Standardmäßig werden Dateien in dem vorgegebenen temporären Verzeichnis des Servers gespeichert, außer es wurde mittels upload_tmp_dir in der php.ini ein anderer Ort konfiguriert. Das Standardverzeichnis des Servers kann durch das Setzen der Umgebungsvariablen TMPDIR in der Umgebung, in der PHP ausgeführt wird, geändert werden. Das Setzen mittels der Funktion putenv() innerhalb eines Skriptes ist nicht möglich. Mittels dieser Umgebungsvariable kann auch sichergestellt werden, dass auch andere Operationen an hochgeladenen Dateien arbeiten können.

Beispiel 18-2. Dateiuploads prüfen

Weitere Informationen finden Sie auch in den Beschreibungen für is_uploaded_file() und move_uploaded_file(). Das folgende Beispiel verarbeitet einen von einem HTML-Formular kommenden Dateiupload.

<?php 
// In PHP kleiner als 4.1.0 sollten Sie $HTTP_POST_FILES anstatt $_FILES verwenden.
// In PHP kleiner als 4.0.3 verwenden Sie copy() und is_uploaded_file() anstatt von
// move_uploaded_file()

$uploaddir = '/var/www/uploads/';

print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
    print "File is valid, and was successfully uploaded.  Here's some more debugging info:\n";
    print_r($_FILES);
} else {
    print "Possible file upload attack!  Here's some debugging info:\n";
    print_r($_FILES);
}

?>

Das die hochgeladene Datei empfangende Skript sollte die notwendige Logik zur Entscheidung enthalten, was mit der hochgeladenen Datei geschehen soll. Sie können zum Beispiel $_FILES['userfile']['size'] benutzen, um zu kleine bzw. zu große Dateien wegzuwerfen. Sie können $_FILES['userfile']['type'] nutzen, um Dateien eines unerwünschten Typs wegzuwerfen. Seit PHP 4.2.0 können Sie Ihre Logik auch mittels $_FILES['userfile']['error'] anhand der Fehlercodes planen. Egal welche Logik Sie verwenden, Sie sollten die Datei in dem temporären Verzeichnis entweder löschen, oder an einen anderen Ort verschieben.

Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder umbenannt, wird sie am Ende des Requests gelöscht.


Fehlermeldungen erklärt

Seit PHP 4.2.0 gibt PHP zusammen mit dem Datei-Array entsprechende Fehlermeldungen. Die Fehlermeldung befindet sich im Segment ['error'] des Datei-Arrays, welches während des Hochladens der Datei erstellt wird. In anderen Worten kann der Fehler in $_FILES['userfile']['error'] gefunden werden.

UPLOAD_ERR_OK

Wert: 0; Es liegt kein Fehler vor, die Datei wurde erfolgreich hochgeladen.

UPLOAD_ERR_INI_SIZE

Wert: 1; Die hochgeladene Datei überschreitet die in der Anweisung upload_max_filesize in php.ini festgelegte Größe.

UPLOAD_ERR_FORM_SIZE

Wert: 2; Die hochgeladene Datei überschreitet die in dem HTML Formular mittels der Anweisung MAX_FILE_SIZE angegebene maximale Dateigröße.

UPLOAD_ERR_PARTIAL

Wert: 3; Die Datei wurde nur teilweise hochgeladen.

UPLOAD_ERR_NO_FILE

Wert: 4; Es wurde keine Datei hochgeladen.

Anmerkung: Dies wurden Konstanten in PHP 4.3.0.


Häufige Probleme

Der mit MAX_FILE_SIZE eingestellte Wert kann nicht größer sein als der des ini-Parameters upload_max_filesize. Der Standardwert ist 2 Megabyte.

Ist memory limit aktiviert, könnte eine Erhöhung von memory_limit nötig sein. Stellen Sie sicher, dass der Wert von memory_limit groß genug ist.

Wenn max_execution_time zu kurz konfiguriert ist, könnte das Skript den Wert überschritten haben. Stellen Sie sicher, dass der Wert von max_execution_time groß genug ist.

Ist post_max_size zu klein konfiguriert, können große Dateien nicht hochgeladen werden. Stellen Sie sicher, dass der Wert von post_max_size groß genug ist.

Nicht zu prüfen an welcher Datei Sie arbeiten kann bedeuten, dass Benutzer auf sensible Informationen in anderen Verzeichnissen Zugriff erhalten.

Beachten Sie, dass CERN httpd in dem vom Client erhaltenen Content-Type Mime Header alles nach dem ersten Whitespace wegzuschneiden scheint. Solange dies der Fall ist, unterstützt CERN httpd keine Dateiuploads.

Aufgrund der vielen möglichen Arten der Darstellung von Verzeichnissen können wir nicht garantieren, dass Dateien mit exotischen Namen (wie z.B. mit enthaltenen Leerzeichen) auch wirklich richtig verarbeitet werden.


Upload mehrerer Dateien

Mehrere Dateien können hochgeladen werden, indem Sie verschiedene Namen name für input verwenden.

Es ist ebenfalls möglich, mehrere Dateien simultan hochzuladen, und die Informationen automatisch in Arrays zu erhalten. Um dies zu tun, verwenden Sie in dem HTML Formular die gleiche Array-Sende-Syntax wie bei Auswahllisten mit Mehrfachauswahl und Checkboxen:

Anmerkung: Die Unterstützung für den Upload von mehreren Dateien wurde in PHP 3.0.10 hinzugefügt.

Beispiel 18-3. Upload mehrerer Dateien

<form action="file-upload.php" method="post" enctype="multipart/form-data">
  Send these files:<br>
  <input name="userfile[]" type="file"><br>
  <input name="userfile[]" type="file"><br>
  <input type="submit" value="Send files">
</form>

Wenn das obige Formular übermittelt ist, werden die Arrays $_FILES['userfile'], $_FILES['userfile']['name'] und $_FILES['userfile']['size'] initialisiert (wie auch in $HTTP_POST_FILES vor PHP Version 4.1.0.). Ist register_globals aktiviert, werden auch globale Variablen für die hochgeladenen Dateien initialisiert. Jedes von ihnen ist ein numerisch indiziertes Array mit den entsprechenden Werten für die hochgeladenen Dateien.

Nehmen wir zum Beispiel an, dass die Dateinamen /home/test/review.html und /home/test/xwp.out übermittelt wurden. In diesem Fall würde $_FILES['userfile']['name'][0] review.html enthalten, und $_FILES['userfile']['name'][1] hätte den Wert xwp.out. Genauso würde $_FILES['userfile']['size'][0] die Dateigröße von review.html enthalten, usw.

$_FILES['userfile']['name'][0], $_FILES['userfile']['tmp_name'][0], $_FILES['userfile']['size'][0] und $_FILES['userfile']['type'][0] sind ebenfalls gesetzt.


PUT-Unterstützung

Die Unterstützung der PUT-Methode hat sich zwischen PHP 3 und PHP 4 geändert. In PHP 4 sollten Sie den standard Input-Datenstrom benutzen, um die Inhalte eines HTTP PUT zu lesen.

Beispiel 18-4. Speicher von HTTP PUT Dateien mit PHP 4

<?php
/* PUT Daten kommen in den stdin Stream */
$putdata = fopen("php://stdin","r");

/* Eine Datei zum Schreiben öffnen */
$fp = fopen("myputfile.ext","w");

/* Jeweils 1kB Daten lesen und
   in die Datei schreiben */
while ($data = fread($putdata,1024))
  fwrite($fp,$data);

/* Die Streams schließen */
fclose($fp);
fclose($putdata);
?>

Anmerkung: Sämtliche untenstehende Dokumentation betrifft nur PHP 3.

PHP unterstützt die HTTP PUT-Methode, wie sie von Clients wie Netscape Composer oder W3C Amaya benutzt wird. PUT-Anfragen sind weitaus unkomplizierter als ein Dateiupload und sehen etwa so aus:

PUT /path/filename.html HTTP/1.1

Das würde normalerweise bedeuten, dass der entfernte Client den folgenden Inhalt als /path/filename.html im Webverzeichnisbaum speichert. Natürlich ist es keine gute Idee, dass PHP oder Apache jeden Benutzer beliebige Dateien überschreiben lassen. Um eine solche Anfrage bearbeiten zu können, muss der Webserver erst angewiesen werden, ein bestimmtes PHP-Skript für die Abarbeitung aufzurufen. Im Apache wird dies durch die Script - Direktive festgelegt. Sie kann fast überall in der Apache-Konfigurationsdatei platziert werden, gebräuchlich ist die Platzierung innerhalb einer <Directory>- oder <Virtualhost>- Sektion. Eine Zeile wie die folgende erledigt dies:

Script PUT /put.php

Diese Zeile legt fest, dass Apache alle PUT-Anfragen für URIs, die dem Kontext entsprechen, in dem diese Zeile steht, an das put.php Skript weiterleitet. Dies setzt natürlich voraus, dass PHP aktiv und für die .php-Dateierweiterung registriert ist.

Innerhalb der put.php-Datei könnte folgendes stehen:

<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>

Dies kopiert die Datei an den vom Client angegebenen Ort. Möglicherweise sollen vor dem Kopieren der Datei noch Überprüfungen und/oder Benutzerauthentifizierung stattfinden. Wenn PHP eine PUT-Anfrage erhält, wird die Datei genau wie bei der POST-Methode in einem temporären Verzeichnis gespeichert. Nach dem Abarbeiten der Anfrage wird die temporäre Datei gelöscht. Also muss das PHP-Skript, das die PUT-Anfrage bearbeitet, die Datei irgendwohin kopieren. Der Name der temporären Datei findet sich in der Variablen $PHP_PUT_FILENAME; der Name der zu speichernden Datei steht in $REQUEST_URI (kann bei Nicht-Apache Webservern variieren). Dieser Zieldateiname wird vom Client festgelegt. Man kann den Client auch umgehen; beispielsweise könnten alle hochgeladenen Dateien in ein spezielles Upload-Directory kopiert werden.


Kapitel 19. Zugriff auf entfernte Dateien

Wenn die Unterstützung für den "URL fopen wrapper" bei der Konfiguration von PHP vorhanden ist (welche standardmäßig eingestellt ist, es sei denn, die Option --disable-url-fopen-wrapper wurde bei der Installation verwendet (Versionen bis 4.0.3) oder der Parameter allow_url_fopen in der php.ini deaktiviert wurde (neuere Versionen), können HTTP und FTP URLs bei den meisten Funktionen verwendet werden, die einen Dateinamen als Parameter benötigen, inklusive require() und include() Anweisungen.

Anmerkung: remote files funktionieren nicht mit include() und require() Anweisungen unter Windows.

Beispielsweise kann eine Datei auf einem anderen Webserver geöffnet und verarbeitet werden. Diese Daten können zur Abfrage einer Datenbank benutzt werden oder passend zum Rest der eigenen Website ausgegeben werden.

Beispiel 19-1. Den Titel einer entfernten Seite auslesen

<?php
$file = fopen ("http://www.example.com/", "r");
if (!$file) {
    echo "<p>Datei konnte nicht geöffnet werden.\n";
    exit;
}
while (!feof ($file)) {
    $line = fgets ($file, 1024);
    /* Funktioniert nur, wenn Titel und title-Tags in einer Zeile stehen */
    if (eregi ("<title>(.*)</title>", $line, $out)) {
        $title = $out[1];
        break;
    }
}
fclose($file);
?>

Auch eine Datei auf einem FTP-Server kann geschrieben werden, solange man sich über einen Benutzer mit entsprechenden Zugriffsrechten verbindet und die Datei noch nicht existiert. Um sich mit einem anderen Benutzer als 'anonymous' zu verbinden muß ein username (und möglichst ein Passwort) innerhalb der URL angegeben werden, wie z.B. 'ftp://user:password@ftp.example.com/pfad/zur/datei'. (Die selbe Syntax kann verwendet werden, um auf Daten via HTTP zuzugreifen, wenn diese eine Basic Authentication benötigen.)

Beispiel 19-2. Daten auf einen entfernten Server speichern

<?php
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w");
if (!$file) {
    echo "<p>Datei konnte zum schreiben nicht geöffnet werden.\n";
    exit;
}
/* Schreibe die Daten hier hin. */
fputs ($file, "$HTTP_USER_AGENT\n");
fclose ($file);
?>

Anmerkung: Obiges Beispiel könnte dazu verleiten, dieses Verfahren zu benutzen, um in ein 'remote log-file' zu schreiben. Wie oben erwähnt kann man jedoch ausschließlich neue Dateien anlegen, wenn man URL fopen() wrapper benutzt. Für 'distributed logging' sollte man sich die Funktion syslog() anschauen.


Kapitel 20. Verbindungssteuerung

Anmerkung: Folgendes trifft auf die Versionen 3.0.7 und später zu.

PHP erhält intern einen Verbindungsstatus. Dieser kann drei Zustände annehmen:

  • 0 - NORMAL

  • 1 - ABORTED

  • 2 - TIMEOUT

Wenn ein PHP-Skript aktiv ist, ist der Status üblicherweise NORMAL. Sollte der Client-Rechner die Verbindung beenden, wird der Status auf ABORTED gesetzt. Ein clientseitiges Beenden der Verbindung wird für gewöhnlich veranlaßt, wenn der Benutzer den STOP-Button seines Browsers drückt. Wenn das eingestellte Zeitlimit (siehe set_time_limit()) überschritten wird, wird der Status TIMEOUT gesetzt.

Sie können entscheiden, ob der Verbindungsabbruch seitens des Clients den Abbruch des Skriptes zur Folge haben soll. Manchmal ist es sinnvoll, Skripte sauber zu beenden, auch wenn kein Browser mehr zur Verfügung steht, der die Ausgabe empfängt. Die Abarbeitung eines Skriptes wird standardmäßig abgebrochen, wenn der Client die Verbindung beendet. Dieses Verhalten kann sowohl durch die Option ignore_user_abort in der Konfigurationsdatei php3.ini, durch die entsprechende Option php3_ignore_user_abort in der Apache-Konfigurationsdatei als auch durch ignore_user_abort() beeinflußt werden. Wenn PHP nicht angewiesen wird, einen Verbindungsabbruch durch den Benutzer zu ignorieren und die Verbindung dann durch den Benutzer beendet wird, wird die Abarbeitung des Scriptes abgebrochen. Die einzige Ausnahme ist, wenn durch die Funktion register_shutdown_function() eine Shutdown-Funktion angegeben wird, die bei clientseitigem Abbruch ausgeführt wird. Wenn dann der Benutzer den STOP-Button seines Browsers drückt, wird PHP bei der nächsten Ausgabe des Skriptes feststellen, dass die Verbindung abgebrochen wurde und die Shutdown-Funktion aufrufen. Diese Shutdown-Funktion wird auch aufgerufen, wenn das Skript auf normalem Wege beendet wird, daher sollte man, wenn man für den Fall eines Benutzerabbruchs etwas anderes vorgesehen hat, die Funktion connection_aborted() verwenden. Sie gibt TRUE zurück, wenn die Verbindung abgebrochen wurde.

Ein Skript kann ebenfalls durch den eingebauten Script-Timer beendet werden. Der Standard-Timeout beträgt 30 Sekunden. Er kann durch die Option max_execution_time in der php3.ini, durch den entsprechenden Eintrag php3_max_execution_time in der Apache-Konfigurationsdatei oder durch die Funktion set_time_limit() beeinflußt werden. Bei Zeitüberschreitung wird das Skript beendet und, genau wie im obigen Fall des Verbindungsabbruchs, eine registrierte Shutdown-Funktion ausgeführt. Um zu überprüfen, ob es sich um einen Abbruch aufgrund von Zeitüberschreitung handelt, kann die Funktion connection_timeout() benutzt werden. Sie gibt TRUE zurück, wenn es sich um eine Zeitüberschreitung handelt.

Zu bemerken ist, dass der ABORTED und der TIMEOUT-Status gleichzeitig auftreten können. Dies ist möglich, wenn PHP angewiesen wird, Benutzerabbrüche zu ignorieren. PHP wird feststellen, dass der Benutzer die Verbindung abgebrochen hat, das Skript allerdings läuft weiter. Sollte es dann das Zeitlimit erreichen, wird es abgebrochen und eine Shutdown-Funktion, wenn definiert, wird aufgerufen. Zu diesem Zeitpunkt kann man feststellen, dass connection_timeout() und connection_aborted() TRUE zurückgeben. Diese beiden Statusmöglichkeiten können auch durch einen Aufruf der Funktion connection_status() abgefragt werden. Sie liefert ein Bitfeld des aktiven Status. Wenn beispielsweise TIMEOUT und ABORTED aktiv sind, wird 3 zurückgegeben.


Kapitel 21. Persistente Datenbankverbindungen

Persistente Verbindungen sind SQL-Verbindungen, die nach Abarbeitung des Skriptes nicht geschlossen werden. Wenn eine persistente Verbindung angefordert wird, prüft PHP zuerst, ob bereits eine identische persistente Verbindung (die vielleicht vorher offen geblieben ist) existiert und benutzt sie in diesem Fall. Sollte keine Verbindung existieren, wird eine hergestellt. Eine 'identische' Verbindung ist eine Verbindung, die zu dem gleichen Host mit dem gleichen Usernamen und Passwort hergestellt wurde.

Anmerkung: Auch andere Erweiterungen bieten persistente Verbindungen, wie z.B. IMAP extension.

Wer nicht durchgängig mit der Art und Weise vertraut ist, wie Webserver arbeiten und die Last verteilen, könnte missverstehen, wofür persistente Verbindungen gedacht sind. Im Besonderen bieten sie keine Möglichkeit, 'Benutzersitzungen' über die gleiche SQL-Verbindung zu öffnen und keine Möglichkeit, eine Transaktion effizient aufzubauen, und sie können auch viele andere Dinge nicht. Um absolute Klarheit zu schaffen: Persistente Verbindungen bieten keine Funktionalität, die nicht auch von nicht-persistenten Verbindungen bereitgestellt wird.

Warum?

Das hat mit der Arbeitsweise von Webservern zu tun. Es gibt drei Möglichkeiten, wie ein Webserver PHP zur Generierung von Webseiten einsetzen kann.

Die erste Methode ist, PHP als CGI-'Wrapper' zu benutzen. Wenn diese Methode eingesetzt wird, wird für jede Anfrage nach einer PHP-Seite vom Webserver eine Instanz des PHP- Interpreters gestartet und anschließend wieder beendet. Durch die Beendigung des Interpreters nach abgeschlossener Anfrage werden alle Ressourcen, auf die zugegriffen wurde (wie beispielsweise eine Verbindung zu einem SQL- Datenbankserver) wieder geschlossen. In diesem Fall erreicht man nichts, wenn man persistente Verbindungen benutzt - sie sind eben nicht beständig.

Die zweite und populärste Methode ist der Einsatz von PHP als Modul in einem Multiprozess-Webserver, was momentan nur auf den Apache zutrifft. Typischerweise hat ein Multiprozess-Webserver einen Prozess (den 'Eltern' Prozess), der einen Satz weiterer Prozesse (die 'Kinder') koordiniert, welche die eigentliche Arbeit des Bereitstellens der Seiten übernehmen. Jede Anfrage, die von einem Client erfolgt, wird an einen untergeordneten Prozess, der noch keine andere Anfrage bearbeitet, weitergereicht. Das bedeutet, dass eine zweite Anfrage des gleichen Clients an den Server unter Umständen von einem anderen untergeordneten Prozess als die erste Anfrage bearbeitet wird. In diesem Fall sorgt eine persistente Verbindung dafür, dass jeder untergeordnete Prozess sich nur einmal mit dem SQL-Server verbinden muss, wenn eine solche benötigt wird. Benötigt dann eine weitere Seite die Verbindung mit dem SQL-Server, kann auf die zurückgegriffen werden, die der untergeordnete Prozess vorher hergestellt hat.

Die letzte Methode ist, PHP als Plug-in für einen Multithread- Webserver zu benutzen. Derzeit bietet PHP 4 Unterstützung für ISAPI, WSAPI und NSAPI (unter Windows), wodurch die Nutzung von PHP mit Multithread-Serven wie Netscape Fast Track (iPlanet), Microsoft Internet Information Server (IIS) und O'Reilly's WebSite Pro ermöglicht wird. Das Verhalten entspricht im wesentlichen dem oben beschriebenen Multiprozess-Modell. Beachten Sie, dass PHP 3 keine Unterstützung für SAPI bietet.

Wozu dienen persistente Verbindungen, wenn sie keine zusätzliche Funktionalität bieten?

Die Antwort ist außerordentlich einfach: Effizienz. Persistente Verbindungen sind nützlich, wenn der Aufwand für das Herstellen einer Verbindung zu einem SQL-Server hoch ist. Ob dies der Fall ist oder nicht, hängt von vielen Faktoren ab - zum Beispiel, um welche Datenbank es sich handelt, ob sie auf dem gleichen Rechner wie der Webserver läuft oder welche Last die SQL-Maschine zu bewältigen hat usw. Grundsätzlich gilt, dass, wenn viele Verbindungen hergestellt werden müssen, persistente Verbindungen außerordentlich hilfreich sind. Sie veranlassen den untergeordneten Prozess, sich während seiner gesamten Lebensdauer lediglich einmal mit dem SQL-Server zu verbinden, anstatt bei jedem Aufruf einer Seite, die eine Verbindung benötigt. Das heißt, dass jeder untergeordnete Prozess, der eine persistente Verbindung öffnet, seine eigene dauerhafte Verbindung zum Server hat. Bei 20 untergeordneten Prozessen, die ein Skript ausführen, das eine persistente Verbindung zum SQL-Server herstellt, hat man beispielsweise 20 verschiedene Verbindungen zum SQL-Server - eine für jeden untergeordneten Prozess.

Beachten Sie jedoch, dass dies auch ein paar Nachteile haben kann, wenn Sie eine Datenbank mit limitierten Verbindungen benutzen, welche durch persistente Verbindungen überschritten werden. Wenn Ihre Datenbank ein Limit von 16 gleichzeitigen Verbindungen hat, und aufgrund einer stark ausgelasteten Server-Session 17 Kind-Prozesse versuchen, eine Verbindung herzustellen, wird es einem nicht gelingen. Sollten in Ihren Skripten Fehler bestehen, welche das Schließen der Verbindungen nicht erlauben (wie z.B. Endlosschleifen), kann das eine Datenbank mit mit nur 16 Verbindungen sehr schnell überschwemmen. Konsultieren Sie die Dokumentation Ihrer Datenbank bezüglich der Behandlung von aufgegebenen Verbindungen oder Verbindungen im Leerlauf.

Warnung

Sie sollten sich zur Vorsicht noch ein paar Gedanken machen, wenn Sie persistente Verbindungen benutzen. Einer ist, wenn Sie über eine persistente Verbindung Tabellen sperren und das Skript diese Sperre aus welchem Grund auch immer nicht mehr aufheben kann, nachfolgende Skripte, welche die selbe Verbindung benutzen, blockieren und den Neustart von entweder dem Webserver oder dem Datenbankserver verlangen. Ein weiterer ist, dass wenn Sie Transaktionen benutzen, ein Transaktionsblock zu dem nächsten die Verbindung nutzenden Skript übertragen wird, wenn die Ausführung des Skriptes vor dem Transaktionsblock gestoppt wird. In jedem Fall können Sie register_shutdown_function() benutzen, um eine einfache Funktion zu registrieren, welche Ihre Tabellen wieder entsperrt, oder Ihre Transaktionen zurückstellt. Besser ist es, wenn Sie dieses Problem gänzlich vermeiden, indem keine persistenten Verbindungen in Skripten benutzen, welche Tabellen sperren oder Transaktionen verwenden (Sie können sie immer noch anderswo benutzen).

Eine wichtige Zusammenfassung. Persistente Verbindungen wurden entwickelt, um eins-zu-eins Abbildungen auf reguläre Verbindungen zu haben. Das heißt, dass man immer in der Lage sein sollte, die persistenten Verbindungen durch nicht-persistente zu ersetzten, ohne dass dies den Skriptablauf verändert. Es kann (und wird vermutlich auch) die Effizienz des Skriptes beeinflussen, aber nicht dessen Verhalten.

Siehe auch fbsql_pconnect(), ibase_pconnect(), ifx_pconnect(), imap_popen(), ingres_pconnect(), msql_pconnect(), mssql_pconnect(), mysql_pconnect(), ociplogon(), odbc_pconnect(), ora_plogon(), pfsockopen(), pg_pconnect() und sybase_pconnect().


Kapitel 22. Safe Mode

Safe Mode ist der Versuch, Sicherheitsprobleme bei gemeinsam genutzten Servern zu lösen. Bezogen auf die Systemarchitektur, ist es der falsche Ansatz, diese Probleme innerhalb der PHP Schicht lösen zu wollen. Da es auf Ebene des Webservers bzw. des Betriebssystems keine praktischen Alternativen gibt, wird Safe Mode nunmehr von vielen Leuten, vor allem von Providern, eingesetzt.

Es existieren folgende Direktiven um Safe Mode zu konfigurieren:
safe_mode = Off 
safe_mode_gid = 0
safe_mode_include_dir = 
safe_mode_exec_dir = 
open_basedir = 
safe_mode_allowed_env_vars = PHP_ 
safe_mode_protected_env_vars = LD_LIBRARY_PATH 
disable_functions =

Wenn safe_mode aktiviert ist, überprüft PHP, ob der Eigentümer des laufenden Skriptes dem Eigentümer der Datei entspricht, an der mit Hilfe der Dateifunktionen gearbeitet werden soll. Beispiel:
-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php 
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd
Bei der Ausführung dieses Skriptes
<?php
 readfile('/etc/passwd'); 
?>
erscheint bei aktiviertem Safe Mode folgende Warnung:
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not 
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

Wenn anstelle von safe_mode ein open_basedir Verzeichnis angegeben wurde, können Dateioperationen nur noch unterhalb dieses Verzeichnisses vorgenommen werden. Beispiel (Apache httpd.conf):
<Directory /docroot>
php_admin_value open_basedir /docroot 
</Directory>
Wenn das Skript script.php mit der open_basedir Einstellung ausgeführt wird, erscheint folgende Warnung:
Warning: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Darüberhinaus können einzelne Funktionen deaktiviert werden. Würde man folgenden Eintrag in der php.ini vornehmen:
disable_functions readfile,system
Würde diese Warnung erscheinen:
Warning: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2


Funktionen, die durch Safe Mode deaktiviert oder eingeschränkt werden

Dies ist eine Auflistung der Funktionen, die durch Safe Mode eingeschränkt werden. Diese Liste ist möglicherweise unvollständig und fehlerhaft!

Tabelle 22-1. Durch Safe Mode eingeschränkte Funktionen

FunktionEinschränkungen
dbmopen()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
dbase_open()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro_rowcount()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
filepro_retrieve()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
ifx_*()sql_safe_mode restrictions, (!= Safe Mode)
ingres_*()sql_safe_mode restrictions, (!= Safe Mode)
mysql_*()sql_safe_mode restrictions, (!= Safe Mode)
pg_loimport()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
posix_mkfifo()Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
putenv() Führt die safe_mode_protected_env_vars und safe_mode_allowed_env_vars ini-directiven aus. Siehe auch Dokumentation zu putenv()
move_uploaded_file()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chdir()Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
dl()Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
backtick operator Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
shell_exec() (funktional gleichwertig zu den Backtick-Operatoren)Diese Funktion ist bei Verwendung von Safe Mode deaktiviert.
exec()Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, .. im Pfad zu den ausführbaren Datein anzugeben.
system()Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, .. im Pfad zu den ausführbaren Datein anzugeben.
passthru()Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, .. im Pfad zu den ausführbaren Datein anzugeben.
popen()Ausführbare Dateien können nur innerhalb des durch safe_mode_exec_dir angegebenen Verzeichnisses ausgeführt werden. Aus praktischen Gründen ist es momentan nicht erlaubt, .. im Pfad zu den ausführbaren Datein anzugeben.
mkdir()Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
rmdir()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
rename()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
unlink()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
copy()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (on source and target)
chgrp()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chown()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst.
chmod()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. In addition, you cannot set the SUID, SGID and sticky bits
touch()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst.
symlink()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (note: only the target is checked)
link()Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (note: only the target is checked)
getallheaders() Header die mit 'authorization' (unabhängig von Groß- oder Kleinschreibung) beginnen, werden bei Verwendung von Safe Mode nicht zurückgegeben. Achtung: Dies ist fehlerhaft bei der AOL-Server Implementation der Funktion getallheaders()!
highlight_file(), show_source() Überprüft ob die Dateien/Verzeichnisse, die mit dem Skript bearbeitet werden sollen, die gleiche UID haben wie das Skript selbst. Überprüft ob das Verzeichnis in dem das Skript ausgeführt werden soll, die gleiche UID hat wie das Skript selbst. (Hinweis: gilt nur ab Version PHP 4.2.1)
Jede Funktion, die php4/main/fopen_wrappers.c benutzt... ??


Kapitel 23. Using PHP from the command line

As of version 4.3.0, PHP supports a new SAPI type (Server Application Programming Interface) named CLI which means Command Line Interface. As the name implies, this SAPI type main focus is on developing shell (or desktop as well) applications with PHP. There are quite a few differences between the CLI SAPI and other SAPIs which are explained in this chapter. It's worth mentioning that CLI and CGI are different SAPI's although they do share many of the same behaviors.

The CLI SAPI was released for the first time with PHP 4.2.0, but was still experimental and had to be explicitly enabled with --enable-cli when running ./configure. Since PHP 4.3.0 the CLI SAPI is no longer experimental and the option --enable-cli is on by default. You may use --disable-cli to disable it.

As of PHP 4.3.0, the name, location and existence of the CLI/CGI binaries will differ depending on how PHP is installed on your system. By default when executing make, both the CGI and CLI are built and placed as sapi/cgi/php and sapi/cli/php respectively, in your php source directory. You will note that both are named php. What happens during make install depends on your configure line. If a module SAPI is chosen during configure, such as apxs, or the --disable-cgi option is used, the CLI is copied to {PREFIX}/bin/php during make install otherwise the CGI is placed there. So, for example, if --with--apxs is in your configure line then the CLI is copied to {PREFIX}/bin/php during make install. If you want to override the installation of the CGI binary, use make install-cli after make install. Alternatively you can specify --disable-cgi in your configure line.

Anmerkung: Because both --enable-cli and --enable-cgi are enabled by default, simply having --enable-cli in your configure line does not necessarily mean the CLI will be copied as {PREFIX}/bin/php during make install.

The windows packages between PHP 4.2.0 and PHP 4.2.3 distributed the CLI as php-cli.exe,living in the same folder as the CGI php.exe. Starting with PHP 4.3.0 the windows package distributes the CLI as php.exe in a separate folder named cli, so cli/php.exe.

What SAPI do I have?: From a shell, typing php -v will tell you whether php is CGI or CLI. See also the function php_sapi_name() and the constant PHP_SAPI.

Remarkable differences of the CLI SAPI compared to other SAPIs:

  • Unlike the CGI SAPI, no headers are written to the output.

    Though the CGI SAPI provides a way to suppress HTTP headers, there's no equivalent switch to enable them in the CLI SAPI.

    CLI is started up in quiet mode by default, though the -q switch is kept for compatibility so that you can use older CGI scripts.

    It does not change the working directory to that of the script. (-C switch kept for compatibility)

    Plain text error messages (no HTML formatting).

  • There are certain php.ini directives which are overriden by the CLI SAPI because they do not make sense in shell environments:

    Tabelle 23-1. Overriden php.ini directives

    DirectiveCLI SAPI default valueComment
    html_errorsFALSE It can be quite hard to read the error message in your shell when it's cluttered with all those meaningless HTML tags, therefore this directive defaults to FALSE.
    implicit_flushTRUE It is desired that any output coming from print(), echo() and friends is immediately written to the output and not cached in any buffer. You still can use output buffering if you want to defer or manipulate standard output.
    max_execution_time0 (unlimited) Due to endless possibilities of using PHP in shell environments, the maximum execution time has been set to unlimited. Whereas applications written for the web are often executed very quickly, shell application tend to have a much longer execution time.
    register_argc_argvTRUE

    Because this setting is TRUE you will always have access to argc (number of arguments passed to the application) and argv (array of the actual arguments) in the CLI SAPI.

    As of PHP 4.3.0, the PHP variables $argc and $argv are registered and filled in with the appropriate values when using the CLI SAPI. Prior to this version, the creation of these variables behaved as they do in CGI and MODULE versions which requires the PHP directive register_globals to be on. Regardless of version or register_globals setting, you can always go through either $_SERVER or $HTTP_SERVER_VARS. Example: $_SERVER['argv']

    Anmerkung: These directives cannot be initialized with another value from the configuration file php.ini or a custom one (if specified). This is a limitation because those default values are applied after all configuration files have been parsed. However, their value can be changed during runtime (which does not make sense for all of those directives, e.g. register_argc_argv).

  • To ease working in the shell environment, the following constants are defined:

    Tabelle 23-2. CLI specific Constants

    ConstantDescription
    STDIN An already opened stream to stdin. This saves opening it with
    $stdin = fopen('php://stdin', 'r');
    STDOUT An already opened stream to stdout. This saves opening it with
    $stdout = fopen('php://stdout', 'w');
    STDERR An already opened stream to stderr. This saves opening it with
    $stderr = fopen('php://stderr', 'w');

    Given the above, you don't need to open e.g. a stream for stderr yourself but simply use the constant instead of the stream resource:
    php -r 'fwrite(STDERR, "stderr\n");'
    You do not need to explicitly close these streams, as they are closed automatically by PHP when your script ends.

  • The CLI SAPI does not change the current directory to the directory of the executed script!

    Example showing the difference to the CGI SAPI:
    <?php
        /* Our simple test application named test.php*/
        echo getcwd(), "\n";
    ?>

    When using the CGI version, the output is:
    $ pwd
    /tmp
    
    $ php -q another_directory/test.php
    /tmp/another_directory
    This clearly shows that PHP changes its current directory to the one of the executed script.

    Using the CLI SAPI yields:
    $ pwd
    /tmp
    
    $ php -f another_directory/test.php
    /tmp
    This allows greater flexibility when writing shell tools in PHP.

    Anmerkung: The CGI SAPI supports the CLI SAPI behaviour by means of the -C switch when run from the command line.

The list of command line options provided by the PHP binary can be queried anytime by running PHP with the -h switch:
Usage: php [options] [-f] <file> [args...]
       php [options] -r <code> [args...]
       php [options] [-- args...]
  -s               Display colour syntax highlighted source.
  -w               Display source with stripped comments and whitespace.
  -f <file>        Parse <file>.
  -v               Version number
  -c <path>|<file> Look for php.ini file in this directory
  -a               Run interactively
  -d foo[=bar]     Define INI entry foo with value 'bar'
  -e               Generate extended information for debugger/profiler
  -z <file>        Load Zend extension <file>.
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -i               PHP information
  -r <code>        Run PHP <code> without using script tags <?..?>
  -h               This help

  args...          Arguments passed to script. Use -- args when first argument 
                   starts with - or script is read from stdin

The CLI SAPI has three different ways of getting the PHP code you want to execute:

  1. Telling PHP to execute a certain file.

    php my_script.php
    
    php -f my_script.php
    Both ways (whether using the -f switch or not) execute the file my_script.php. You can choose any file to execute - your PHP scripts do not have to end with the .php extension but can have any name or extension you wish.

  2. Pass the PHP code to execute directly on the command line.

    php -r 'print_r(get_defined_constants());'
    Special care has to be taken in regards of shell variable substitution and quoting usage.

    Anmerkung: Read the example carefully, there are no beginning or ending tags! The -r switch simply does not need them. Using them will lead to a parser error.

  3. Provide the PHP code to execute via standard input (stdin).

    This gives the powerful ability to dynamically create PHP code and feed it to the binary, as shown in this (fictional) example:
    $ some_application | some_filter | php | sort -u >final_output.txt

You cannot combine any of the three ways to execute code.

Like every shell application, the PHP binary accepts a number of arguments but your PHP script can also receive arguments. The number of arguments which can be passed to your script is not limited by PHP (the shell has a certain size limit in the number of characters which can be passed; usually you won't hit this limit). The arguments passed to your script are available in the global array $argv. The zero index always contains the script name (which is - in case the PHP code is coming from either standard input or from the command line switch -r). The second registered global variable is $argc which contains the number of elements in the $argv array (not the number of arguments passed to the script).

As long as the arguments you want to pass to your script do not start with the - character, there's nothing special to watch out for. Passing an argument to your script which starts with a - will cause trouble because PHP itself thinks it has to handle it. To prevent this, use the argument list separator --. After this separator has been parsed by PHP, every argument following it is passed untouched to your script.

# This will not execute the given code but will show the PHP usage
$ php -r 'var_dump($argv);' -h
Usage: php [options] [-f] <file> [args...]
[...]

# This will pass the '-h' argument to your script and prevent PHP from showing it's usage
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

However, there's another way of using PHP for shell scripting. You can write a script where the first line starts with #!/usr/bin/php. Following this you can place normal PHP code included within the PHP starting and end tags. Once you have set the execution attributes of the file appropriately (e.g. chmod +x test) your script can be executed like a normal shell or perl script:
#!/usr/bin/php
<?php
    var_dump($argv);
?>
Assuming this file is named test in the current directory, we can now do the following:
$ chmod 755 test
$ ./test -h -- foo
array(4) {
  [0]=>
  string(6) "./test"
  [1]=>
  string(2) "-h"
  [2]=>
  string(2) "--"
  [3]=>
  string(3) "foo"
}
As you see, in this case no care needs to be taken when passing parameters which start with - to your script.

Tabelle 23-3. Command line options

OptionDescription
-s

Display colour syntax highlighted source.

This option uses the internal mechanism to parse the file and produces a HTML highlighted version of it and writes it to standard output. Note that all it does it to generate a block of <code> [...] </code> HTML tags, no HTML headers.

Anmerkung: This option does not work together with the -r option.

-w

Display source with stripped comments and whitespace.

Anmerkung: This option does not work together with the -r option.

-f

Parses and executed the given filename to the -f option. This switch is optional and can be left out. Only providing the filename to execute is sufficient.

-v

Writes the PHP, PHP SAPI, and Zend version to standard output, e.g.
$ php -v
PHP 4.3.0 (cli), Copyright (c) 1997-2002 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies

-c

With this option one can either specify a directory where to look for php.ini or you can specify a custom INI file directly (which does not need to be named php.ini), e.g.:
$ php -c /custom/directory/ my_script.php

$ php -c /custom/directory/custom-file.ini my_script.php

-a

Runs PHP interactively.

-d

This option allows you to set a custom value for any of the configuration directives allowed in php.ini. The syntax is:
-d configuration_directive[=value]

Examples:
# Omitting the value part will set the given configuration directive to "1"
$ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(1) "1"

# Passing an empty value part will set the configuration directive to ""
php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(0) ""

# The configuration directive will be set to anything passed after the '=' character
$  php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(2) "20"
$  php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);'
string(15) "doesntmakesense"

-e

Generate extended information for debugger/profiler.

-z

Load Zend extension. If only a filename is given, PHP tries to load this extension from the current default library path on your system (usually specified /etc/ld.so.conf on Linux systems). Passing a filename with an absolute path information will not use the systems library search path. A relative filename with a directory information will tell PHP only to try to load the extension relative to the current directory.

-l

This option provides a convenient way to only perform a syntax check on the given PHP code. On succes, the text No syntax errors detected in <filename> is written to standard output and the shell return code is 0. On failure, the text Errors parsing <filename> in addition to the internal parser error message is written to standard output and the shell return code is set to 255.

This option won't find fatal errors (like undefined functions). Use -f if you would like to test for fatal errors too.

Anmerkung: This option does not work together with the -r option.

-m

Using this option, PHP prints out the built in (and loaded) PHP and Zend modules:
$ php -m
[PHP Modules]
xml
tokenizer
standard
session
posix
pcre
overload
mysql
mbstring
ctype

[Zend Modules]

-i This command line option calls phpinfo(), and prints out the results. If PHP is not working correctly, it is advisable to use php -i and see whether any error messages are printed out before or in place of the information tables. Beware that the output is in HTML and therefore quite huge.
-r

This option allows execution of PHP right from within the command line. The PHP start and end tags (<?php and ?>) are not needed and will cause a parser error if present.

Anmerkung: Care has to be taken when using this form of PHP to not collide with command line variable substitution done by the shell.

Example showing a parser error
$ php -r "$foo = get_defined_constants();"
Command line code(1) : Parse error - parse error, unexpected '='
The problem here is that the sh/bash performs variable substitution even when using double quotes ". Since the variable $foo is unlikely to be defined, it expands to nothing which results in the code passed to PHP for execution actually reading:
$ php -r " = get_defined_constants();"
The correct way would be to use single quotes '. Variables in single-quoted strings are not expanded by sh/bash.
$ php -r '$foo = get_defined_constants(); var_dump($foo);'
array(370) {
  ["E_ERROR"]=>
  int(1)
  ["E_WARNING"]=>
  int(2)
  ["E_PARSE"]=>
  int(4)
  ["E_NOTICE"]=>
  int(8)
  ["E_CORE_ERROR"]=>
  [...]
If you are using a shell different from sh/bash, you might experience further issues. Feel free to open a bug report or send a mail to phpdoc@lists.php.net. One can still easily run into troubles when trying to get shell variables into the code or using backslashes for escaping. You've been warned.

Anmerkung: -r is available in the CLI SAPI and not in the CGI SAPI.

-h With this option, you can get information about the actual list of command line options and some one line descriptions about what they do.

The PHP executable can be used to run PHP scripts absolutely independent from the web server. If you are on a Unix system, you should add a special first line to your PHP script, and make it executable, so the system will know, what program should run the script. On a Windows platform you can associate php.exe with the double click option of the .php files, or you can make a batch file to run the script through PHP. The first line added to the script to work on Unix won't hurt on Windows, so you can write cross platform programs this way. A simple example of writing a command line PHP program can be found below.

Beispiel 23-1. Script intended to be run from command line (script.php)

#!/usr/bin/php
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

This is a command line PHP script with one option.

  Usage:
  <?php echo $argv[0]; ?> <option>

  <option> can be some word you would like
  to print out. With the --help, -help, -h,
  or -? options, you can get this help.

<?php
} else {
    echo $argv[1];
}
?>

In the script above, we used the special first line to indicate that this file should be run by PHP. We work with a CLI version here, so there will be no HTTP header printouts. There are two variables you can use while writing command line applications with PHP: $argc and $argv. The first is the number of arguments plus one (the name of the script running). The second is an array containing the arguments, starting with the script name as number zero ($argv[0]).

In the program above we checked if there are less or more than one arguments. Also if the argument was --help, -help, -h or -?, we printed out the help message, printing the script name dynamically. If we received some other argument we echoed that out.

If you would like to run the above script on Unix, you need to make it executable, and simply call it as script.php echothis or script.php -h. On Windows, you can make a batch file for this task:

Beispiel 23-2. Batch file to run a command line PHP script (script.bat)

@c:\php\cli\php.exe script.php %1 %2 %3 %4

Assuming you named the above program script.php, and you have your CLI php.exe in c:\php\cli\php.exe this batch file will run it for you with your added options: script.bat echothis or script.bat -h.

See also the Readline extension documentation for more functions you can use to enhance your command line applications in PHP.

IV. Funktionsreferenz

Inhaltsverzeichnis
I. Apache-spezifische Funktionen
II. Array Funktionen
III. Aspell Funktionen [veraltet]
IV. Mathematische Funktionen mit beliebiger Genauigkeit
V. Bzip2 Komprimierungsfunktionen
VI. Kalender-Funktionen
VII. CCVS API Funktionen
VIII. COM Support Funktionen für Windows
IX. Klassen- und Objekt-Funktionen
X. ClibPDF Funktionen
XI. Crack Funktionen
XII. CURL, Client URL Library Functions
XIII. Cybercash Bezahl Funktionen
XIV. Crédit Mutuel CyberMUT functions
XV. Cyrus IMAP administration functions
XVI. Character type functions
XVII. dba Datenbank (dbm-style) Abstraktions-Funktionen
XVIII. Datums- und Zeit-Funktionen
XIX. dBase Funktionen
XX. DBM Datenbankfunktionen
XXI. dbx Funktionen
XXII. DB++ Functions
XXIII. Direkte Ein-/Ausgabe Funktionen
XXIV. Verzeichnis-Funktionen
XXV. DOM XML Funktionen
XXVI. .NET Funktionen
XXVII. Error Handling and Logging Functions
XXVIII. FrontBase Funktionen
XXIX. filePro Funktionen
XXX. Funktionen des Dateisystems
XXXI. Forms Data Format Funktionen
XXXII. FriBiDi Funktionen
XXXIII. FTP-Funktionen
XXXIV. Function Handling functions
XXXV. GNU Gettext
XXXVI. GMP functions
XXXVII. HTTP functions
XXXVIII. Hyperwave functions
XXXIX. Hyperwave API functions
XL. iconv Funktionen
XLI. Grafik-Funktionen
XLII. IMAP, POP3 und NNTP Funktionen
XLIII. Informix Funktionen
XLIV. InterBase-Funktionen
XLV. Ingres II Funktionen
XLVI. IRC Gateway Funktionen
XLVII. Java
XLVIII. LDAP Funktionen
XLIX. Mail Funktionen
L. mailparse functions
LI. Mathematische Funktionen
LII. Multi-Byte String Functions
LIII. MCAL Funktionen
LIV. Mcrypt Encryption Functions
LV. MCVE Payment Functions
LVI. Hash Funktionen
LVII. Mimetype Functions
LVIII. Microsoft SQL Server Funktionen
LIX. Ming functions for Flash
LX. Sonstige Funktionen
LXI. mnoGoSearch Funktionen
LXII. mSQL Funktionen
LXIII. MySQL Funktionen
LXIV. Mohawk Software Session Handler Funktionen
LXV. muscat functions
LXVI. Netzwerk Funktionen
LXVII. Ncurses terminal screen control functions
LXVIII. Lotus Notes functions
LXIX. ODBC Funktionen
LXX. Object Aggregation/Composition Functions
LXXI. Oracle 8 Funktionen
LXXII. OpenSSL Funktionen
LXXIII. Oracle Funktionen
LXXIV. Ovrimos SQL functions
LXXV. Funktionen zur Ausgabesteuerung
LXXVI. Object property and method call overloading
LXXVII. PDF Funktionen
LXXVIII. Verisign Payflow Pro Funktionen
LXXIX. PHP Optionen und Informationen
LXXX. POSIX Funktionen
LXXXI. PostgreSQL Funktionen
LXXXII. Process Control Functions
LXXXIII. Funktionen zur Programmausführung
LXXXIV. Printer functions
LXXXV. Pspell Funktionen
LXXXVI. GNU Readline
LXXXVII. GNU Recode Funktionen
LXXXVIII. Regular Expression Functions (Perl-Compatible)
LXXXIX. qtdom functions
XC. Reguläre Ausdrücke Funktionen (POSIX erweitert)
XCI. Semaphor und Shared Memory Funktionen
XCII. SESAM Datenbankfunktionen
XCIII. Session Funktionen
XCIV. Shared Memory Funktionen (Gemeinsamer Speicher)
XCV. Shockwave Flash Funktionen
XCVI. SNMP Funktionen
XCVII. Socket Funktionen
XCVIII. Stream functions
XCIX. String-Funktionen
C. Sybase functions
CI. Tokenizer functions
CII. URL Funktionen
CIII. Variablen-Funktionen
CIV. vpopmail functions
CV. W32api functions
CVI. WDDX Funktionen
CVII. XML parser functions
CVIII. XML-RPC functions
CIX. XSLT Funktionen
CX. YAZ functions
CXI. YP/NIS Funktionen
CXII. ZIP Funktionen (Lesezugriff)
CXIII. Zlib Komprimierungsfunktionen

I. Apache-spezifische Funktionen

Einführung

Diese Funktionen stehen nur zur Verfügung, wenn PHP als Apache 1.x Modul läuft.


Installation

Informationen zur Installation von PHP unter Apache 1.x finden Sie im Kapitel Installation unter dem Abschnitt zu Apache


Laufzeit Konfiguration

Das Verhalten des Apache PHP-Moduls wird durch Einstellungen in der php.ini beeinflusst. Konfigurationseinstellungen aus der php.ini können Sie durch php_flag Einstellungen in der Server Konfigurationsdatei oder lokal in .htaccess Dateien überschreiben.

Beispiel 1. Parsen von PHP für ein Verzeichnis ausschalten mittels .htaccess

php_flag engine off

Tabelle 1. Apache Konfigurations Optionen

BezeichnungGrundeinstellungÄnderbarBedeutung
engineOnPHP_INI_ALLParsen von PHP ein/-auschalten
child_terminateOffPHP_INI_ALL Gibt an, ob PHP Skripte veranlassen, dass Kindprozesse nach dem Request beendet werden, siehe auch apache_child_terminate().
last_modifiedOffPHP_INI_ALL Das letzte Datum der Änderung des PHP Skripts wird als Last-Modified: header für diesen Request gesendet.
xbit_hackOffPHP_INI_ALL Dateien mit gesetztem ausführbaren Bit werden unabhängig von ihrer Dateiendung durch PHP geparst.

Hier eine kurze Erklärung der Konfigurationsoptionen:

engine boolean

Diese Option ist in erster Linie nur sinnvoll, wenn PHP als Modul in den Apache einkompiliert wurde. Sie wird von Seiten benutzt, die den PHP-Parser für bestimmte Verzeichnisse oder virtuelle Server aus- bzw. einschalten wollen. Wenn Sie engine off in den dafür vorgesehenen Blöcken in der httpd.conf Datei benutzen, kann PHP aktiviert bzw. deaktiviert werden.


Resource Typen

Diese Erweiterung definiert keine Resource-Typen.


Vordefinierte Konstanten

Diese Erweiterung definiert keine Konstanten.

Inhaltsverzeichnis
apache_child_terminate -- Beendet einen Apache Prozess nach der Anfrage
apache_lookup_uri --  Führt eine Teilanfrage für eine URI durch und liefert alle Informationen darüber zurück.
apache_note -- Setzt und liest Apache Notes
apache_request_headers -- Liefert alle HTTP-Header der aktuellen Anfrage aus
apache_response_headers --  Liefert alle HTTP-Antwort Header
apache_setenv -- Setzt eine Apache subprocess_env Variable
ascii2ebcdic -- Zeichenkette von ASCII in EBCDIC übersetzen
ebcdic2ascii -- Zeichenkette von EBCDIC in ASCII übersetzen
getallheaders --  Liefert alle HTTP-Header der aktuellen Anfrage aus
virtual -- Führt eine Apache-Unteranfrage durch

apache_child_terminate

(PHP 4 >= 4.0.5)

apache_child_terminate -- Beendet einen Apache Prozess nach der Anfrage

Beschreibung

bool apache_child_terminate ( void)

apache_child_terminate() beendet den Apache Prozess, der die aktuelle PHP-Anfrage ausführt, nachdem diese vollständig ausgeführt wurde. Sie können diese Funktion benutzen, nachdem Sie ein Skript mit hohem Speicherverbrauch ausgeführt haben. Der verbrauchte Speicher wird gewöhnlich nur intern, aber nicht für das Betriebsystem, freigegeben.

Anmerkung: Die Verfügbarkeit dieses Features wird durch die Anweisung child_terminate in der php.ini beeinflusst. Die Standardeinstellung ist off.

Dieses Feature steht bei multithreaded Versionen von Apache, wie der win32 Version, nicht zur Verfügung.

Siehe auch exit().

apache_lookup_uri

(PHP 3>= 3.0.4, PHP 4 )

apache_lookup_uri --  Führt eine Teilanfrage für eine URI durch und liefert alle Informationen darüber zurück.

Beschreibung

object apache_lookup_uri ( string Dateiname)

apache_lookup_uri() führt eine Teilanfrage über eine bestimmte URI durch. Die Abfrage geht gerade soweit, dass alle wichtigen Informationen über die gegebene Quelle gesammelt werden können. Als Resultat wird eine Klasse zurückgeliefert, die folgende Elemente enthält:

status
the_request
status_line
method
content_type
handler
uri
filename
path_info
args
boundary
no_cache
no_local_copy
allowed
send_bodyct
bytes_sent
byterange
clength
unparsed_uri
mtime
request_time

Anmerkung: apache_lookup_uri() funktioniert nur, wenn PHP als Apache-Modul eingerichtet wurde.

apache_note

(PHP 3>= 3.0.2, PHP 4 )

apache_note -- Setzt und liest Apache Notes

Beschreibung

string apache_note ( string note_name [, string note_value])

apache_note() ist eine Apache-spezifische Funktion, die Einträge in Apaches notes-Tabelle setzt und ausliest. Wenn sie mit einem einzelnen Parameter aufgerufen wird, gibt sie den aktuellen Wert der Note note_name zurück. Bei zwei Parametern wird der Eintrag note_name auf den zweiten Parameter note_value gesetzt und liefert den bisherigen Wert zurück.

apache_request_headers

(PHP 4 >= 4.3.0)

apache_request_headers -- Liefert alle HTTP-Header der aktuellen Anfrage aus

Beschreibung

array apache_request_headers ( void)

Die Funktion apache_request_headers() liefert ein assoziatives Array zurück, das alle HTTP-Header-Informationen der aktuellen HTTP-Anfrage enthält. Diese Funktion wird nur untersstützt, wenn PHP als Modul für Apache läuft.

Anmerkung: In früheren Versionen als PHP 4.3.0 hieß die Funktion apache_request_headers() getallheaders(). Mit PHP 4.3.0 ist getallheaders() ein Alias für apache_request_headers().

Beispiel 1. apache_request_headers() Beispiel

<?php
$headers = apache_request_headers();

foreach ($headers as $header => $value) {
    echo "$header: $value <br />\n";
}
?>

Anmerkung: Die Werte der gebräuchlichsten CGI-Variablen können Sie auch durch das Auslesen der Umgebungsvariablen erhalten. Dieser Weg funktioniert unabhängig davon, ob Sie PHP als Modul für Apache benutzen. Benutzen Sie phpinfo(), um eine Liste aller zur Verfügung stehenden Umgebungsvariablen zu erhalten.

apache_response_headers

(PHP 4 >= 4.3.0)

apache_response_headers --  Liefert alle HTTP-Antwort Header

Beschreibung

array apache_response_headers ( void)

Rückgabewert: ein assoziatives Array mit allen Apache-Antwort Headern. Diese Funktion steht erst ab PHP Version 4.3.0 und folgende zur Verfügung.

Siehe auch getallheaders() und headers_sent().

apache_setenv

(PHP 4 >= 4.2.0)

apache_setenv -- Setzt eine Apache subprocess_env Variable

Beschreibung

int apache_setenv ( string Variable, string Wert [, bool walk_to_top])

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ascii2ebcdic

(PHP 3>= 3.0.17)

ascii2ebcdic -- Zeichenkette von ASCII in EBCDIC übersetzen

Beschreibung

int ascii2ebcdic ( string ascii_str)

ascii2ebcdic() ist eine Apache-spezifische Funktion, die nur auf Systemen mit EBCDIC-Zeichensatz existiert (Betriebssysteme: OS/390, BS2000). Die Funktion setzt die ASCII-kodierte Zeichenkette ascii_str in ihre äquivalente EBCDIC-Darstellung um (binärfest), und liefert das konvertierte Ergebnis zurück.

Siehe auch die Umkehrfunktion ebcdic2ascii().

ebcdic2ascii

(PHP 3>= 3.0.17)

ebcdic2ascii -- Zeichenkette von EBCDIC in ASCII übersetzen

Beschreibung

int ebcdic2ascii ( string ebcdic_str)

ebcdic2ascii() ist eine Apache-spezifische Funktion, die nur auf Systemen mit EBCDIC-Zeichensatz existiert (Betriebssysteme: OS/390, BS2000). Die Funktion setzt die EBCDIC-kodierte Zeichenkette ebcdic_str in ihre äquivalente ASCII-Darstellung um (binärfest), und liefert das konvertierte Ergebnis zurück.

Siehe auch die Umkehrfunktion ascii2ebcdic().

getallheaders

(PHP 3, PHP 4 )

getallheaders --  Liefert alle HTTP-Header der aktuellen Anfrage aus

Beschreibung

array getallheaders ( void)

getallheaders() ist ein Alias für die Funktion apache_request_headers(). Die Funktion liefert ein assoziatives Array zurück, das alle HTTP-Header der aktuellen HTTP-Anfrage enthält. Lesen Sie bitte die Dokumentation zu apache_request_headers() um mehr Informationen über die Funktionsweise zu erhalten.

Anmerkung: In PHP 4.3.0 wurde aus getallheaders() ein Alias für Tatsächlich wurde die Funktion umbenannt. Der Grund: diese Funktion funktioniert nur, wenn PHP als Modul für Apache kompiliert wurde.

Siehe auch apache_request_headers().

virtual

(PHP 3, PHP 4 )

virtual -- Führt eine Apache-Unteranfrage durch

Beschreibung

int virtual ( string filename)

virtual() ist eine Apache-spezifische Funktion, die <!--#include virtual... --> aus mod_include entspricht. Diese Funktion führt eine Unteranfrage durch. Das ist nützlich für das Einbinden von CGI-Skripten, .shtml-Dateien oder allen anderen Inhalten, die von Apache verarbeitet werden sollen. Beachten Sie bitte, dass ein CGI-Skript gültige CGI-Header generieren muss, mindestens einen Content-type-Header. Für PHP-Dateien müssen Sie include() oder require() benutzen, virtual() kann selbst keine PHP-Dokumente einbinden.

Um die Unteranfrage auszuführen, werden alle Buffer beendet und der Inhalt im Browser ausgegeben. Anstehende Header werden ebenfalls abgeschickt.

II. Array Funktionen

Einführung

Diese Funktionen erlauben es, Arrays auf verschiedene Arten zu manipulieren bzw. mit ihnen zu interagieren. Arrays sind wichtig, um Gruppen von Variablen zu verwalten, zu bearbeiten, oder zu speichern.

Es werden einfache und mehrdimensionale Arrays unterstützt, welche entweder vom Benutzer oder von einer anderen Funktion erstellt werden können. Es gibt bestimmte Datenbankfunktionen, welche die Ergebnisse aus Datenbankabfragen in Arrays speichern, und verschiedene andere Funktionen, die Arrays als Rückgabewerte haben.

Im Abschnitt Arrays finden Sie eine detaillierte Erklärung, wie Arrays in PHP implementiert sind und wie sie benutzt werden.


Anforderungen

Diese Erweiterung benötigt zur Erstellung keine externen Bibliotheken.


Installation

Für diese Funktionen ist keine Installation erforderlich, diese gehören zum Grundbestand von PHP.


Laufzeit Konfiguration

Diese Erweiterung definiert keine Konfigurationseinstellungen in der php.ini.


Resource Typen

Diese Erweiterung definiert keine Resource-Typen.


Vordefinierte Konstanten

Die aufgelisteten Konstanten stehen immer zur Verfügung, da sie zum Grundbestand von PHP gehören.

CASE_LOWER (integer)

CASE_LOWER wird benützt mit array_change_key_case() um die Schlüssel von Arrays in Kleinbuchstaben umzuwandeln. Das ist auch der Standard für array_change_key_case().

CASE_UPPER (integer)

CASE_UPPER wird benützt mit array_change_key_case() um die Schlüssel von Arrays in Kleinbuchstaben umzuwandeln.


Siehe auch

Siehe auch is_array(), explode(), implode(), split(), preg_split() und join().

Inhaltsverzeichnis
array_change_key_case --  Liefert ein Array mit allen String-Schlüsseln in Klein- oder Großbuchstaben
array_chunk -- Splittet ein Array in Teile auf
array_count_values -- Zählt die Werte eines Arrays
array_diff_assoc -- Computes the difference of arrays with additional index check
array_diff -- Ermittelt die Unterschiede von Arrays
array_fill -- Füllt ein Array mit Werten
array_filter --  Filtert Elemente eines Arrays mittels einer Callback-Funktion
array_flip -- Vertauscht Werte und Schlüssel in einem Array
array_intersect_assoc -- Computes the intersection of arrays with additional index check
array_intersect -- Ermittelt die Schnittmenge von Arrays
array_key_exists -- Prüft, ob ein Schlüssel in einem Array existiert
array_keys -- Liefert alle Schlüssel eines Arrays
array_map --  Wendet eine Callback-Funktion auf die Elemente von Arrays an
array_merge_recursive --  Führt zwei oder mehr Arrays rekursiv zusammen
array_merge -- Führt zwei oder mehr Arrays zusammen
array_multisort -- Sortiert mehrere oder multidimensionale Arrays
array_pad --  Vergrößert ein Array auf die spezifizierte Länge mit einem Wert
array_pop -- Liefert das letzte Element eines Arrays
array_push --  Fügt ein oder mehr Elemente an das Ende eines Arrays
array_rand --  Liefert einen oder mehrere zufällige Einträge eines Arrays
array_reduce --  Iterative Reduktion eines Arrays zu einem Wert mittels einer Callback Funktion
array_reverse --  Liefert ein Array mit umgekehrter Reihenfolge der Elemente
array_search --  Durchsucht ein Array nach einem Wert liefert bei Erfolg den Schlüssel
array_shift --  Liefert ein Element vom Beginn eines Arrays
array_slice -- Extrahiert einen Ausschnitt eines Arrays
array_splice --  Entfernt einen Teil eines Arrays und ersetzt ihn durch etwas anderes
array_sum --  Liefert die Summe der Werte in einem Array
array_unique -- Entfernt doppelte Werte aus einem Array
array_unshift --  Fügt ein oder mehr Elemente am Anfang eines Arrays ein
array_values -- Liefert alle Werte eines Arrays
array_walk --  Wendet eine Benutzerfunktion an jedem Element eines Arrays an
array --  Erstellt ein Array
arsort --  Sortiert ein Array in umgekehrter Reihenfolge und behält die Verbindung zum Index
asort --  Sortiert ein Array und behält die Indexverbindungen
compact --  Erstellt ein Array mit Variablen und deren Werten
count -- Zählt die Elemente einer Variable
current -- Liefert das aktuelle Element eines Arrays
each --  Liefert das aktuelle Paar (Schlüssel und Wert) eines Arrays und rückt den Array Cursor vor.
end --  Positioniert den internen Zeiger eines Arrays auf dessen letztes Element
extract --  Importiert Variablen eines Arrays in die aktuelle Symboltabelle
in_array -- Prüft, ob ein Wert in einem Array existiert
key --  Liefert einen Schlüssel eines assoziativen Arrays
krsort --  Sortiert ein Array nach Schlüsseln in umgekehrter Reihenfolge
ksort -- Sortiert ein Array nach Schlüsseln
list --  Weist Variablen zu, als wären sie ein Array
natcasesort --  Sortiert ein Array in "natürlicher Reihenfolge", Groß/Kleinschreibung wird ignoriert
natsort --  Sortiert ein Array in "natürlicher Reihenfolge"
next --  Rückt den internen Zeiger eines Arrays vor
pos -- Liefert das aktuelle Element eines Arrays
prev --  Verkleinert den internen Zeiger eines Arrays
range --  Erstellt ein Array mit einem Bereich von Elementen
reset --  Setzt den internen Zeiger eines Arrays auf sein erstes Element
rsort --  Sortiert ein Array in umgekehrter Reihenfolge
shuffle -- Mischt die Elemente eines Arrays
sizeof -- Liefert die Anzahl Elemente einer Variable
sort -- Sortiert ein Array
uasort --  Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.
uksort --  Sortiert ein Array nach Schlüsseln mittels einer benutzerdefinierten Vergleichsfunktion.
usort --  Sortiert ein Array nach Werten mittels einer benutzerdefinierten Vergleichsfunktion.

array_change_key_case

(PHP 4 >= 4.2.0)

array_change_key_case --  Liefert ein Array mit allen String-Schlüsseln in Klein- oder Großbuchstaben

Beschreibung

array array_change_key_case ( array input [, int case])

array_change_key_case() wandelt die Schlüssel des Arrays input in Klein- bzw. Großbuchstaben um. Die Richtung der Umwandlung wird mit dem optionalen Parameter case festgelegt, mit dem die zwei Konstanten CASE_UPPER und CASE_LOWER übergeben werden können. Default ist CASE_LOWER. Diese Funktion lässt die numerischen Indizes unverändert.

Beispiel 1. array_change_key_case()

$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));

wird folgendes ausgeben:
Array
(
    [FIRST] => 1
    [SECOND] => 2
)

array_chunk

(PHP 4 >= 4.2.0)

array_chunk -- Splittet ein Array in Teile auf

Beschreibung

array array_chunk ( array input, int size [, bool preserve_keys])

array_chunk() teilt das Array in verschiedene Arrays mit size Werten auf. Am Ende kann auch ein Array mit weniger Werten erzeugt werden. Die Arrays werden als Teile eines mehrdimensionalen Arrays erzeugt, welches bei Null und beginnend numerisch indiziert ist.

Sie können PHP dazu zwingen, die originalen Schlüssel des Arrays input beizubehalten, indem Sie den optionalen Parameter preserve_keys auf TRUE setzen. Geben Sie FALSE an, werden in jedem erzeugten Array neue numerische Indizes erzeugt, welche bei Null beginnen. Default ist FALSE.

Beispiel 1. array_chunk()

$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, TRUE));

wird folgendes ausgeben:
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)

array_count_values

(PHP 4 )

array_count_values -- Zählt die Werte eines Arrays

Beschreibung

array array_count_values ( array input)

array_count_values() gibt ein Array zurück, in dem die Werte des Arrays input als Schlüssel, und deren Anzahl als Werte angegeben sind.

Beispiel 1. array_count_values()

$array = array (1, "hello", 1, "world", "hello");
print_r(array_count_values ($array));

Wird folgendes ausgeben:
Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

array_diff_assoc

(PHP 4 >= 4.3.0)

array_diff_assoc -- Computes the difference of arrays with additional index check

Description

array array_diff_assoc ( array array1, array array2 [, array ...])

array_diff_assoc() returns an array containing all the values from array1 that are not present in any of the other arguments. Note that the keys are used in the comparison unlike array_diff().

Beispiel 1. array_diff_assoc() example

<?php
$array1 = array ("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array ("a" => "green", "yellow", "red");
$result = array_diff_assoc ($array1, $array2);

/* The result is:
Array
(
    [b] => brown
    [c] => blue
    [0] => red
)
*/
?>

In our example above you see the "a" => "green" pair is present in both arrays and thus it is not in the ouput from the function. Unlike this, the pair 0 => "red" is in the ouput because in the second argument "red" has key which is 1.

Two values from key => value pairs are considered equal only if (string) $elem1 === (string) $elem2 . In other words a strict check takes place so the string representations must be the same.

Anmerkung: Please note that this function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using, for example, array_diff_assoc($array1[0], $array2[0]);.

See also array_diff(), array_intersect(), and array_intersect_assoc().

array_diff

(PHP 4 >= 4.0.1)

array_diff -- Ermittelt die Unterschiede von Arrays

Beschreibung

array array_diff ( array array1, array array2 [, array ...])

array_diff() gibt ein Array mit allen Werten von array1, welche in keinem der anderen Argumente enthalten sind, zurück. Beachten Sie, dass Schlüssel erhalten bleiben.

Beispiel 1. array_diff()

$array1 = array ("a" => "grün", "rot", "blau", "rot");
$array2 = array ("b" => "grün", "gelb", "rot");
$result = array_diff ($array1, $array2);

Dies speichert array("blau"); in $result. Mehrfache Vorkommen in $array1 werden auf die gleiche Weise behandelt.

Anmerkung: Zwei Elemente werden nur dann als gleich angesehen, wenn (string) $elem1 === (string) $elem2. In Worten: Wenn die String-Repräsentation die gleiche ist.

Anmerkung: Beachten Sie, dass diese Funktion nur eine Dimension eines n-dimensionalen Arrays prüft. Natürlich können Sie tiefere Dimensionen prüfen, indem Sie z.B. array_diff($array1[0], $array2[0]); benutzen.

Warnung

Dies war in PHP 4.0.4 fehlerhaft!

Siehe auch array_diff_assoc(), array_intersect() und array_intersect_assoc().

array_fill

(PHP 4 >= 4.2.0)

array_fill -- Füllt ein Array mit Werten

Beschreibung

array array_fill ( int start_index, int num, mixed value)

array_fill() füllt ein Array mit num Einträgen des Wertes des value Parameters. Die Indizes des Arrays beginnen mit dem start_index Parameter.

Beispiel 1. array_fill()

$a = array_fill(5, 6, 'Banane');
print_r($a);

Nun ist $a:
Array
(
    [5]  => Banane
    [6]  => Banane
    [7]  => Banane
    [8]  => Banane
    [9]  => Banane
    [10] => Banane
)

array_filter

(PHP 4 >= 4.0.6)

array_filter --  Filtert Elemente eines Arrays mittels einer Callback-Funktion

Beschreibung

array array_filter ( array input [, callback function])

array_filter() gibt ein Array mit den mittels der Callback-Funktion function gefilterten Elementen voninput zurück. Ist input ein assoziatives Array, bleiben die Schlüssel erhalten.

Beispiel 1. array_filter()

function ungerade($var) {
    return ($var % 2 == 1);
}

function gerade($var) {
    return ($var % 2 == 0);
}

$array1 = array ("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array (6, 7, 8, 9, 10, 11, 12);

echo "Ungerade :\n";
print_r(array_filter($array1, "ungerade"));
echo "Gerade:\n";
print_r(array_filter($array2, "gerade"));

Wird folgendes ausgeben:
Ungerade :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Gerade:
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

Von der Benutzerfunktion aus darf das Array selbst nicht geändert werden, wie zum Beispiel durch Hinzufügen oder Löschen eines Elementes, oder auch Löschen des Arrays, auf das array_filter() angewendet wird. Ist das Array geändert, so ist das Verhalten dieser Funktion undefiniert.

Siehe auch array_map() und array_reduce().

array_flip

(PHP 4 )

array_flip -- Vertauscht Werte und Schlüssel in einem Array

Beschreibung

array array_flip ( array trans)

array_flip() Gibt ein Array in umgekehrter Reihenfolge zurück, d.h. Schlüssel von trans werden Werte, und umgekehrt werden die Werte zu Schlüsseln.

Beachten Sie, dass die Werte von trans gültige Schlüssel sein müssen, z.B. haben sie entweder integer oder string zu sein. Ist ein Wert vom falschen Typ wird eine Warnung ausgegeben, und das Schlüssel/Werte-Paar wird nicht vertauscht.

Kommt ein Wert mehrmals vor, wird der letzte Schlüssel mit seinem Wert vertauscht, und alle anderen Schlüssel- Wertepaare gehen verloren.

array_flip() gibt im Fehlerfall FALSE zurück.

Beispiel 1. array_flip() Beispiel

$trans = array_flip ($trans);
$original = strtr ($str, $trans);

Beispiel 2. array_flip() Beispiel: Kollision

$trans = array ("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip ($trans);
print_r($trans);

Nun ist $trans:
Array
(
    [1] => b
    [2] => c
)

array_intersect_assoc

(PHP 4 >= 4.3.0)

array_intersect_assoc -- Computes the intersection of arrays with additional index check

Description

array array_intersect_assoc ( array array1, array array2 [, array ...])

array_intersect_assoc() returns an array containing all the values of array1 that are present in all the arguments. Note that the keys are used in the comparison unlike in array_intersect().

Beispiel 1. array_intersect_assoc() example

<?php
$array1 = array ("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array ("a" => "green", "yellow", "red");
$result_array = array_intersect_assoc ($array1, $array2);

/* $result_array will look like:

Array
(
    [a] => green
)

*/
?>

In our example you see that only the pair "a" => "green" is present in both arrays and thus is returned. The value "red" is not returned because in $array1 it's key is 2 while the key of "red" in $array2 it is 1.

The two values from the key => value pairs are considered equal only if (string) $elem1 === (string) $elem2 . In otherwords a strict type check is executed so the string representation must be the same.

See also array_intersect(), array_diff() and array_diff_assoc().

array_intersect

(PHP 4 >= 4.0.1)

array_intersect -- Ermittelt die Schnittmenge von Arrays

Beschreibung

array array_intersect ( array array1, array array2 [, array ...])

array_intersect() gibt ein Array mit allen Werten von array1, die auch in allen anderen Argumenten enthalten sind, zurück. Beachten Sie, dass die Schlüssel erhalten bleiben.

Beispiel 1. array_intersect() Beispiel

$array1 = array ("a" => "grün", "rot", "blau");
$array2 = array ("b" => "grün", "gelb", "rot");
$result = array_intersect ($array1, $array2);

Danach enthält $result
Array
(
    [a] => grün
    [0] => rot
)

Anmerkung: Zwei Elemente werden nur dann als gleich angesehen, wenn (string) $elem1 === (string) $elem2. In Worten: Wenn die String-Repräsentation die gleiche ist.

Warnung

Dies war in PHP 4.0.4 fehlerhaft!

Siehe auch array_intersect_assoc(), array_diff() und array_diff_assoc().

array_key_exists

(PHP 4 >= 4.1.0)

array_key_exists -- Prüft, ob ein Schlüssel in einem Array existiert

Beschreibung

bool array_key_exists ( mixed key, array search)

array_key_exists() gibt TRUE zurück, wenn key in dem Array vorhanden ist. key kann jeder für einen Array-Index mögliche Wert sein.

Beispiel 1. array_key_exists()

$search_array = array("erstes" => 1, "zweites" => 4);
if (array_key_exists("erstes", $search_array)) {
    echo "Das Element 'erstes' ist in dem Array vorhanden";
}

Anmerkung: Der Name dieser Funktion ist in PHP 4.0.6 key_exists().

Siehe auch isset().

array_keys

(PHP 4 )

array_keys -- Liefert alle Schlüssel eines Arrays

Beschreibung

array array_keys ( array input [, mixed search_value])

array_keys() gibt die Schlüssel (numerisch und String) des Arrays input zurück.

Ist der optionale Parameter search_value angegeben, werden nur die Schlüssel für diesen Wert zurückgegeben. Andernfalls werden all Schlüssel von input zurückgegeben.

Beispiel 1. array_keys()

$array = array (0 => 100, "Farbe" => "rot");
print_r(array_keys ($array));

$array = array ("blau", "rot", "grün", "blau", "blau");
print_r(array_keys ($array, "blau"));

$array = array ("Farbe" => array("blau", "rot", "grün"), "Größe" => array("klein", "mittel", "groß"));
print_r(array_keys ($array));

würde folgendes ausgeben:
Array
(
    [0] => 0
    [1] => Farbe
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
Array
(
    [0] => Farbe
    [1] => Größe
)

Anmerkung: Diese Funktion wurde in PHP 4 eingeführt, nachstehend finden Sie eine Implementierung für Benutzer von PHP 3.

Beispiel 2. Implementierung von array_keys() für Benutzer von PHP 3:

function array_keys ($arr, $term="") {
    $t = array();
    while (list($k,$v) = each($arr)) {
        if ($term && $v != $term) {
            continue;
        }
        $t[] = $k;
    }
    return $t;
}

Siehe auch array_values().

array_map

(PHP 4 >= 4.0.6)

array_map --  Wendet eine Callback-Funktion auf die Elemente von Arrays an

Beschreibung

array array_map ( mixed callback, array arr1 [, array ...])

array_map() gibt ein Array mit allen Elementen von arr1 zurück, nachdem die Callback-Funktion callback auf jedes einzelne Element angewandt wurde. Die Anzahl Parameter, welche die Callback-Funktion callback akzeptiert, sollte der Anzahl der an array_map() übergebenen Arrays entsprechen.

Beispiel 1. array_map()

<?php
function cube($n) {
    return $n*$n*$n;
}

$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
?>

Dies speichert in $b:
Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

Beispiel 2. array_map() - Verwendung mehrerer Arrays

<?php
function show_Spanish($n, $m) {
    return "Die Zahl $n heißt auf Spanisch  $m";
}

function map_Spanish($n, $m) {
    return array ($n => $m);
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");

$c = array_map("show_Spanish", $a, $b);
print_r($c);

$d = array_map("map_Spanish", $a , $b);
print_r($d);
?>

Dies resultiert in:
// Ausgabe von $c
Array
(
    [0] => Die Zahl 1 heißt auf Spanisch  uno
    [1] => Die Zahl 2 heißt auf Spanisch  dos
    [2] => Die Zahl 3 heißt auf Spanisch  tres
    [3] => Die Zahl 4 heißt auf Spanisch  cuatro
    [4] => Die Zahl 5 heißt auf Spanisch  cinco
)

// Ausgabe von $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

    [1] => Array
        (
            [2] => dos
        )

    [2] => Array
        (
            [3] => tres
        )

    [3] => Array
        (
            [4] => cuatro
        )

    [4] => Array
        (
            [5] => cinco
        )

)

Bei Verwendung von zwei oder mehr Arrays sollten diese gewöhnlich die gleiche Länge besitzen, da die Callback-Funktion parallel auf die entsprechenden Elemente angewandt wird. Haben die Arrays unterschiedliche Längen, wird das kürzeste um leere Elemente erweitert.

Eine interessante Anwendung dieser Funktion ist die Konstruktion eines Arrays bestehend aus Arrays, was mit NULL als Name der Callback-Funktion leicht realisiert werden kann.

Beispiel 3. Erstellen eines Arrays mit Arrays

<?php
$a = array(1, 2, 3, 4, 5);
$b = array("eins", "zwei", "drei", "vier", "fünf");
$c = array("uno", "dos", "tres", "cuatro", "cinco");

$d = array_map(null, $a, $b, $c);
print_r($d);
?>

Würde folgendes ausgeben:
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => eins
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => zwei
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => drei
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => vier
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => fünf
            [2] => cinco
        )

)

Siehe auch array_filter(), array_reduce() und array_walk().

array_merge_recursive

(PHP 4 >= 4.0.1)

array_merge_recursive --  Führt zwei oder mehr Arrays rekursiv zusammen

Beschreibung

array array_merge_recursive ( array array1, array array2 [, array ...])

array_merge_recursive() fügt die Elemente von zwei oder mehr Arrays zusammen, so dass die Werte des einen Arrays an die des vorigen angehängt werden. Das daraus resultierende Array wird zurückgegeben.

Haben die angegebenen Arrays die selben String-Schlüssel, dann wird der hintere Wert dieses Schlüssels den vorhergehenden überschreiben. Haben die Arrays den gleichen numerischen Schlüssel, dann wird der hintere Wert den vorhergehenden nicht überschreiben, sondern an den vorderen angehängt.

Beispiel 1. array_merge_recursive()

$ar1 = array ("farbe" => array ("favorit" => "rot"), 5);
$ar2 = array (10, "farbe" => array ("favorit" => "grün", "blau"));
$result = array_merge_recursive ($ar1, $ar2);

The $result will be:
Array
(
    [farbe] => Array
        (
            [favorit] => Array
                (
                    [0] => rot
                    [1] => grün
                )

            [0] => blau
        )

    [0] => 5
    [1] => 10
)

See also array_merge().

array_merge

(PHP 4 )

array_merge -- Führt zwei oder mehr Arrays zusammen

Beschreibung

array array_merge ( array array1, array array2 [, array ...])

array_merge() fügt die Elemente von zwei oder mehr Arrays zusammen, indem die Werte des einen an das Ende des anderen angehängt werden. Das daraus resultierende Array wird zurückgegeben.

Haben die angegebenen Arrays die selben String-Schlüssel, dann wird der hintere Wert dieses Schlüssels den vorhergehenden überschreiben. Haben die Arrays den gleichen numerischen Schlüssel, dann wird der hintere Wert den vorhergehenden nicht überschreiben, sondern angehängt.

Beispiel 1. array_merge()

$array1 = array ("farbe" => "rot", 2, 4);
$array2 = array ("a", "b", "farbe" => "grün", "form" => "trapezoid", 4);
$result = array_merge ($array1, $array2);
print_r($result);

Nun ist $result:
Array
(
    [farbe] => grün
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [form] => trapezoid
    [4] => 4
)

Beispiel 2. Einfaches array_merge() Beispiel

$array1 = array();
$array2 = array(1 => "data");
$result = array_merge($array1, $array2);

Vergessen Sie nicht, dass numerische Schlüssel neu numeriert werden!
Array
(
    [0] => data
)

Wenn Sie die Arrays komplett erhalten und nur eines an das andere anhängen wollen, verwenden Sie den Operator +:
$array1 = array();
$array2 = array(1 => "data");
$result = $array1 + $array2;
Der numerische Schlüssel sowie die Assoziation bleiben erhalten.
Array
(
    [1] => data
)

Anmerkung: Gemeinsame Schlüssel werden nach dem Prinzip "Wer zuerst kommt mahlt zuerst" behandelt.

Siehe auch array_merge_recursive().

array_multisort

(PHP 4 )

array_multisort -- Sortiert mehrere oder multidimensionale Arrays

Beschreibung

bool array_multisort ( array ar1 [, mixed arg [, mixed ... [, array ...]]])

array_multisort() wird zum Sortieren von entweder mehreren Arrays auf einmal, oder eines multidimensionalen Arrays (entsprechend einer von mehreren Dimensionen) benutzt. Bei der Sortierung werden die Schlüsselassoziationen beibehalten.

Die angegebenen Arrays werden als Spalten einer Tabelle behandelt, welche nach Reihen sortiert werden - ähnlich der SQL Klausel ORDER BY. Das erste Array ist auch das erste in der Sortierreihenfolge. Die in diesem Array gleichen Zeilen (Werte) werden anhand des nächsten angegebenen Arrays sortiert, usw.

Die Struktur der Argumente ist etwas ungewöhnlich, aber flexibel. Das aller erste Argument muss ein Array sein. Die nachfolgenden Argumente können entweder ein Array oder eines der folgenden Sortierflags sein.

Flags für Sortierreihenfolge:

  • SORT_ASC - sortiere in aufsteigender Reihenfolge

  • SORT_DESC - sortiere in absteigender Reihenfolge

Flags für Sortiertypen:

  • SORT_REGULAR - vergleiche Felder normal

  • SORT_NUMERIC - vergleiche Felder numerisch

  • SORT_STRING - vergleiche Felder als Strings

Es kann nur ein Sortierflag des selben Typs nach jedem Array spezifiziert werden. Sortierflags nach einem Array Argument gelten nur für dieses Array, und werden vor jedem neuen Array Argument zu den Defaultflags SORT_ASC und SORT_REGULAR zurückgesetzt.

Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.

Beispiel 1. Sortieren mehrerer Arrays

$ar1 = array ("10", 100, 100, "a");
$ar2 = array (1, 3, "2", 1);
array_multisort ($ar1, $ar2);

In diesem Beispiel enthält das erste Array nach dem Sortieren 10, "a", 100, 100. Das zweite Array wird 1, 1, "2", 3 enthalten. Die Einträge des zweiten Arrays, welche den identischen Einträgen des ersten Arrays entsprechen (100 und 100) wurden ebenfalls sortiert.

Beispiel 2. Sortieren eines mehrdimensionalen Arrays

$ar = array (array ("10", 100, 100, "a"), array (1, 3, "2", 1));
array_multisort ($ar[0], SORT_ASC, SORT_STRING,
                 $ar[1], SORT_NUMERIC, SORT_DESC);

In diesem Beispiel enthält das erste Array nach dem Sortieren 10, 100, 100, "a" (wurde als Strings in aufsteigender Reihenfolge sortiert), und das zweite enthält 1, 3, "2", 1 (numerisch und absteigender Reihenfolge sortiert).

array_pad

(PHP 4 )

array_pad --  Vergrößert ein Array auf die spezifizierte Länge mit einem Wert

Beschreibung

array array_pad ( array input, int pad_size, mixed pad_value)

array_pad() liefert eine Kopie von input, welche auf die von pad_size spezifizierte Größe mit dem Wert pad_value erweitert wurde. Ist der Parameter pad_size positiv, wird das Array rechts erweitert, ist er negativ, dann erfolgt die Erweiterung links. Ist der absolute Wert von pad_size kleiner oder gleich der Länge von input, erfolgt keine Erweiterung.

Beispiel 1. array_pad()

$input = array (12, 10, 9);

$result = array_pad ($input, 5, 0);
// Ergebnis ist array (12, 10, 9, 0, 0)

$result = array_pad ($input, -7, -1);
// Ergebnis ist array (-1, -1, -1, -1, 12, 10, 9)

$result = array_pad ($input, 2, "noop");
// nicht erweitert

array_pop

(PHP 4 )

array_pop -- Liefert das letzte Element eines Arrays

Beschreibung

mixed array_pop ( array array)

array_pop() liefert den letzten Wert von array, und verkürzt array um ein Element. Ist array leer (oder kein Array), wird NULL zurückgegeben.

Anmerkung: This function will reset() the array pointer after use.

Beispiel 1. array_pop()

<?php
$stack = array ("Orange", "Banane", "Apfel", "Himbeere");
$fruit = array_pop ($stack);
print_r($stack);
?>

Danach hat $stack nur 3 Elemente:
Array
(
    [0] => Orange
    [1] => Banane
    [2] => Apfel
)
und Himbeere wird $fruit zugewiesen.

Warnung

Diese Funktion kann das Boolsche FALSE zurückliefern, kann aber auch einen nicht-Boolschen Wert zurückgeben, der von einem einfachen if-Statement als FALSE ausgewertet wird, wie zum Beispiel 0 oder "". Weitere Informationen entnehmen Sie bitte dem Abschnitt über Boolsche Typen. Benutzen Sie deshalb bitte den === Operator um den Rückgabewert dieser Funktion zu überprüfen.

Siehe auch array_push(), array_shift() und array_unshift().

array_push

(PHP 4 )

array_push --  Fügt ein oder mehr Elemente an das Ende eines Arrays

Beschreibung

int array_push ( array array, mixed var [, mixed ...])

array_push() behandelt array als Stapel (Stack), und fügt die übergebenen Variablen an das Ende von array. Die Länge von array wird dabei um die Anzahl der angefügten Variablen erhöht. Dies hat den selben Effekt wie:
$array[] = $var;
für jede Variable var wiederholt.

Liefert die neue Anzahl Elemente des Arrays.

Beispiel 1. array_push()

$stack = array ("Orange", "Banane");
array_push ($stack, "Apfel", "Himbeere");
print_r($stack);

Danach enthält $stack die folgenden Elemente:
Array
(
    [0] => Orange
    [1] => Banane
    [2] => Apfel
    [3] => Himbeere
)

Siehe auch array_pop(), array_shift() und array_unshift().

array_rand

(PHP 4 )

array_rand --  Liefert einen oder mehrere zufällige Einträge eines Arrays

Beschreibung

mixed array_rand ( array input [, int num_req])

array_rand() ist ziemlich nützlich, wenn Sie einen oder mehrere zufällige Einträge eines Arrays auswählen möchten. Die Funktion übernimmt das Array input, und ein optionales Argument num_req, welches die gewünschte Anzahl Einträge spezifiziert. Ist num_req nicht angegeben, wird ein Defaultwert von 1 angenommen.

Wenn Sie nur einen Eintrag auswählen, liefert array_rand() den Schlüssel eines zufälligen Eintrages. Andernfalls wird ein Array mit den Schlüsseln der zufälligen Einträge zurückgegeben. Dies hat den Zweck, dass Sie zufällige Schlüssel und auch Werte aus dem Array auswählen können.

Vergessen Sie bitte nicht, mittels srand() den Startwert für den Zufallsgenerator festzulegen.

Beispiel 1. array_rand()

srand ((float) microtime() * 10000000);
$input = array ("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand ($input, 2);
print $input[$rand_keys[0]]."\n";
print $input[$rand_keys[1]]."\n";

array_reduce

(PHP 4 >= 4.0.5)

array_reduce --  Iterative Reduktion eines Arrays zu einem Wert mittels einer Callback Funktion

Beschreibung

mixed array_reduce ( array input, callback function [, int initial])

array_reduce() wendet die Funktion function iterativ bei den Elementen des Arrays input so an, dass das Array auf einen einzigen Wert reduziert wird. Ist der optionale Parameter intial angegeben, wird er am Beginn des Prozesses benutzt oder als Resultat verwendet, sollte das Array leer sein.

Beispiel 1. array_reduce()

function rsum($v, $w) {
    $v += $w;
    return $v;
}

function rmul($v, $w) {
    $v *= $w;
    return $v;
}

$a = array(1, 2, 3, 4, 5);
$x = array();
$b = array_reduce($a, "rsum");
$c = array_reduce($a, "rmul", 10);
$d = array_reduce($x, "rsum", 1);

Hier enthält $b 15, $c 1200 (= 1*2*3*4*5*10), und $d enthält 1.

Siehe auch array_filter() und array_map().

array_reverse

(PHP 4 )

array_reverse --  Liefert ein Array mit umgekehrter Reihenfolge der Elemente

Beschreibung

array array_reverse ( array array [, bool preserve_keys])

array_reverse() liefert ein Array mit der umgekehrten Reihenfolge der Elemente von array. Ist der optionale Parameter preserve_keys TRUE, bleibt die Reihenfolge der Schlüssel aufrecht.

Beispiel 1. array_reverse()

$input  = array ("php", 4.0, array ("grün", "rot"));
$result = array_reverse ($input);
$result_keyed = array_reverse ($input, TRUE);

Danach haben $result und $result_keyed die gleichen Elemente, aber Beachten Sie den Unterschied zwischen den Schlüsseln. Die Ausgabe von $result und $result_keyed wird wie folgt aussehen:
Array
(
    [0] => Array
        (
            [0] => grün
            [1] => rot
        )

    [1] => 4
    [2] => php
)
Array
(
    [2] => Array
        (
            [0] => grün
            [1] => rot
        )

    [1] => 4
    [0] => php
)

Anmerkung: Der zweite Parameter wurde in PHP 4.0.3 hinzugefügt.

array_search

(PHP 4 >= 4.0.5)

array_search --  Durchsucht ein Array nach einem Wert liefert bei Erfolg den Schlüssel

Beschreibung

mixed array_search ( mixed needle, array haystack [, bool strict])

Diese Funktion durchsucht haystack nach needle und gibt bei Erfolg den Schlüssel zurück, andernfalls FALSE.

Anmerkung: Vor PHP 4.2.0 gibt array_search() im Fehlerfall NULL statt FALSE zurück.

Ist der optionale dritte Parameter strict auf TRUE gesetzt, prüft array_search() auch die Typen von needle in haystack.

Warnung

Diese Funktion kann das Boolsche FALSE zurückliefern, kann aber auch einen nicht-Boolschen Wert zurückgeben, der von einem einfachen if-Statement als FALSE ausgewertet wird, wie zum Beispiel 0 oder "". Weitere Informationen entnehmen Sie bitte dem Abschnitt über Boolsche Typen. Benutzen Sie deshalb bitte den === Operator um den Rückgabewert dieser Funktion zu überprüfen.

Siehe auch array_keys() und in_array().

array_shift

(PHP 4 )

array_shift --  Liefert ein Element vom Beginn eines Arrays

Beschreibung

mixed array_shift ( array array)

array_shift() liefert den ersten Wert von array, verschiebt die anderen Werte hinunter, und verkürzt array um ein Element. Alle numerischen Schlüssel werden so modifiziert, dass bei null zu zählen begonnen wird. Strings als Schlüssel bleiben unverändert. Ist array leer (oder kein Array), wird NULL zurückgegeben.

Anmerkung: This function will reset() the array pointer after use.

Beispiel 1. array_shift()

<?php
$stack = array ("Orange", "Banane", "Apfel", "Himbeere");
$fruit = array_shift ($stack);
print_r($stack);
?>

Danach blieben in $stack 3 Elemente übrig:
Array
(
    [0] => Banane
    [1] => Apfel
    [2] => Himbeere
)
und orange wird $fruit zugeordnet.

Siehe auch array_unshift(), array_push() und array_pop().

array_slice

(PHP 4 )

array_slice -- Extrahiert einen Ausschnitt eines Arrays

Beschreibung

array array_slice ( array array, int offset [, int length])

array_slice() liefert die mittels offset und length spezifizierte Sequenz von Elementen des Arrays array

Ist offset positiv, beginnt die Sequenz bei diesem Offset in dem array. Ist offset negativ, beginnt die Sequenz offset Elemente vor dem Ende von array.

Ist length positiv, enthält die Sequenz genauso viele Elemente. Ist length negativ, enthält die Sequenz alle Elemente des Arrays von offset bis length Elemente vor dem Ende des Arrays. Ist length nicht angegeben, enthält die Sequenz alle Elemente von offset bis zum Ende von array.

Beachten Sie, dass array_slice() Schlüssel ignoriert, und Offsets sowie Längen anhand der aktuellen Positionen berechnet.

Beispiel 1. array_slice()

$input = array ("a", "b", "c", "d", "e");

$output = array_slice ($input, 2);      // liefert "c", "d", und "e"
$output = array_slice ($input, 2, -1);  // liefert "c", "d"
$output = array_slice ($input, -2, 1);  // liefert "d"
$output = array_slice ($input, 0, 3);   // liefert "a", "b", und "c"

Siehe auch array_splice().

array_splice

(PHP 4 )

array_splice --  Entfernt einen Teil eines Arrays und ersetzt ihn durch etwas anderes

Beschreibung

array array_splice ( array input, int offset [, int length [, array replacement]])

array_splice() entfernt die durch offset und length angegebenen Elemente des Arrays input, und ersetzt diese durch die Elemente des Arrays replacement, wenn angegeben und gibt ein Array mit den entfernten Elemente zurück.

Ist offset positiv, beginnt der zu entfernende Bereich bei diesem Offset vom Anfang des Arrays input. Ist offset negativ, beginnt der zu entfernende Bereich offset Elemente vor dem Ende des Arrays input.

Ist length nicht angegeben, wird alles von offset bis zum Ende des Arrays entfernt. Ist length positiv, wird die angegebene Anzahl Elemente entfernt. Ist length negativ, dann wird der Bereich von length Elementen vor dem Ende, bis zum Ende des Arrays entfernt. Tipp: Um alles von offset bis zum Ende des Arrays zu entfernen wenn replacement ebenfalls angegeben ist, verwenden Sie count($input) als length.

Ist das Array replacement angegeben, werden die entfernten Elemente durch die Elemente dieses Arrays ersetzt. Sind offset und length so angegeben dass nichts entfernt wird, werden die Elemente von replacement an der von offset spezifizierten Stelle eingefügt. Tipp: Soll die Ersetzung durch nur ein Element erfolgen ist es nicht nötig ein Array zu anzugeben es sei denn, dieses Element ist selbst ein Array.

Hier einige Entsprechungen:

Tabelle 1. array_splice() equivalents

array_push($input, $x, $y) array_splice($input, count($input), 0, array($x, $y))
array_pop($input) array_splice($input, -1)
array_shift($input) array_splice($input, -1)
array_unshift($input, $x, $y) array_splice($input, 0, 0, array($x, $y))
$a[$x] = $y array_splice($input, $x, 1, $y)

Gibt das Array mit den entfernten Elementen zurück.

Beispiel 1. array_splice()

$input = array ("rot", "grün", "blau", "gelb");
array_splice ($input, 2);
// $input ist nun array ("rot", "grün")

$input = array ("rot", "grün", "blau", "gelb");
array_splice ($input, 1, -1);
// $input ist nun array ("rot", "gelb")

$input = array ("rot", "grün", "blau", "gelb");
array_splice ($input, 1, count($input), "orange");
// $input ist nun array ("rot", "orange")

$input = array ("rot", "grün", "blau", "gelb");
array_splice ($input, -1, 1, array("schwarz", "braun"));
// $input ist nun array ("rot", "grün", "blau", "schwarz", "braun")

Siehe auch array_slice().

array_sum

(PHP 4 >= 4.0.4)

array_sum --  Liefert die Summe der Werte in einem Array

Beschreibung

mixed array_sum ( array array)

array_sum() liefert die Summe der Werte eines Arrays als Integer oder Float.

Beispiel 1. array_sum()

$a = array(2, 4, 6, 8);
echo "sum(a) = ".array_sum($a)."\n";

$b = array("a"=>1.2,"b"=>2.3,"c"=>3.4);
echo "sum(b) = ".array_sum($b)."\n";

Obiges Programm wird folgendes ausgeben:
sum(a) = 20
sum(b) = 6.9

Anmerkung: PHP Versionen vor 4.0.6 haben das übergebene Array selbst modifiziert, und Strings in Zahlen konvertiert (welche abhängig von deren Wert meist zu null konvertiert wurden).

array_unique

(PHP 4 >= 4.0.1)

array_unique -- Entfernt doppelte Werte aus einem Array

Beschreibung

array array_unique ( array array)

array_unique() nimmt array und gibt ein neues Array zurück, aus dem alle doppelten Einträge entfernt wurden.

Beachten Sie, dass Schlüssel bewahrt bleiben. Erst behandelt array_unique() die Werte als Strings und sortiert sie, danach wird der erste gefundene Schlüssel behalten, und alle folgenden Schlüssel ignoriert. Das heißt nicht, dass der Schlüssel des ersten zugehörigen Wertes aus dem unsortierten array behalten wird.

Anmerkung: Zwei Elemente werden nur dann als gleich angesehen, wenn (string) $elem1 === (string) $elem2. In Worten: Wenn die String-Repräsentation die gleiche ist.

Das erste Element wird verwendet.

Beispiel 1. array_unique() example

<?php
$input = array ("a" => "grün", "rot", "b" => "grün", "blau", "rot");
$result = array_unique ($input);
print_r($result);
?>

Dies wird folgendes ausgeben:
Array
(
    [a] => grün
    [0] => rot
    [1] => blau
)

Beispiel 2. array_unique() und Typen

<?php
$input = array (4,"4","3",4,3,"3");
$result = array_unique ($input);
var_dump($result);
?>

Dies wird folgendes ausgeben:
array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

array_unshift

(PHP 4 )

array_unshift --  Fügt ein oder mehr Elemente am Anfang eines Arrays ein

Beschreibung

int array_unshift ( array array, mixed var [, mixed ...])

array_unshift() fügt die übergebenen Elemente am Anfang von array ein. Beachten Sie, dass die Liste von Elementen als Ganzes eingefügt wird, sodass die eingefügten Elemente die selbe Reihenfolge haben. Die numerischen Schlüssel werden so modifiziert, dass bei null zu zählen begonnen wird, Strings als Schlüssel bleiben unverändert.

Diese Funktion gibt die neue Anzahl der in array enthaltenen Elemente zurück.

Beispiel 1. array_unshift()

$queue = array ("Orange", "Banane");
array_unshift ($queue, "Apfel", "Himbeere");

Als Ergebnis enthält $queue die folgenden Elemente:
Array
(
    [0] => Apfel
    [1] => Himbeere
    [2] => Orange
    [3] => Banane
)

Siehe auch array_shift(), array_push() und array_pop().

array_values

(PHP 4 )

array_values -- Liefert alle Werte eines Arrays

Beschreibung

array array_values ( array input)

array_values() liefert alle Werte des Arrays input mit einem numerischen Index.

Beispiel 1. array_values()

$array = array ("größe" => "XL", "farbe" => "gold");
print_r(array_values ($array));

Dies wird folgendes ausgeben:
Array
(
    [0] => XL
    [1] => gold
)

Anmerkung: Diese Funktion wurde in PHP 4 hinzugefügt, nachstehend findet sich eine Implementation für Benutzer von PHP 3.

Beispiel 2. Implementation von array_values() für PHP 3 Benutzer

function array_values ($arr) {
    $t = array();
    while (list($k, $v) = each ($arr)) {
        $t[] = $v;
    }
    return $t;
}

Siehe auch array_keys().

array_walk

(PHP 3>= 3.0.3, PHP 4 )

array_walk --  Wendet eine Benutzerfunktion an jedem Element eines Arrays an

Beschreibung

int array_walk ( array array, callback function [, mixed userdata])

Wendet die mittels function angegebene Benutzerfunktion für jedes Element von array an. function benötigt zwei Parameter. Der Wert von array wird als erster übergeben, und der Schlüssel/Index als zweites. Ist der optionale Parameter userdata angegeben, so wird er als dritter Parameter an die Funktion function übergeben.

Sollte function mehr als die ihr übergebenen Parameter benötigen, wird bei jedem Aufruf von function seitens array_walk() eine Fehlermeldung der Stufe E_WARNING generiert. Diese Warnmeldungen können unterdrückt werden, indem man dem Funktionsaufruf von array_walk() den Operator @ voranstellt, oder error_reporting() verwendet.

Anmerkung: Wenn function direkt mit den Werten des Arrays arbeiten soll, spezifizieren Sie den ersten Parameter von function als Referenz. Dann werden alle Änderungen an diesen Elementen direkt in dem originalen Array durchgeführt.

Die Modifizierung des Arrays aus function heraus könnte ein unvorhersehbares Verhalten hervorrufen.

Anmerkung: Die Übergabe des Schlüssels und von userdata an function wurde mit PHP 4.0.0 eingeführt.

array_walk() ist nicht von dem internen Arrayzeiger von array betroffen. array_walk() geht ungeachtet der Zeigerposition das gesamte Array durch. Um den Zeiger zurückzusetzen, verwenden Sie reset(). In PHP 3 setzt array_walk() den Zeiger zurück.

Von der Benutzerfunktion aus darf das Array selbst nicht geändert werden, wie zum Beispiel durch Hinzufügen oder Löschen eines Elementes, etc. Wird das auf array_walk() angewendete Array geändert, so ist das Verhalten dieser Funktion undefiniert und unvorhersagbar.

Beispiel 1. array_walk()

<?php
$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");

function test_alter (&$item1, $key, $prefix) {
    $item1 = "$prefix: $item1";
}

function test_print ($item2, $key) {
    echo "$key. $item2<br>\n";
}

echo "Vorher ...:\n";
array_walk ($fruits, 'test_print');

array_walk ($fruits, 'test_alter', 'Frucht');
echo "... und nachher:\n";

array_walk ($fruits, 'test_print');
?>

Das obige Programm wird folgendes ausgeben:
Vorher ...:
d. Zitrone
a. Orange
b. Banane
c. Apfel
... und nachher:
d. Frucht: Zitrone
a. Frucht: Orange
b. Frucht: Banane
c. Frucht: Apfel

Siehe auch list(), foreach, each() und call_user_func_array().

array

(PHP 3, PHP 4 )

array --  Erstellt ein Array

Beschreibung

array array ( [mixed ...])

Gibt ein den Parametern entsprechendes Array zurück. Mit dem => Operator können die Parameter indiziert werden.

Anmerkung: array() ist keine richtige Funktion sondern ein Sprachkonstrukt, das zur Erzeugung eines Wertefeldes genutzt wird.

Die Syntax "Index => Werte", durch Kommas getrennt, definiert Index und Werte. Index kann vom Typ String oder numerisch sein. Wird der Index weggelassen, erstellt die Funktion automatisch einen numerischen Index, der bei 0 beginnt. Ist der Index als Integer-Wert angegeben, wird der nächste generierte Index der größte Integer Index + 1. Beachten Sie, dass wenn zwei identische Indexe definiert sind, der letzte den ersten überschreibt.

Das folgende Beispiel zeigt wie man ein zweidimensionales Array erstellt, wie man Schlüssel für assoziative Arrays festlegt, und wie man numerische Indizes in normalen Arrays überspringt und fortsetzt.

Beispiel 1. array()

$fruits = array (
    "Früchte" => array ("a"=>"Orange", "b"=>"Banane", "c"=>"Apfel"),
    "Zahlen"  => array (1, 2, 3, 4, 5, 6),
    "Löcher"  => array ("erstes", 5 => "zweites", "drittes")
);

Beispiel 2. Automatischer Index mit array()

$array = array( 1, 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13);
print_r($array);

wird folgendes anzeigen:
Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 13
    [4] => 1
    [8] => 1
    [9] => 19
)

Beachten Sie, dass Index '3' doppelt definiert ist, und den letzten definierten Wert 13 behält. Index 4 wurde nach dem Index 8 definiert, und der nächste generierte Index (Wert 19) ist 9, da der größte Index 8 war.

Dieses Beispiel erstellt ein auf dem Index 1 basierendes Array.

Beispiel 3. 1-basierter Index mit array()

$erstesquartal  = array(1 => 'Januar', 'Februar', 'März');
print_r($erstesquartal);

wird folgendes ausgeben:
Array
(
    [1] => Januar
    [2] => Februar
    [3] => März
)

Siehe auch array_pad(), list() und range().

arsort

(PHP 3, PHP 4 )

arsort --  Sortiert ein Array in umgekehrter Reihenfolge und behält die Verbindung zum Index

Beschreibung

void arsort ( array array [, int sort_flags])

Diese Funktion sortiert ein Array so, dass der Zusammenhang zwischen den Indizes und den entsprechenden Arrayelementen erhalten bleibt. Dies wird hauptsächlich bei assoziativen Arrays verwendet, bei denen die aktuelle Reihenfolge der Elemente bedeutend ist.

Beispiel 1. arsort()

$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");
arsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

Dieses Beispiel würde folgendes ausgeben:
d = Zitrone
a = Orange
b = Banane
c = Apfel

Die Früchte wurden in umgekehrter alphabetischer Reihenfolge sortiert, und die Zuordnung zwischen Index und Element blieb beibehalten.

Sie können das Verhalten der Sortierung mittels dem optionalen Parameter sort_flags beeinflussen, für Details siehe sort().

Siehe auch asort(), rsort(), ksort() und sort().

asort

(PHP 3, PHP 4 )

asort --  Sortiert ein Array und behält die Indexverbindungen

Beschreibung

void asort ( array array [, int sort_flags])

Diese Funktion sortiert ein Array so, dass der Zusammenhang zwischen den Indizes und den entsprechenden Arrayelementen erhalten bleibt. Dies wird hauptsächlich bei assoziativen Arrays verwendet, bei denen die aktuelle Reihenfolge der Elemente bedeutend ist.

Beispiel 1. asort()

$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");
asort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

Dieses Beispiel würde folgendes ausgeben:
c = Apfel
b = Banane
a = Orange
d = Zitrone

Die Früchte wurden alphabetisch sortiert, und die Zuordnung zwischen Index und Element blieb beibehalten

Sie können das Verhalten der Sortierung mittels dem optionalen Parameter sort_flags beeinflussen, für Details siehe sort().

Siehe auch arsort(), rsort(), ksort() und sort().

compact

(PHP 4 )

compact --  Erstellt ein Array mit Variablen und deren Werten

Beschreibung

array compact ( mixed varname [, mixed ...])

compact() übernimmt eine variable Anzahl von Parametern. Jeder Parameter kann entweder ein String mit einem Variablennamen, oder ein Array mit Variablennamen sein. Dieses Array kann auch andere Arrays mit Variablennamen enthalten; compact() behandelt sie rekursiv.

Für alle diese sucht compact() nach einer Variablen in der aktuellen Symboltabelle, und fügt diese dem zurückzugebenden Array hinzu, wobei der Variablenname als Schlüssel, und der Inhalt der Variablen als Wert gespeichert wird. Kurz, diese Funktion tut das Gegenteil von extract(). Sie gibt ein Array mit allen Variablen zurück.

Strings, welche nicht gesetzt sind, werden einfach ignoriert.

Beispiel 1. compact()

$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array ("city", "state");

$result = compact ("event", "nothing_here", $location_vars);

Danach wird $result:
Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

Siehe auch extract().

count

(PHP 3, PHP 4 )

count -- Zählt die Elemente einer Variable

Beschreibung

int count ( mixed var)

Liefert die Anzahl von Elementen in var, welche typischerweise ein Array ist (da alles andere ein Element enthält).

Ist var kein Array, wird 1 zurückgegeben (Ausnahme: count(NULL) ist gleich 0).

Warnung

count() kann 0 zurückgeben wenn die Variable nicht gesetzt ist, aber sie könnte ebenfalls 0 zurückgeben, wenn eine Variable als leeres Array initialisiert wurde. Verwenden Sie isset() um zu testen, ob eine Variable gesetzt ist.

In der Sektion Arrays finden Sie eine detaillierte Erklärung, wie Arrays in PHP implementiert sind und wie sie benutzt werden.

Beispiel 1. count()

$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
$result = count ($a);
//$result == 3

$b[0] = 7;
$b[5] = 9;
$b[10] = 11;
$result = count ($b);
// $result == 3;

Anmerkung: Die Funktion sizeof() ist ein Alias für count().

Siehe auch is_array(), isset() und strlen().

current

(PHP 3, PHP 4 )

current -- Liefert das aktuelle Element eines Arrays

Beschreibung

mixed current ( array array)

Jedes Array hat einen internen Zeiger auf sein "aktuelles" Element, welcher auf das erste in das Array eingefügte Element initialisiert wird.

Die Funktion current() liefert das Array Element, auf das gerade vom internen Zeiger gezeigt wird. Sie bewegt den Zeiger in keinster Weise. Zeigt der interne Zeiger hinter das Ende der Elementenliste, gibt current() FALSE zurück.

Warnung

Enthält das Array leere Elemente (0 oder "", den leeren String), gibt diese Funktion auch für diese Elemente FALSE zurück. Das macht es unmöglich, unter Verwendung von current() herauszufinden, ob das wirklich am Ende der Liste sind. Um ein Array, das leere Elemente enthalten könnte richtig durchzugehen, verwenden Sie die Funktion each().

Siehe auch end(), next(), prev() und reset().

each

(PHP 3, PHP 4 )

each --  Liefert das aktuelle Paar (Schlüssel und Wert) eines Arrays und rückt den Array Cursor vor.

Beschreibung

array each ( array array)

Liefert das aktuelle Schlüssel- Wertepaar des Arrays array, und erhöht den Array Cursor. Dieses Paar wird als Array mit 4 Elementen zurückgegeben, und zwar mit den Schlüsseln 0, 1, key, und value. Die Elemente 0 und key enthalten den Namen des Schlüssels, 1 und value den Wert.

Zeigt der interne Zeiger hinter das Ende der Array-Inhalte, gibt each() FALSE zurück.

Beispiel 1. each() Beispiele

$foo = array ("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each ($foo);
print_r($bar);

$bar enthält nun die folgenden Schlüssel/Wert Paare:
Array
(
    [1] => bob
    [value] => bob
    [0] => 0
    [key] => 0
)
$foo = array ("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each ($foo);
print_r($bar);

$bar enthält nun die folgenden Schlüssel/Wert Paare:
Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)

each() wird typischerweise in Verbindung mit list() verwendet, um ein Array durchzugehen; zum Beispiel $_POST:

Beispiel 2. Durchgehen von $_POST mit each()

echo "Werte, die mit der POST Methode übertragen wurden:<br />";
reset ($_POST);
while (list ($key, $val) = each ($_POST)) {
    echo "$key => $val<br />\n";
}

Nachdem each() ausgeführt wurde, bleibt der Array Cursor beim nächsten Element des Arrays, oder wenn am Ende des Arrays angelangt, bei dem letzten Element. Sie müssen reset() verwenden, wenn Sie das Array erneut mittels each durchgehen wollen.

Siehe auch key(), list(), current(), reset(), next(), prev() und foreach.

end

(PHP 3, PHP 4 )

end --  Positioniert den internen Zeiger eines Arrays auf dessen letztes Element

Beschreibung

mixed end ( array array)

end() rückt den internen Zeiger von array bis zum letzten Element vor, und gibt dieses Element zurück.

Beispiel 1. Ein einfaches end() Beispiel

<?php

  $fruits = array('apple','banana','cranberry');
    
  print end($fruits); // cranberry
      
?>

Siehe auch current(), each(), next() und reset().

extract

(PHP 3>= 3.0.7, PHP 4 )

extract --  Importiert Variablen eines Arrays in die aktuelle Symboltabelle

Beschreibung

int extract ( array var_array [, int extract_type [, string prefix]])

Diese Funktion wird verwendet, um Variablen eines Arrays in die aktuelle Symboltabelle zu importieren. Es behandelt die Schlüssel des assoziativen Arrays var_array als Variablennamen, und die Werte als Variablenwerte. Für jedes Paar Schlüssel/Wert wird - abhängig von den Parametern extract_type und prefix - eine Variable in der aktuellen Symboltabelle eingetragen.

Anmerkung: Seit Version 4.0.5 gibt diese Funktion die Anzahl der extrahierten Variablen zurück.

Anmerkung: EXTR_IF_EXISTS und EXTR_PREFIX_IF_EXISTS wurden in Version 4.2.0. eingeführt.

Anmerkung: EXTR_REFS wurde in Version 4.3.0 eingeführt.

extract() prüft jeden Schlüssel, ob dieser einen gültigen Variablennamen ergibt, und auch auf eventuelle Kollisionen mit existierenden Variablen in der Symboltabelle. Die Art, wie ungültige/numerische Schlüssel und Kollisionen behandelt werden, wird mit extract_type spezifiziert. Es kann einen der folgenden Werte annehmen:

EXTR_OVERWRITE

Im Falle einer Kollision wird die existierende Variable überschrieben.

EXTR_SKIP

Im Falle einer Kollision wird die existierende Variable nicht überschrieben.

EXTR_PREFIX_SAME

Im Falle einer Kollision wird dem Variablennamen prefix vorangestellt.

EXTR_PREFIX_ALL

Allen Variablennamen wird prefix vorangestellt. Seit PHP 4.0.5 gilt dies auch für numerische Variablen.

EXTR_PREFIX_INVALID

Nur ungültigen/numerischen Variablennamen wird prefix vorangestellt. Dieser Flag wurde mit PHP 4.0.5 eingeführt.

EXTR_IF_EXISTS

Überschreibt die Variable nur, wenn sie bereits in der aktuellen Symboltabelle existiert, sonst geschieht nichts. Dies ist dann hilfreich, wenn Sie eine Liste mit gültigen Variablen definieren, und dann z.B. nur jene Variablen extrahieren, welche Sie aus $_REQUEST definiert haben. Dieser Flag wurde in PHP 4.2.0 eingeführt.

EXTR_PREFIX_IF_EXISTS

Erstellt nur Variablennamen mit Präfix, wenn die Version ohne Präfix der selben Variable in der aktuellen Symboltabelle existiert. Dieser Flag wurde in PHP 4.2.0 eingeführt.

EXTR_REFS

Extrahiert Variablen als Referenzen. Das heißt, dass die Werte der importierten Variablen noch immer auf die Werte des Parameters var_array referenzieren. Sie können diesen Flag alleine oder auch in Kombination mit einem anderen Flag verwenden, indem Sie Oder-Verknüpfungen im extract_type erstellen. Dieser Flag wurde in PHP 4.3.0 eingeführt.

Ist extract_type nicht spezifiziert, so wird EXTR_OVERWRITE angenommen.

Beachten Sie, dass prefix nur dann nötig ist, wenn extract_type EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID or EXTR_PREFIX_IF_EXISTS ist. Ist das Resultat trotz Präfix kein gültiger Variablenname, wird es nicht in die Symboltabelle importiert.

extract() gibt die Anzahl erfolgreich in die Symboltabelle importierter Variablen zurück.

Eine mögliche Verwendung für extract() ist der Import der Variablen in einem von wddx_deserialize() gelieferten assoziativen Array in die Symboltabelle.

Beispiel 1. extract()

<?php

/* Annahme: $var_array ist ein von wddx_deserialize
   zurückgegebenes Array */

$groesse = "groß";
$var_array = array ("farbe"   => "blau",
                    "groesse" => "mittel",
                    "form"    => "Kugel");
extract ($var_array, EXTR_PREFIX_SAME, "wddx");

print "$farbe, $groesse, $form, $wddx_groesse\n";

?>

Das obige Beispiel wird folgendes ausgeben:
blau, groß, Kugel, mittel

$size wurde nicht überschrieben, da wir EXTR_PREFIX_SAME spezifiziert haben, was im Anlegen von $wddx_size endete. Wäre EXTR_SKIP spezifiziert worden, dann wäre $wddx_size nicht angelegt worden. EXTR_OVERWRITE hätte $size mit dem Wert "medium" überschrieben, und EXTR_PREFIX_ALL hätte die neuen Variablen $wddx_color, $wddx_size, und $wddx_shape angelegt.

Sie müssen assoziative Arrays benutzen, numerisch indizierte Arrays liefern keine Resultate, außer Sie verwenden EXTR_PREFIX_ALL oder EXTR_PREFIX_INVALID.

Siehe auch compact().

in_array

(PHP 4 )

in_array -- Prüft, ob ein Wert in einem Array existiert

Beschreibung

bool in_array ( mixed needle, array haystack [, bool strict])

Diese Funktion sucht in haystack nach needle und gibt bei Erfolg TRUE zurück, andernfalls FALSE.

Ist der dritte Parameter strict auf TRUE gesetzt, prüft in_array() auch die Typen von needle in haystack.

Anmerkung: Ist needle ein String, erfolgt der Vergleich unter Berücksichtigung der Groß- und Kleinschreibung.

Anmerkung: In den PHP Versionen vor 4.2.0 durfte needle kein Array sein

Beispiel 1. in_array()

$os = array ("Mac", "NT", "Irix", "Linux");
if (in_array ("Irix", $os)) {
    print "Got Irix";
}
if (in_array ("mac", $os)) {
    print "Got mac";
}

Die zweite Bedingung schlägt fehl, da in_array() die Groß-/Kleinschreibung berücksichtigt, daher wird das obige Programm folgendes ausgeben:
Got Irix

Beispiel 2. in_array() mit strict

<?php
$a = array('1.10', 12.4, 1.13);

if (in_array('12.4', $a, TRUE))
    echo "'12.4' gefunden mit strict check\n";
if (in_array(1.13, $a, TRUE))
    echo "1.13 gefunden mit strict check\n";
?>

Dies wird folgendes anzeigen:
1.13 gefunden mit strict check

Beispiel 3. in_array() mit einem Array als needle

<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array ('p', 'h'), $a))
    echo "'ph' wurde gefunden\n";
if (in_array(array ('f', 'i'), $a))
    echo "'fi' wurde nicht gefunden\n";
if (in_array('o', $a))
    echo "'o' wurde gefunden\n";
?>

// Dies wird folgendes anzeigen:

'ph' wurde gefunden
'o' wurde gefunden

Siehe auch array_search().

key

(PHP 3, PHP 4 )

key --  Liefert einen Schlüssel eines assoziativen Arrays

Beschreibung

mixed key ( array array)

key() liefert das Index Element der aktuellen Position im Array.

Siehe auch current() und next().

krsort

(PHP 3>= 3.0.13, PHP 4 )

krsort --  Sortiert ein Array nach Schlüsseln in umgekehrter Reihenfolge

Beschreibung

int krsort ( array array [, int sort_flags])

Sortiert ein Array nach Schlüsseln in umgekehrter Reihenfolge, wobei die Zuordnungen zwischen Schlüssel und Wert erhalten bleiben. Dies ist hauptsächlich bei assoziativen Arrays hilfreich.

Beispiel 1. krsort()

$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");
krsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

Dieses Beispiel würde folgendes ausgeben:

d = Zitrone
c = Apfel
b = Banane
a = Orange

Sie können das Verhalten der Sortierung mittels dem optionalen Parameter sort_flags beeinflussen, für Details siehe sort().

Siehe auch asort(), arsort(), ksort(), sort(), natsort() und rsort().

ksort

(PHP 3, PHP 4 )

ksort -- Sortiert ein Array nach Schlüsseln

Beschreibung

int ksort ( array array [, int sort_flags])

Sortiert ein Array nach Schlüsseln, wobei die Zuordnungen zwischen Schlüssel und Wert erhalten bleiben. Dies ist hauptsächlich bei assoziativen Arrays hilfreich.

Beispiel 1. ksort()

$fruits = array ("d"=>"Zitrone", "a"=>"Orange", "b"=>"Banane", "c"=>"Apfel");
ksort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

Dieses Beispiel würde folgendes ausgeben:

a = Orange
b = Banane
c = Apfel
d = Zitrone

Sie können das Verhalten der Sortierung mittels dem optionalen Parameter sort_flags beeinflussen, für Details siehe sort().

Siehe auch asort(), arsort(), krsort(), uksort(), sort(), natsort() und rsort().

Anmerkung: Der zweite Parameter wurde mit PHP 4 eingeführt.

list

(PHP 3, PHP 4 )

list --  Weist Variablen zu, als wären sie ein Array

Beschreibung

void list ( mixed ...)

Wie array() ist auch dies keine wirkliche Funktion, sondern ein Sprachkonstrukt. list() wird verwendet, um eine Liste von Variablen innerhalb einer Operation zuzuweisen.

Anmerkung: list() funktioniert nur bei numerischen Arrays und basiert auf der Annahme, dass die numerischen Indizes bei 0 beginnen.

Beispiel 1. list()

<?php

$info = array('coffee', 'brown', 'caffeine');

// Auflisten aller Variablen
list($drink, $color, $power) = $info;
print "$drink is $color and $power makes it special.\n";

// Ein paar davon auflisten
list($drink, , $power) = $info;
print "$drink has $power.\n";

// Oder nur die dritte ausgeben
list( , , $power) = $info;
print "I need $power!\n";

?>

Beispiel 2. list()

<table>
 <tr>
  <th>Mitarbeitername</th>
  <th>Gehalt</th>
 </tr>

<?php

$result = mysql_query ("SELECT id, name, salary FROM employees",$conn);
while (list ($id, $name, $salary) = mysql_fetch_row ($result)) {
    print (" <tr>\n".
           "  <td><a href=\"info.php?id=$id\">$name</a></td>\n".
           "  <td>$salary</td>\n".
           " </tr>\n");
}

?>

</table>

Warnung

list() weist die Werte von rechts beginnend zu. Wenn Sie einfache Variablen benutzen, brauchen Sie sich nicht darum zu kümmern. Wenn Sie jedoch Arrays mit Indizes verwenden, erwarten Sie gewöhnlich die Reihenfolge der Indizes in dem Array genau so, wie Sie sie in list() geschrieben haben (von links nach rechts), was jedoch nicht der Fall ist. Es wird in der umgekehrten Reihenfolge zugewiesen.

Beispiel 3. list() mit Array Indizes verwenden

<?php

$info = array('coffee', 'brown', 'caffeine');

list($a[0], $a[1], $a[2]) = $info;

var_dump($a);

?>
Die Ausgabe (Beachten Sie die Reihenfolge der Elemente, verglichen mit der in list() eingetragenen Reihenfolge):
array(3) {
  [2]=>
  string(8) "caffeine"
  [1]=>
  string(5) "brown"
  [0]=>
  string(6) "coffee"
}

Siehe auch each(), array() und extract().

natcasesort

(PHP 4 )

natcasesort --  Sortiert ein Array in "natürlicher Reihenfolge", Groß/Kleinschreibung wird ignoriert

Beschreibung

void natcasesort ( array array)

Diese Funktion implementiert einen Sortieralgorithmus, welcher alphanumerische Zeichenketten reiht, wie es auch ein Mensch tun würde. Das wird als "natürliche Reihenfolge" bezeichnet.

natcasesort() arbeitet wie natsort(), nur dass es die Groß/Kleinschreibung ignoriert. Ein Beispiel für den Unterschied zwischen diesem und dem normalen Sortieralgorithmus für Strings eines Computers finden Sie in natsort().

Detailliertere Informationen finden Sie auf Martin Pool's Natural Order String Comparison Seite.

Siehe auch sort(), natsort(), strnatcmp() und strnatcasecmp().

natsort

(PHP 4 )

natsort --  Sortiert ein Array in "natürlicher Reihenfolge"

Beschreibung

void natsort ( array array)

Diese Funktion implementiert einen Sortieralgorithmus, welcher alphanumerische Zeichenketten reiht, wie es auch ein Mensch tun würde. Hier ein Beispiel für den Unterschied zwischen diesem und dem normalen Sortieralgorithmus für Strings eines Computers (verwendet in sort()):

Beispiel 1. natsort()

<?php
$array1 = $array2 = array ("img12.png", "img10.png", "img2.png", "img1.png");
sort ($array1);
echo "Standardsortierung\n";
print_r ($array1);

natsort ($array2);
echo "\nSortieren mit natürlicher Reihenfolge\n";
print_r ($array2);
?>

Der obige Code wird folgendes anzeigen:

Standardsortierung
Array
(
    [0] => img1.png
    [1] => img10.png
    [2] => img12.png
    [3] => img2.png
)

Sortieren mit natürlicher Reihenfolge
Array
(
    [3] => img1.png
    [2] => img2.png
    [1] => img10.png
    [0] => img12.png
)
Detailliertere Informationen finden Sie auf Martin Pool's Natural Order String Comparison Seite.

Anmerkung: Wenn Sie die Index/Wert Assoziationen beibehalten wollen, denken Sie an die Verwendung von usort($arr, 'strnatcmp').

Siehe auch natcasesort(), strnatcmp() und strnatcasecmp().

next

(PHP 3, PHP 4 )

next --  Rückt den internen Zeiger eines Arrays vor

Beschreibung

mixed next ( array array)

Diese Funktion gibt das nächste Element des Arrays zurück, auf das der interne Zeiger des Arrays gerade zeigt. Sind keine Elemente mehr vorhanden, wird FALSE zurückgegeben.

next() verhält sich ähnlich wie current(), mit einem Unterschied. Der interne Zeiger wird um ein Element vorgerückt, bevor das Element zurückgegeben wird, d.h. es wird das nächste Element zurückgegeben, und der interne Zeiger um eins erhöht. Zeigt der interne Zeiger hinter das Ende der Elementliste, wird FALSE zurückgegeben.

Warnung

Enthält das Array leere Elemente oder Elemente mit dem Schlüssel 0, wird für diese Elemente ebenfalls FALSE zurückgegeben. Um ein Array, das leere Elemente oder Elemente mit dem Schlüssel 0 enthalten könnte richtig durchzugehen, verwenden Sie die Funktion each().

Siehe auch current(), end(), prev() und reset().

pos

(PHP 3, PHP 4 )

pos -- Liefert das aktuelle Element eines Arrays

Beschreibung

mixed pos ( array array)

Dies ist nur ein Alias für die Funktion current().

Siehe auch end(), next(), prev() und reset().

prev

(PHP 3, PHP 4 )

prev --  Verkleinert den internen Zeiger eines Arrays

Beschreibung

mixed prev ( array array)

Liefert das Element vor der Position des Arrays, auf die der interne Zeiger gerade zeigt. Sind keine Elemente mehr vorhanden, wird FALSE zurückgegeben.

Warnung

Enthält das Array leere Elemente, wird für diese ebenfalls FALSE zurückgegeben. Um ein Array mit leeren Elementen richtig durchzugehen, verwenden Sie die Funktion each().

prev() verhält sich wie next(), nur dass hier der interne Zeiger um eine Position zurück, und nicht nach vorne gerückt wird.

Siehe auch current(), end(), next() und reset().

range

(PHP 3>= 3.0.8, PHP 4 )

range --  Erstellt ein Array mit einem Bereich von Elementen

Beschreibung

array range ( int low, int high [, int step])

range() gibt ein Array mit Elementen im Bereich von low bis high zurück. Wenn low > high, wird die Sequenz von high nach low sein.

Neuer Parameter: Der optionale Parameter step wurde in 5.0.0 eingeführt.

Ist ein step Wert angegeben, wird es Schrittweite zwischen den Elementen in der Sequenz verwendet. step sollte als positive Zahl angegeben werden. Ist step nicht angegeben, wird automatisch der Wert 1 angenommen.

Beispiel 1. range()

<?php
// array(0,1,2,3,4,5,6,7,8,9)
foreach(range(0, 9) as $number) {
    echo $number;
}

// Der Parameter step wurde in PHP 5.0.0 eingeführt
// array(0,10,20,30,40,50,60,70,80,90,100)
foreach(range(0, 100, 10) as $number) {
    echo $number;
}

// Die Verwendung von Zeichen wurde in 4.1.0 eingeführt
// array('a','b','c','d','e','f','g','h','i');
foreach(range('a', 'i') as $letter) {
    echo $letter;
}
// array('c','b','a');
foreach(range('c', 'a') as $letter) {
    echo $letter;
}
?>

Anmerkung: Vor der Version 4.1.0 hat die Funktion range() nur aufsteigende Integer Arrays erstellt. Die Unterstützung für Zeichenfolgen und Arrays in absteigender Reihenfolge wurde in 4.1.0 hinzugefügt.

Siehe auch shuffle() und foreach.

reset

(PHP 3, PHP 4 )

reset --  Setzt den internen Zeiger eines Arrays auf sein erstes Element

Beschreibung

mixed reset ( array array)

reset() setzt den internen Zeiger von array auf das erste Element zurück.

reset() gibt den Wert des ersten Arrayelements zurück.

Siehe auch current(), each(), next() und prev().

rsort

(PHP 3, PHP 4 )

rsort --  Sortiert ein Array in umgekehrter Reihenfolge

Beschreibung

void rsort ( array array [, int sort_flags])

Diese Funktion sortiert ein Array in umgekehrter Reihenfolge (vom höchsten zum niedrigsten Wert).

Beispiel 1. rsort()

$fruits = array ("Zitrone", "Orange", "Banane", "Apfel");
rsort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "$key = $val\n";
}

Dieses Beispiel würde folgendes ausgeben:

0 = Zitrone
1 = Orange
2 = Banane
3 = Apfel

Die Früchte wurden in umgekehrter alphabetischer Reihenfolge sortiert.

Sie können das Verhalten der Sortierung mittels dem optionalen Parameter sort_flags beeinflussen, für Details siehe sort().

Siehe auch arsort(), asort(), ksort(), sort() und usort().

shuffle

(PHP 3>= 3.0.8, PHP 4 )

shuffle -- Mischt die Elemente eines Arrays

Beschreibung

void shuffle ( array array)

Diese Funktion mischt die Reihenfolge der Elemente eines Arrays zufällig (shuffle). Benutzen Sie srand(), um den Startwert für den Zufallsgenerator festzulegen.

Beispiel 1. shuffle()

$numbers = range (1,20);
srand ((float)microtime()*1000000);
shuffle ($numbers);
while (list (, $number) = each ($numbers)) {
    echo "$number ";
}

Siehe auch arsort(), asort(), ksort(), rsort(), sort() und usort().

sizeof

(PHP 3, PHP 4 )

sizeof -- Liefert die Anzahl Elemente einer Variable

Beschreibung

int sizeof ( mixed var)

Die Funktion sizeof() ist ein Alias für count().

Siehe auch count().

sort

(PHP 3, PHP 4 )

sort -- Sortiert ein Array

Beschreibung

void sort ( array array [, int sort_flags])

Diese Funktion sortiert ein Array. Die Elemente werden aufsteigend vom niedrigsten zum höchsten Wert sortiert.

Beispiel 1. sort()

<?php

$fruits = array ("Zitrone", "Orange", "Banane", "Apfel");
sort ($fruits);
reset ($fruits);
while (list ($key, $val) = each ($fruits)) {
    echo "fruits[".$key."] = ".$val."\n";
}

?>

Dieses Beispiel würde folgendes anzeigen:

fruits[0] = Apfel
fruits[1] = Banane
fruits[2] = Orange
fruits[3] = Zitrone

Die Früchte wurden in alphabetischer Reihenfolge sortiert.

Der optionale zweite Parameter sort_flags kann benutzt werden, um das Sortierverhalten mit den folgenden Flags zu beeinflussen.

Flags für Sortiertypen:

  • SORT_REGULAR - Vergleiche Einträge normal

  • SORT_NUMERIC - Vergleiche Einträge numerisch

  • SORT_STRING - Vergleiche Einträge als Strings

Siehe auch arsort(), asort(), ksort(), natsort(), natcasesort(), rsort(), usort(), array_multisort() und uksort().

Anmerkung: Der zweite Parameter wurde in PHP 4 eingeführt.

uasort

(PHP 3>= 3.0.4, PHP 4 )

uasort --  Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.

Beschreibung

void uasort ( array array, callback cmp_function)

Diese Funktion sortiert ein Array so, dass die Beziehung der Indices zu den Arrayelementen beibehalten bleibt. Dies wird hauptsächlich bei assoziativen Arrays angewandt, wenn die aktuelle Reihenfolge der Arrayelemente signifikant ist. Die Vergleichsfunktion wird vom Benutzer definiert.

Anmerkung: Siehe usort() und uksort() für Beispiele von benutzerdefinierten Vergleichsfunktionen

Siehe auch usort(), uksort(), sort(), asort(), arsort(), ksort(), und rsort().

uksort

(PHP 3>= 3.0.4, PHP 4 )

uksort --  Sortiert ein Array nach Schlüsseln mittels einer benutzerdefinierten Vergleichsfunktion.

Beschreibung

void uksort ( array array, callback cmp_function)

Diese Funktion sortiert die Schlüssel eines Arrays mittels einer benutzerdefinierten Vergleichsfunktion. Soll das Array nach nicht trivialen Kriterien sortiert werden, sollten Sie diese Funktion verwenden.

Beispiel 1. uksort()

function cmp ($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (4 => "vier", 3 => "drei", 20 => "zwanzig", 10 => "zehn");

uksort ($a, "cmp");

while (list ($key, $value) = each ($a)) {
    echo "$key: $value\n";
}

Dieses Beispiel würde folgendes ausgeben:

20: zwanzig
10: zehn
4: vier
3: drei

Siehe auch usort(), uasort(), sort(), asort(), arsort(), ksort(), natsort() und rsort().

usort

(PHP 3>= 3.0.3, PHP 4 )

usort --  Sortiert ein Array nach Werten mittels einer benutzerdefinierten Vergleichsfunktion.

Beschreibung

void usort ( array array, callback cmp_function)

Diese Funktion sortiert ein Array nach seinen Werten mittels einer benutzerdefinierten Vergleichsfunktion. Soll das Array nach nicht trivialen Kriterien sortiert werden, sollten Sie diese Funktion verwenden.

Die Vergleichsfunktion muss einen Integer zurückgeben, der kleiner, gleich, oder größer ist als NULL, wenn für das erste Argument auch angenommen wird, dass es kleiner, gleich, oder größer ist als das zweite.

Anmerkung: Sind zwei Elemente gleich, ist deren Reihenfolge nicht definiert. Bis zu PHP 4.0.6 würde die benutzerdefinierte Funktion die originäre Reihenfolge beibehalten, doch seit der Einführung des neuen Sortieralgorhythmus mit 4.1.0 ist dies nicht mehr der Fall, da es keine effiziente Lösung dafür gibt.

Beispiel 1. usort()

function cmp ($a, $b) {
    if ($a == $b) return 0;
    return ($a > $b) ? -1 : 1;
}

$a = array (3, 2, 5, 6, 1);

usort ($a, "cmp");

while (list ($key, $value) = each ($a)) {
    echo "$key: $value\n";
}

Dieses Beispiel würde folgendes anzeigen:

0: 6
1: 5
2: 3
3: 2
4: 1

Anmerkung: Offensichtlich würde rsort() für diesen einfachen Fall besser passen.

Beispiel 2. usort() Beispiel mit einem mehrdimensionalen Array

function cmp ($a, $b) {
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "Zitronen";
$fruits[1]["fruit"] = "Äpfel";
$fruits[2]["fruit"] = "Trauben";

usort($fruits, "cmp");

while (list ($key, $value) = each ($fruits)) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}

Wird ein mehrdimensionales Array sortiert, enthalten $a und $b Referenzen zu dem ersten Index des Arrays.

Dieses Beispiel würde folgendes anzeigen:

$fruits[0]: Äpfel
$fruits[1]: Trauben
$fruits[2]: Zitronen

Beispiel 3. usort() mit Verwendung einer Member Funktion eines Objektes

class TestObj {
    var $name;

    function TestObj($name)
    {
        $this->name = $name;
    }

    /* Dies ist die statische Vergleichsfunktion: */
    function cmp_obj($a, $b)
    {
        $al = strtolower($a->name);
        $bl = strtolower($b->name);
        if ($al == $bl) return 0;
        return ($al > $bl) ? +1 : -1;
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

uasort($a, array ("TestObj", "cmp_obj"));

foreach ($a as $item) {
    print $item->name."\n";
}

Dieses Beispiel würde folgendes anzeigen:

b
c
d

Siehe auch uasort(), uksort(), sort(), asort(), arsort(),ksort(), natsort() und rsort().

III. Aspell Funktionen [veraltet]

Einführung

Die aspell() Funktionen erlauben es ein Wort auf korrekte Rechtschreibung zu prüfen und Alternativen anzubieten.


Anforderungen

Aspell arbeitet nur mit ziemlich alten (bis .27.* oder so) Versionen der Aspell Bibliothek zusammen. Weder dieses Modul noch jene Versionen der Aspell Bibliothek werden nicht mehr länger unterstützt. Falls Sie eine Rechtschreibprüfung mit PHP benutzen wollen, verwenden Sie statt dessen die Pspell Funktionen. Diese nutzen die Pspell Bibliothek und arbeiten mit neueren Versionen von Aspell zusammen.


Installation

Sie benötigen die aspell-Bibliothek von: http://aspell.sourceforge.net/.


Siehe auch

Siehe auch pspell.

Inhaltsverzeichnis
aspell_check-raw --  Überprüft ein Wort genauso wie es übergeben wird [veraltet]
aspell_check -- Überprüft ein Wort [veraltet]
aspell_new -- Lädt ein neues Wörterbuch [veraltet]
aspell_suggest -- Schlägt mögliche Schreibweisen vor [veraltet]

aspell_check-raw

(PHP 3>= 3.0.7, PHP 4 <= 4.2.3)

aspell_check-raw --  Überprüft ein Wort genauso wie es übergeben wird [veraltet]

Beschreibung

boolean aspell_check_raw ( int Wörterbuchkennung, string Wort)

aspell_check_raw() überprüft die Rechtschreibung eines Wortes ohne die Groß/Kleinschreibung zu variieren oder das Wort in irgendeiner Weise zu kürzen. Liefert TRUE, wenn das Wort korrekt ist und sonst FALSE.

Beispiel 1. aspell_check_raw()

$aspell_link = aspell_new("english");

if (aspell_check_raw($aspell_link, "test")) {
    echo "Gültige Schreibweise";
} else {
    echo "Bedaure, falsche Schreibweise";
}

aspell_check

(PHP 3>= 3.0.7, PHP 4 <= 4.2.3)

aspell_check -- Überprüft ein Wort [veraltet]

Beschreibung

boolean aspell_check ( int Wörterbuchkennung, string Wort)

aspell_check() überprüft die Rechtschreibung eines Wortes und liefert TRUE, wenn das Wort korrekt ist, ansonsten FALSE.

Beispiel 1. aspell_check

$aspell_link = aspell_new("english");

if (aspell_check($aspell_link, "testt")) {
    echo "Gültige Schreibweise";
} else {
    echo "Bedaure, falsche Schreibweise";
}

aspell_new

(PHP 3>= 3.0.7, PHP 4 <= 4.2.3)

aspell_new -- Lädt ein neues Wörterbuch [veraltet]

Beschreibung

int aspell_new ( string master, string personal)

aspell_new() öffnet ein neues Wörterbuch und liefert eine Wörterbuchkennung zurück, die von anderen aspell-Funktionen gebraucht wird. Liefert FALSE bei einem Fehler.

Beispiel 1. aspell_new

$aspell_link = aspell_new("english");

aspell_suggest

(PHP 3>= 3.0.7, PHP 4 <= 4.2.3)

aspell_suggest -- Schlägt mögliche Schreibweisen vor [veraltet]

Beschreibung

array aspell_suggest ( int Wörterbuchkennung, string Wort)

aspell_suggest() liefert ein Array mit möglichen Schreibweisen eines übergebenen Wortes.

Beispiel 1. aspell_suggest()

$aspell_link = aspell_new("english");

if (!aspell_check($aspell_link, "test")) {
    $suggestions = aspell_suggest($aspell_link, "test");

    foreach ($suggestions as $suggestion) {
        echo "Mögliche Schreibweisen: $suggestion<br>\n"; 
    }
}

IV. Mathematische Funktionen mit beliebiger Genauigkeit

Einführung

Für beliebig genaue mathematische Operationen bietet PHP den Binary Calculator. Unterstützt werden Zahlen beliebiger Länge und Genauigkeit, die als String vorliegen.


Anforderungen

Seit PHP 4.0.4 ist libbcmath in PHP enthalten. Sie brauchen keine externen Bibliotheken für diese Erweiterung.


Installation

In PHP 4 sind diese Funktionen nur verfügbar, wenn PHP mit --enable-bcmath konfiguriert wurde. In PHP 3 sind diese Funktionen nur verfügbar, wenn PHP nicht mit --disable-bcmath konfiguriert wurde.

The windows version of PHP has built in support for this extension. You do not need to load any additional extension in order to use these functions.


Laufzeit Konfiguration

Das Verhalten dieser Funktionen wird von Einstellungen in der php.ini bestimmt.

Tabelle 1. BC math Konfigurations-Optionen

NameStandardVeränderbar
bcmath.scale0PHP_INI_ALL
Weitere Details und die Definition der PHP_INI_* Konstanten sind unter ini_set() zu finden.

Beschreibung der Konfigurations-Optionen

bcmath.scale integer

Anzahl der Dezimalstellen für alle bcmath Funktionen.


Resource Typen

Diese Erweiterung definiert keine Resource-Typen.


Vordefinierte Konstanten

Diese Erweiterung definiert keine Konstanten.

Inhaltsverzeichnis
bcadd -- Addition zweier Zahlen beliebiger Genauigkeit.
bccomp --  Vergleich zweier Zahlen beliebiger Genauigkeit.
bcdiv -- Division zweier Zahlen beliebiger Genauigkeit.
bcmod --  Modulo zweier Zahlen mit beliebiger Genauigkeit.
bcmul --  Multiplikation zweier Zahlen beliebiger Genauigkeit.
bcpow --  Potenz mit beliebiger Genauigkeit.
bcpowmod --  Raise an arbitrary precision number to another, reduced by a specified modulus.
bcscale --  Setzt die Genauigkeit aller BC math-Funktionen.
bcsqrt --  Quadratwurzel mit beliebiger Genauigkeit.
bcsub --  Subtrahiert zwei Zahlen mit beliebiger Genauigkeit.

bcadd

(PHP 3, PHP 4 )

bcadd -- Addition zweier Zahlen beliebiger Genauigkeit.

Beschreibung

string bcadd ( string linker Operand, string rechter Operand [, int Genauigkeit])

Addiert den linken Operanden zu dem rechten Operanden und liefert die Summe als Zeichenkette. Der optionale Parameter Genauigkeit kann angegeben werden, um die Anzahl der Nachkommastellen im Ergebnis zu bestimmen.

Siehe auch bcsub().

bccomp

(PHP 3, PHP 4 )

bccomp --  Vergleich zweier Zahlen beliebiger Genauigkeit.

Beschreibung

int bccomp ( string linker Operand, string rechter Operand [, int Genauigkeit])

Vergleicht den linken Operanden mit dem rechten Operanden und liefert das Ergebnis als Integer-Wert. Der optionale Parameter Genauigkeit bestimmt die Anzahl der Nachkommastellen, die für den Vergleich ausgewertet werden. Der Rückgabewert ist 0, wenn die beiden Operanden gleich sind. Wenn der linke Operand größer ist als der rechte Operand, wird +1 zurückgeliefert; wenn der linke Operand kleiner ist als der rechte Operand¸ wird -1 zurückgeliefert.

bcdiv

(PHP 3, PHP 4 )

bcdiv -- Division zweier Zahlen beliebiger Genauigkeit.

Beschreibung

string bcdiv ( string linker Operand, string rechter Operand [, int Genauigkeit])

Dividiert den linken Operanden durch den rechten Operanden. Der optionale Parameter Genauigkeit legt die Anzahl der Nachkommastellen im Ergebnis fest.

Siehe auch bcmul().

bcmod

(PHP 3, PHP 4 )

bcmod --  Modulo zweier Zahlen mit beliebiger Genauigkeit.

Beschreibung

string bcmod ( string linker Operand, string Modulus)

Liefert den linken Operanden modulo Modulus.

Siehe auch bcdiv().

bcmul

(PHP 3, PHP 4 )

bcmul --  Multiplikation zweier Zahlen beliebiger Genauigkeit.

Beschreibung

string bcmul ( string linker Operand, string rechter Operand [, int Genauigkeit])

Multipliziert den linken Operanden mit dem rechten Operanden. Der optionale Parameter Genauigkeit legt die Anzahl der Nachkommastellen im Ergebnis fest.

Siehe auch bcdiv().

bcpow

(PHP 3, PHP 4 )

bcpow --  Potenz mit beliebiger Genauigkeit.

Beschreibung

string bcpow ( string x, int y [, int Genauigkeit])

Potenziert x mit y. Der optionale Parameter Genauigkeit legt die Anzahl der Nachkommastellen im Ergebnis fest.

Siehe auch bcpowmod() und bcsqrt().

bcpowmod

(PHP 5 CVS only)

bcpowmod --  Raise an arbitrary precision number to another, reduced by a specified modulus.

Beschreibung

string bcpowmod ( string x, string y, string modulus [, int scale])

Benutzen Sie diese schnelle Exponentialmethode um x mit y unter Berücksichtigung des Modulo modulus zu potenzieren. Der optionale Parameter scale legt die Anzahl der Nachkommastellen im Ergebnis fest.

Die folgenden zwei Anweisungen sind funktional identisch. Die Variante mit bcpowmod() ist schneller und akzeptiert größere Parameter

<?php
$a = bcpowmod($x,$y,$mod);

$b = bcmod(bcpow($x,$y),$mod);

/* $a und $b sind genau gleich. */
?>

Anmerkung: Die Verwendung von nicht-natürlichen Zahlen kann zu unerwarteten Ergebnissen führen, weil diese Funktion die Modulodivision verwendet. Eine natürliche Zahl ist jede ganzzahlige positive Zahl die ungleich Null ist.

Siehe auch bcpow() und bcmod().

bcscale

(PHP 3, PHP 4 )

bcscale --  Setzt die Genauigkeit aller BC math-Funktionen.

Beschreibung

string bcscale ( int Genauigkeit)

Diese Funktionen legt die Standard-Genauigkeit aller in der Folge aufgerufenden BC math-Funktionen fest, die nicht explizit die Genauigkeit durch den optionalen Parameter setzen.

bcsqrt

(PHP 3, PHP 4 )

bcsqrt --  Quadratwurzel mit beliebiger Genauigkeit.

Beschreibung

string bcsqrt ( string Operand [, int Genauigkeit])

Liefert die Quadratwurzel von Operand. Der optionale Parameter Genauigkeit legt die Anzahl der Nachkommastellen im Ergebnis fest.

Siehe auch bcpow().

bcsub

(PHP 3, PHP 4 )

bcsub --  Subtrahiert zwei Zahlen mit beliebiger Genauigkeit.

Beschreibung

string bcsub ( string linker Operand, string rechter Operand [, int Genauigkeit])

Subtrahiert den rechten Operanden vom linken Operanden und liefert das Ergebnis als Zeichenkette. Der optionale Parameter Genauigkeit legt die Anzahl der Nachkommastellen im Ergebnis fest.

Siehe auch bcadd().

V. Bzip2 Komprimierungsfunktionen

Einführung

Die bzip2-Funktionen werden benutzt, um transparent bzip2 (.bz2)-komprimierte Dateien lesen und schreiben zu können.


Anforderungen

Dieses Module nutzt die Funktionen der bzip2-Bibliothek von Julian Seward Dazu ist die bzip2/libbzip2 Version >= 1.0.x. nötig.


Installation

Die Bzip2-Unterstützung ist in PHP nicht standardmäßig aktiviert. Es ist erforderlich, die Option --with-bz2[=DIR] beim Kompilieren von PHP anzugeben.


Laufzeit Konfiguration

Diese Erweiterung definiert keine Konfigurationseinstellungen in der php.ini.


Resource Typen

Dieses Erweitertung definierte einen Resource-Typen: Einen Dateizeiger, der die Datei idenitfiziert, mit der gearbeitet werden soll.


Vordefinierte Konstanten

Diese Erweiterung definiert keine Konstanten.


Beispiele

Dieses Beispiel öffnet eine tempräre Datei und schreibt einen Teststring in diese, dann gibt es den Inhalt der Datei aus.

Beispiel 1. Ein kleines bzip2() Beispiel

&lt;?php

$filename = "/tmp/testfile.bz2";
$str = "This is a test string.\n";

// open file for writing
$bz = bzopen($filename, "w");

// write string to file
bzwrite($bz, $str);

// close file
bzclose($bz);

// open file for reading
$bz = bzopen($filename, "r");

// read 10 characters
print bzread($bz, 10);

// output until end of the file (or the next 1024 char) and close it.  
print bzread($bz);

bzclose($bz);

?>
Inhaltsverzeichnis
bzclose -- Schließe einen bzip2-Dateizeiger
bzcompress -- Komprimiert einen String in bzip2-encodierte Daten
bzdecompress -- Dekomprimiert bzip2-komprimierte Daten
bzerrno -- Gibt einen bzip2-Fehlercode zurück
bzerror -- Gibt den bzip2 Fehlercode und eine Fehlerbeschreinung in einem Array zurück.
bzerrstr -- Gibt eine bzip2-Fehlermeldung zurück
bzflush -- Erzwinge das schreiben aller gepufferten Daten
bzopen -- Öffnet eine bzip2-komprimierte Datei
bzread -- liest binäre Daten aus einer bzip2 komprimierten Datei
bzwrite -- bzip2-Datei schreiben

bzclose

(PHP 4 >= 4.0.4)

bzclose -- Schließe einen bzip2-Dateizeiger

Beschreibung

int bzclose ( int bz)

Schließt die bzip2-Datei, die von dem Zeiger bz referenziert wird.

Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.

Der Dateizeiger muss gültig sein, und auf eine Datei zeigen, die erfolgreich mittels der bzopen()-Funktion geöffnet wurde.

Siehe auch bzopen().

bzcompress

(PHP 4 >= 4.0.4)

bzcompress -- Komprimiert einen String in bzip2-encodierte Daten

Beschreibung

string bzcompress ( string source [, int blocksize [, int workfactor]])

bzcompress() komprimiert den source-String und gibt ihn als bzip2-komprimierte Daten zurück.

Der optionale Parameter blocksize spezifiziert die Blockgröße während der Komprimierung und darf zwischen 1 und 9 liegen. 9 ergibt dabei den besten Komprimierungsfaktor, benötigt jedoch auch die meisten Systemressourcen. Der Standardwert für blocksize ist 4.

Der optionale Parameter workfactor bestimmt, wie die Funktion sich im schlimmsten Fall, stark wiederholende Eingabedaten zu verhalten hat. Der Wer kann zwischen 0 und 250 liegen, 0 ist ein spezieller Fall, 30 ist der Standardwert. Unabhängig vom Parameter workfactor wird die generierte Ausgabe immer die selbe sein.

Beispiel 1. bzcompress() Beispiel

&lt;?php
$str = "sample data";
$bzstr = bzcompress($str, 9);
print( $bzstr );
?>

Siehe auch bzdecompress().

bzdecompress

(PHP 4 >= 4.0.4)

bzdecompress -- Dekomprimiert bzip2-komprimierte Daten

Beschreibung

string bzdecompress ( string source [, int small])

bzdecompress() dekomprimiert den source-Parameter, der bzip2-komprimierte Daten enthält und gibt die dekomprimierten Daten zurück. Wenn der optionale Parameter small TRUE ist, wird ein alternative Dekomprimierungsalgorithmus verwendet, der weniger Speicher benötigt, jedoch nur halb so schnell läuft. Weitere Informationen sind in der bzip2 Dokumentation zu finden.

Beispiel 1. bzdecompress()

&lt;?php
$start_str = "This is not an honest face?";
$bzstr = bzcompress($start_str);

print( "Compressed String: " );
print( $bzstr );
print( "\n&lt;br&gt;n" );

$str = bzdecompress($bzstr);
print( "Decompressed String: " );
print( $str );
print( "\n&lt;br&gt;n" );
?>

Siehe auch bzcompress().

bzerrno

(PHP 4 >= 4.0.4)

bzerrno -- Gibt einen bzip2-Fehlercode zurück

Beschreibung

int bzerrno ( int bz)

Gibt den Fehlercode eines beliebigen Fehlercodes, der von dem Dateizeiger bz zurückgegeben wird.

Siehe auch bzerror() und bzerrstr().

bzerror

(PHP 4 >= 4.0.4)

bzerror -- Gibt den bzip2 Fehlercode und eine Fehlerbeschreinung in einem Array zurück.

Beschreibung

array bzerror ( int bz)

Gibt den Fehlercode und die Fehlerbeschreibung eines beliebigen von dem Dateizeiger bz gelieferten bzip2-Fehlers in einem assoziativen Array zurück.

Beispiel 1. bzerror() Beispiel

&lt;?php
$error = bzerror($bz);

echo $error["errno"];
echo $error["errstr"];
?>

Siehe auch bzerrno() und bzerrstr().

bzerrstr

(PHP 4 >= 4.0.4)

bzerrstr -- Gibt eine bzip2-Fehlermeldung zurück

Beschreibung

string bzerrstr ( int bz)

Gibt eine Fehlermeldung eines bzip2-Fehler zurück, anhand des Dateizeigers bz identifiziert wird.

Siehe auch bzerrno() und bzerror().

bzflush

(PHP 4 >= 4.0.4)

bzflush -- Erzwinge das schreiben aller gepufferten Daten

Beschreibung

int bzflush ( int bz)

Erzwingt ein Schreiben alle gepufferten bzip2-Daten für den Dateizeiger bz.

Gibt bei Erfolg TRUE zurück, im Fehlerfall FALSE.

Siehe auch bzread() und bzwrite().

bzopen

(PHP 4 >= 4.0.4)

bzopen -- Öffnet eine bzip2-komprimierte Datei

Beschreibung

int bzopen ( string filename, string mode)

Öffnet eine bzip2 (.bz2)-Datei, um sie zu lesen oder zu schreiben. Der Parameter filename ist der Names der Datei, die geöffnet werden soll. Der mode-Parameter ist mit der fopen() Vergleich ('r' für lesenden Zugriff, 'w' für schreibenden Zugriff usw.).

Wenn das öffnen Fehlschlägt, gibt die Funktion FALSE zurück, andernfalls wird ein Zeiger auf die geöffnete Datei zurückgegeben.

Beispiel 1. bzopen() Beispiel

&lt;?php
$bz = bzopen("/tmp/foo.bz2", "r");
$decompressed_file = bzread($bz, filesize("/tmp/foo.bz2"));
bzclose($bz);

print( "The contents of /tmp/foo.bz2 are: " );
print( "\n&lt;br&gt;n" );
print( $decompressed_file );
?>

Siehe auch bzclose().

bzread

(PHP 4 >= 4.0.4)

bzread -- liest binäre Daten aus einer bzip2 komprimierten Datei

Beschreibung

string bzread ( int bz [, int length])

bzread() liest bis zu length Bytes aus dem bzip2-Dateizeiger bz. Hört mit dem Lesen auf, wenn length (dekomprimierte) Bytes gelesen wurden oder das Ende der Datei (EOF) erreicht ist, welcher Fall auch immer zuerst auftritt. Wenn der optionale Parameter length nicht angegeben wird, wird die Funktion bzread() 1024 unkomprimierte Bytes lesen.

Beispiel 1. bzread() Beispiel

<?php
$bz = bzopen("/tmp/foo.bz2", "r");
$str = bzread($bz, 2048);
print( $str );
?>

Siehe auch bzwrite() und bzopen().

bzwrite

(PHP 4 >= 4.0.4)

bzwrite -- bzip2-Datei schreiben

Description

int bzwrite ( int bz, string data [, int length])

bzwrite() schreibt den Inhalt des Strings data in den bzip2-Dateistream, auf den bz zeigt. Wenn der optionale Parameter length übergeben wird, wird das Schreiben abgebrochen, nachdem length Bytes unkomprimierte Bytes geschrieben, oder das Ende des Strings erreicht wurde.

Beispiel 1. bzwrite() Beispiel

&lt;?php
$str = "uncompressed data";
$bz = bzopen("/tmp/foo.bz2", "w");
bzwrite($bz, $str, strlen($str));
bzclose($bz);
?>

Siehe auch bzread() und bzopen().

VI. Kalender-Funktionen

Dieses Modul bietet eine Reihe von Funktionen, die die Umwandlung von Daten zwischen verschiedenen Kalendern erleichtern. Die gemeinsame Basis für diese Umwandlung bildet das Julianische Datum J. D. (nicht zu verwechseln mit dem Julianischen Kalender). Das J. D. entspricht der Anzahl der Tage seit dem 1. 1. 4713 v. Chr. Jede Umrechnung zwischen zwei beliebigen Kalendern erfordert den Zwischenschritt über das J. D.

Weitere Informationen zum Thema liefert die Seite http://genealogy.org/~scottlee/cal-overview.html, aus der Teile der Erklärungen in den folgenden Funktionsbeschreibungen stammen.

Warnung

In PHP3 und älteren Versionen von PHP4 (bis einschließlich PHP4RC1) sind diese Funktionen nur verfügbar, wenn Sie die Kalender-Erweiterungen unter dl/calendar übersetzt haben. Weitere Informationen finden Sie in der Datei dl/README.

Inhaltsverzeichnis
cal_days_in_month -- Gibt die Anzahl der Tage eines bestimmten Monats in einem bestimmten Jahr in einem bestimmten Kalender zurück
cal_from_jd -- Converts from Julian Day Count to a supported calendar
cal_info -- Gibt Informationen zu einem bestimmten Kalender zurück
cal_to_jd -- Converts from a supported calendar to Julian Day Count
easter_date --  Zeitpunkt des Osterfestes (0 Uhr) als UNIX-Timestamp
easter_days --  Anzahl der Tage zwischen dem 21. März und Ostersonntag
frenchtojd --  Konvertiert ein Datum der Französischen Revolution zu einem Julianischen Datum
gregoriantojd --  Konvertierung vom Gregorianischen Kalender zum Julianischen Datum
jddayofweek --  Bestimmt den Wochentag aus einem Julianischen Datum
jdmonthname --  Bestimmt den Monat aus dem Julianischen Datum
jdtofrench --  Konvertiert ein Julianisches Datum zum Kalender der Französischen Revolution
jdtogregorian --  Konvertierung vom Julianischen Datum zum Gregorianischen Kalender
jdtojewish --  Konvertierung vom Julianischen Datum zum Jüdischen Kalender
jdtojulian --  Konvertierung vom Julianischen Datum zum Julianischen Kalender
jdtounix --  Konvertiert Julianisches Datum in UNIX-Timestamp
jewishtojd --  Konvertiert vom Jüdischen Kalender zum Julianischen Datum
juliantojd --  Konvertierung vom Julianischen Kalender zum Julianischen Datum
unixtojd --  Konvertiert UNIX-Timestamp in Julianisches Datum

cal_days_in_month

(PHP 4 >= 4.1.0)

cal_days_in_month -- Gibt die Anzahl der Tage eines bestimmten Monats in einem bestimmten Jahr in einem bestimmten Kalender zurück

Beschreibung

int cal_days_in_month ( int calendar, int month, int year)

Diese Funktion gibt die Anzahl der Tage in einem Monat eines Jahres für den angegebenen Kalender zurück.

Siehe auch jdtounix().

cal_from_jd

(PHP 4 >= 4.1.0)

cal_from_jd -- Converts from Julian Day Count to a supported calendar

Description

array cal_from_jd ( int jd, int calendar)

cal_from_jd() converts the julian day given in jd into a date of the specified calendar. Supported calendar values are CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH and CAL_FRENCH.

See also cal_to_jd().

cal_info

(PHP 4 >= 4.1.0)

cal_info -- Gibt Informationen zu einem bestimmten Kalender zurück

Beschreibung

array cal_info ( int calendar)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cal_to_jd

(PHP 4 >= 4.1.0)

cal_to_jd -- Converts from a supported calendar to Julian Day Count

Description

int cal_to_jd ( int calendar, int month, int day, int year)

cal_to_jd() calculates the julian day count for a date in the specified calendar. Supported calendars are CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH and CAL_FRENCH.

See also cal_to_jd().

easter_date

(PHP 3>= 3.0.9, PHP 4 )

easter_date --  Zeitpunkt des Osterfestes (0 Uhr) als UNIX-Timestamp

Beschreibung

int easter_date ( [int year])

Diese Funktion liefert den UNIX-Timestamp (in Sekunden seit 1970) zurück, der dem Begin des Ostersonntag im durch year spezifizierten Jahr entspricht. Wird kein Jahr angegeben, so wird der Zeitpunkt für das laufende Jahr bestimmt.

Warnung

Liegt das angegebene Jahr vor 1970 oder nach 2037 (auf 32 bit-Systemen), so wird eine Warnung ausgegeben und das Ergebnis ist nicht gültig.

Beispiel 1. easter_date() Beispiel

echo date ("M-d-Y", easter_date(1999));        /* " 4. April 1999" */
echo date ("M-d-Y", easter_date(2000));        /* "23. April 2000" */
echo date ("M-d-Y", easter_date(2001));        /* "15. April 2001" */

Das Datum des Osterfestes wurde im Jahre 325 auf dem Konzil von Nicaea auf den ersten Sonntag nach Frühlingsvollmond, also dem Vollmond während oder direkt nach der Tagundnachtgleiche am 21. März, festgelegt. Der hier genutzte Algorithmus wurde um das Jahr 532 von Dionysius Exiguus eingeführt. Bis zum Jahr 1752 wird nach dem Julianischen Kalender ein einfacher 19jähriger Zyklus für die Bestimmung der Mondphasen benutzt. Im September 1752 übernahmen dann auch Britannien und seine Kolonien den von Clavius und Lilius vorgeschlagenen und im Oktober 1582 von Papst Gregor dem XIII. eingeführten Gregorianischen Kalender. Hierdurch wurden zwei Korrekturfaktoren eingeführt, um den Zyklus genauer abzubilden.

(Der Code basiert auf einen C-Programm von Simon Kershaw, <webmaster@ely.anglican.org>)

Siehe auch easter_days() für die Bestimmung von Osterfesten vor 1970 oder nach 2037.

easter_days

(PHP 3>= 3.0.9, PHP 4 )

easter_days --  Anzahl der Tage zwischen dem 21. März und Ostersonntag

Beschreibung

int easter_days ( int year)

Diese Funktion ermittelt den Abstand in Tagen zwischen der Frühlings-Tagundnachtgleiche und dem Ostersonntag im durch year angegebenen Jahr. Wird kein Jahr angegeben, so wird der Wert für das laufende Jahr bestimmt.

Diese Funktion kann im Gegensatz zu easter_date() das Osterfest auch in Jahren vor 1970 und nach 2037 bestimmen.

Beispiel 1. easter_date() Beispiel

echo easter_days (1999);        /* 14, i.e. April 4   */
echo easter_days (1492);        /* 32, i.e. April 22  */
echo easter_days (1913);        /*  2, i.e. March 23  */

Siehe auch easter_date().

frenchtojd

(PHP 3, PHP 4 )

frenchtojd --  Konvertiert ein Datum der Französischen Revolution zu einem Julianischen Datum

Beschreibung

int frenchtojd ( int month, int day, int year)

Diese Funktion konvertiert das in month, day und year übergebene Datum im Kalender der Französischen Revolution in einen Tag im Julianischen Datum.

Diese Funktion verarbeitet nur Daten der Jahre 1 bis 14 (22. September 1792 bis 22. September 1806 im Gregorianischen Kalender), dieser Zeitraum geht aber immer noch über die Lebensdauer des Revolutionskalenders hinaus.

gregoriantojd

(PHP 3, PHP 4 )

gregoriantojd --  Konvertierung vom Gregorianischen Kalender zum Julianischen Datum

Beschreibung

int gregoriantojd ( int month, int day, int year)

Diese Funktion konvertiert das in month, day und year übergebene Datum im Gregorianischen Kalender in einen Tag im Julianischen Datum.

Gültige Daten liegen im Bereich von 4714 v. Chr. bis 9999 n. Chr. Der Gregorianische Kalender wurde allerdings erst am 15. Oktober 1582 (bzw. am 5. Oktober nach dem bis dahin gültigen Julianischen Kalender) von Papst Gregor XIII. eingeführt, in einigen Ländern erst sehr viel später. So übernahmen die Briten den Gregorianischen Kalender 1752, die UDSSR 1918 und Griechenland erst im Jahre 1923. In den meisten europäischen Ländern wurde vor dem Gregorianischen der Julianische Kalender benutzt.

Beispiel 1. Calendar functions

<?php
$jd = GregorianToJD (10,11,1970);
echo "$jd\n";
$gregorian = JDToGregorian ($jd);
echo "$gregorian\n";
?>

jddayofweek

(PHP 3, PHP 4 )

jddayofweek --  Bestimmt den Wochentag aus einem Julianischen Datum

Beschreibung

mixed jddayofweek ( int julianday, int mode)

Diese Funktion bestimmt den Wochentag für den in julianday übergebenen Tag im Julianischen Datum. Die Ausgabe erfolgt in Abhängigkeit von mode als integer oder string.

Tabelle 1. Mögliche mode Werte

ModeBedeutung
0 Nummer des Tages als integer (0=Sontag, 1=Montag, ...)
1Tagesname als String (Englisch-Gregorianisch)
2 abgekürzter Tagesname als String (Englisch-Gregorianisch)

jdmonthname

(PHP 3, PHP 4 )

jdmonthname --  Bestimmt den Monat aus dem Julianischen Datum

Beschreibung

string jdmonthname ( int julianday, int mode)

Diese Funktion bestimmt den Monatsnamen für den in julianday übergebenen Tag im Julianischen Datum. Die Ausgabe erfolgt als String in Abhängigkeit von mode.

Tabelle 1. Mögliche mode Werte

ModeBedeutung
0Gregorianisch (Abk.)
1Gregorianisch
2Julianisch - (Abk.)
3Julianisch
4Jüdisch
5Französisch revolutionär

jdtofrench

(PHP 3, PHP 4 )

jdtofrench --  Konvertiert ein Julianisches Datum zum Kalender der Französischen Revolution

Beschreibung

string jdtofrench ( int month, int day, int year)

Diese Funktion konvertiert den in julianday angegebenen Tag im Julianischen Datum in einen String, der das entsprechnde Datum im Kalender der Französischen Revolution in der Form "MM/DD/YYYY" enthält.

jdtogregorian

(PHP 3, PHP 4 )

jdtogregorian --  Konvertierung vom Julianischen Datum zum Gregorianischen Kalender

Beschreibung

string jdtogregorian ( int julianday)

Diese Funktion konvertiert den in julianday angegebenen Tag im Julianischen Datum in einen String, der das Datum nach dem Gregorianischen Kalender in der Form "MM/DD/YYYY" enthält.

jdtojewish

(PHP 3, PHP 4 )

jdtojewish --  Konvertierung vom Julianischen Datum zum Jüdischen Kalender

Beschreibung

string jdtojewish ( int julianday)

Diese Funktion konvertiert den in julianday angegebenen Tag im Julianischen Datum in einen String, der das entsprechnde Datum im Jüdischen Kalender in der Form "MM/DD/YYYY" enthält.

jdtojulian

(PHP 3, PHP 4 )

jdtojulian --  Konvertierung vom Julianischen Datum zum Julianischen Kalender

Beschreibung

string jdtojulian ( int julianday)

Diese Funktion konvertiert den in julianday angegebenen Tag im Julianischen Datum in einen String, der das entsprechnde Datum im Julianischen Kalender in der Form "MM/DD/YYYY" enthält.

jdtounix

(PHP 4 )

jdtounix --  Konvertiert Julianisches Datum in UNIX-Timestamp

Beschreibung

int jdtounix ( int jday)

Diese Funktion liefert einen UNIX Timestamp (in Sekunden seit dem 1.1.1970) zurück, der dem in jday übergebenen Julianischen Datum entspricht. Liegt jday außerhalb des darstellbaren Zeitbereichs (Gregorianische Jahre von 1970 bis 2037 bzw. 2440588 <= jday <= 2465342 ), so wird FALSE zurückgegeben.

Siehe auch unixtojd().

Anmerkung: Diese Funktion ist nur in PHP-Versionen nach PHP4RC1 verfügbar.

jewishtojd

(PHP 3, PHP 4 )

jewishtojd --  Konvertiert vom Jüdischen Kalender zum Julianischen Datum

Beschreibung

int jewishtojd ( int month, int day, int year)

Diese Funktion konvertiert das in month, day und year übergebene Datum im Jüdischen Kalender in einen Tag im Julianischen Datum.

Gültige Daten beginnen mit dem Jahr 1 (3761 v. Chr.). Der Jüdische Kalender ist bereits seit mehreren Jahrtausenden im Gebrauch, wobei ein neuer Monat jeweils mit der ersten Beobachtung des Neumonds beginnt.

juliantojd

(PHP 3, PHP 4 )

juliantojd --  Konvertierung vom Julianischen Kalender zum Julianischen Datum

Beschreibung

int juliantojd ( int month, int day, int year)

Diese Funktion konvertiert das in month, day und year übergebene Datum im Gregorianischen Kalender in einen Tag im Julianischen Datum.

Gültige Daten liegen im Bereich von 4714 v.Chr. bis 9999 n.Chr. Der Julianische Kalender wurde allerdings erst 46 v.Chr. eingeführt, und die Details der Anwendung stabilisierten sich frühestens im Jahre 8 n. Chr., z. T. vielleicht sogar erst im vierten Jahrhundert nach Christus. Weiterhin betrachteten nicht alle Kulturen, die sich nach diesem Kalender richteten, den Januar als den ersten Monat des Jahres.

unixtojd

(PHP 4 )

unixtojd --  Konvertiert UNIX-Timestamp in Julianisches Datum

Beschreibung

int unixtojd ( [int timestamp])

Diese Funktion konvertiert den in timestamp übergebenen Wert (in Sekunden seit dem 1.1.1970) in das entsprechende Julianische Datum. Wird kein timestamp übergeben, so wird das Julianische Datum des aktuellen Tages zurückgegeben.

Siehe auch jdtounix().

Anmerkung: Diese Funktion ist nur in PHP-Versionen nach PHP4RC1 verfügbar.

VII. CCVS API Funktionen

Die Funktionsschnittstelle der CCVS API erlaubt es direkt von PHP Scripten aus mit CCVS zu arbeiten. CCVS ist RedHat's Lösung zu dem "Mann in der Mitte" bei der Abwicklung von Kreditkarten. Es stellt die Möglichkeit zur Verfügung sich direkt über einen Unixrechner und ein Modem zu einem Kartenanbieter zu verbinden. Mit hilfe des CCVS Modules für PHP kann man Kreditkarten direkt durch CCVS über PHP Scripte abwickeln. Die folgende Referenz wird diesen Vorgang umreissen.

Um CCVS Unterstützung zu aktivieren, sollte man erst das CCVS Installationsverzeichnis überprüfen. Es ist notwendig PHP mit der Option --with-ccvs zu configurieren. Wenn diese Option ohne den Pfad zu CCVS installation angegeben wird, versucht PHP es in den voreingestellten Pfaden einer CCVS standard installation (/usr/local/ccvs) zu finden. Wenn CCVS nicht den Standard Pfad hat, ist es nötig configure mit --with-ccvs=$ccvs_pfad zu starten, wobei $ccvs_pfad der Pfad zu installation ist. Anzumerken ist, dass CCVS Unterstützung vorausetzt, dass $ccvs_pfad/lib und $ccvs_pfad/include existieren, und dass die Includedatei cv_api.h im include Verzeichnis, und libccvs.a im lib Verzeichnis liegen.

Ausserdem muss ein ccvsd Prozess für die Einstellungen laufen die mit PHP Skripten arbeiten sollen. Es ist nötig das die PHP Prozesse unter dem selben Benutzer laufen für den auch ccvs installiert wurde (bsp: wenn ccvs unter dem user 'ccvs' installiert wurde, müssen die PHP Prozesse ebenfalls als 'ccvs' laufen.)

Weiter Informationen zu CCVS kann man unter ??? finden.

An diesem Dokumentationsteil wird noch gearbeitet. RedHat unterhält eine geringfügig veraltete aber immernoch brauchbare Dokumentation unter: http://redhat.com/docs/manuals/ccvs/.

Inhaltsverzeichnis
ccvs_add -- Add data to a transaction
ccvs_auth --  Perform credit authorization test on a transaction
ccvs_command --  Performs a command which is peculiar to a single protocol, and thus is not available in the general CCVS API
ccvs_count --  Find out how many transactions of a given type are stored in the system
ccvs_delete -- Delete a transaction
ccvs_done -- Terminate CCVS engine and do cleanup work
ccvs_init -- Initialize CCVS for use
ccvs_lookup --  Look up an item of a particular type in the database #
ccvs_new -- Create a new, blank transaction
ccvs_report -- Return the status of the background communication process
ccvs_return --  Transfer funds from the merchant to the credit card holder
ccvs_reverse --  Perform a full reversal on an already-processed authorization
ccvs_sale --  Transfer funds from the credit card holder to the merchant
ccvs_status -- Check the status of an invoice
ccvs_textvalue -- Get text return value for previous function call
ccvs_void --  Perform a full reversal on a completed transaction

ccvs_add

(4.0.2 - 4.2.3 only)

ccvs_add -- Add data to a transaction

Description

string ccvs_add ( string session, string invoice, string argtype, string argval)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_auth

(4.0.2 - 4.2.3 only)

ccvs_auth --  Perform credit authorization test on a transaction

Description

string ccvs_auth ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_command

(4.0.2 - 4.2.3 only)

ccvs_command --  Performs a command which is peculiar to a single protocol, and thus is not available in the general CCVS API

Description

string ccvs_command ( string session, string type, string argval)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_count

(4.0.2 - 4.2.3 only)

ccvs_count --  Find out how many transactions of a given type are stored in the system

Description

int ccvs_count ( string session, string type)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_delete

(4.0.2 - 4.2.3 only)

ccvs_delete -- Delete a transaction

Description

string ccvs_delete ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_done

(4.0.2 - 4.2.3 only)

ccvs_done -- Terminate CCVS engine and do cleanup work

Description

string ccvs_done ( string sess)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_init

(4.0.2 - 4.2.3 only)

ccvs_init -- Initialize CCVS for use

Description

string ccvs_init ( string name)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_lookup

(4.0.2 - 4.2.3 only)

ccvs_lookup --  Look up an item of a particular type in the database #

Description

string ccvs_lookup ( string session, string invoice, int inum)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_new

(4.0.2 - 4.2.3 only)

ccvs_new -- Create a new, blank transaction

Description

string ccvs_new ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_report

(4.0.2 - 4.2.3 only)

ccvs_report -- Return the status of the background communication process

Description

string ccvs_report ( string session, string type)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_return

(4.0.2 - 4.2.3 only)

ccvs_return --  Transfer funds from the merchant to the credit card holder

Description

string ccvs_return ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_reverse

(4.0.2 - 4.2.3 only)

ccvs_reverse --  Perform a full reversal on an already-processed authorization

Description

string ccvs_reverse ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_sale

(4.0.2 - 4.2.3 only)

ccvs_sale --  Transfer funds from the credit card holder to the merchant

Description

string ccvs_sale ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_status

(4.0.2 - 4.2.3 only)

ccvs_status -- Check the status of an invoice

Description

string ccvs_status ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_textvalue

(4.0.2 - 4.2.3 only)

ccvs_textvalue -- Get text return value for previous function call

Description

string ccvs_textvalue ( string session)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

ccvs_void

(4.0.2 - 4.2.3 only)

ccvs_void --  Perform a full reversal on a completed transaction

Description

string ccvs_void ( string session, string invoice)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

VIII. COM Support Funktionen für Windows

Einführung

Das Component Object Model (COM) ist eine Technologie, welche die Wiederverwendung von Code erlaubt, egal in welcher Sprache dieser geschrieben wurde. Die Komponenten stellen Schnittstellen bereit, welche die verfügbaren Funktionen, aber nicht deren Implementierung bekanntgeben (z.B. auf welcher Maschine die Komponente gespeichert ist und die Executable, die sie enthält). Anwendungen können über die COM-API beliebige Schnittstellen erzeugen. Man sich das wie einen super Remote Procedure Call (RPC) Mechanismus mit einigen grundlegenden Objekten vorstellen. Es trennt die Implementation von der Schnittstelle.

COM unterstützt Versioning, die Trennung von Implementation und Schnittstelle, sowie das Verstecken von Implementierungsdetails, wie z.B. Position der Executable und die Sprache, in welcher die Komponente geschrieben wurde.


Anforderungen

Die COM Funktionen sind nur in der Windowsversion von PHP verfügbar.


Installation

Für diese Funktionen ist keine Installation erforderlich, diese gehören zum Grundbestand von PHP.

The windows version of PHP has built in support for this extension. You do not need to load any additional extension in order to use these functions.


Laufzeit Konfiguration

Das Verhalten dieser Funktionen wird von Einstellungen in der php.ini bestimmt.

Tabelle 1. Com Konfigurationsoptionen

NameStandardwertÄnderbar
com.allow_dcom"0"PHP_INI_SYSTEM
com.autoregister_typelib"0"PHP_INI_SYSTEM
com.autoregister_verbose"0"PHP_INI_SYSTEM
com.autoregister_casesensitive"1"PHP_INI_SYSTEM
com.typelib_file""PHP_INI_SYSTEM
Weitere Details und Definitionen der PHP_INI_* Konstanten finden Sie bei der Funktion ini_set().


Vordefinierte Konstanten

Folgende Konstanten werden von dieser Erweiterung definiert und stehen nur zur Verfügung, wenn die Erweiterung entweder statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen wurde.

CLSCTX_INPROC_SERVER (integer)

CLSCTX_INPROC_HANDLER (integer)

CLSCTX_LOCAL_SERVER (integer)

CLSCTX_REMOTE_SERVER (integer)

CLSCTX_SERVER (integer)

CLSCTX_ALL (integer)

VT_NULL (integer)

VT_EMPTY (integer)

VT_UI1 (integer)

VT_I2 (integer)

VT_I4 (integer)

VT_R4 (integer)

VT_R8 (integer)

VT_BOOL (integer)

VT_ERROR (integer)

VT_CY (integer)

VT_DATE (integer)

VT_BSTR (integer)

VT_DECIMAL (integer)

VT_UNKNOWN (integer)

VT_DISPATCH (integer)

VT_VARIANT (integer)

VT_I1 (integer)

VT_UI2 (integer)

VT_UI4 (integer)

VT_INT (integer)

VT_UINT (integer)

VT_ARRAY (integer)

VT_BYREF (integer)

CP_ACP (integer)

CP_MACCP (integer)

CP_OEMCP (integer)

CP_UTF7 (integer)

CP_UTF8 (integer)

CP_SYMBOL (integer)

CP_THREAD_ACP (integer)


Siehe auch

Weitere Informationen zu COM finden Sie in der COM specification, oder in Don Box's Yet Another COM Library (YACL).

Inhaltsverzeichnis
com -- COM Klasse
VARIANT -- VARIANT Klasse
com_addref --  Erhöht den Referenzzähler der Komponente
com_get --  Liefert den Wert der Eigenschaft einer COM Komponente
com_invoke --  Ruft eine Methode einer COM Komponente auf
com_isenum -- Holt eine IEnumVariant
com_load_typelib -- Lädt eine Typelib
com_load --  Erstellt eine neue Referenz auf eine COM Komponente
com_propget --  Liefert den Wert der Eigenschaft einer COM Komponente
com_propput --  Weist einer Eigenschaft einer COM Komponente einen Wert zu
com_propset --  Weist einer Eigenschaft einer COM Komponente einen Wert zu
com_release --  Reduziert den Referenzzähler der Komponente
com_set --  Weist einer Eigenschaft einer COM Komponente einen Wert zu.

com

(no version information, might be only in CVS)

com -- COM Klasse

Synopsis

$obj = new COM("server.object")

Beschreibung

Die COM Klasse bietet ein Gerüst zur Integration von (D)COM Komponenten in Ihre PHP Skripte.

Methoden

string COM::COM ( string module_name [, string server_name [, int codepage]])

COM Klassen Konstruktor. Parameter:

module_name

Name oder Klassen-ID der gewünschten Komponente.

server_name

Name des DCOM Servers, von welchem die Komponente geholt werden soll. Ist NULL angegeben, wird localhost angenommen. Um DCOM zuzulassen, muss com.allow_dcom in der php.ini auf TRUE gesetzt sein.

codepage

Spezifiziert die Codepage, welche zur Konvertierung der PHP-Strings in Unicode-Strings und umgekehrt verwendet wird. Mögliche Werte sind CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 und CP_UTF8.

Beispiel 1. COM Beispiel (1)

// Word starten
$word = new COM("word.application") or die("Konnte Word nicht instantiieren");
print "Word geladen, Version {$word->Version}\n";

//Fenster anzeigen
$word->Visible = 1;

//ein leeres Dokument öffnen
$word->Documents->Add();

//irgendetwas tun
$word->Selection->TypeText("Dies ist ein Test...");
$word->Documents[1]->SaveAs("Useless test.doc");

//Word schließen
$word->Quit();

//Das Objekt freigeben
$word->Release();
$word = null;

Beispiel 2. COM example (2)

$conn = new COM("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password");

$rs = $conn->Execute("SELECT * FROM sometable");    // Recordset

$num_columns = $rs->Fields->Count();
echo $num_columns . "\n";

for ($i=0; $i < $num_columns; $i++)
{
    $fld[$i] = $rs->Fields($i);
}

$rowcount = 0;
while (!$rs->EOF)
{
    for ($i=0; $i < $num_columns; $i++)
    {
        echo $fld[$i]->value . "\t";
    }
    echo "\n";
    $rowcount++;            // increments rowcount
    $rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs->Release();
$conn->Release();

$rs = null;
$conn = null;

VARIANT

(no version information, might be only in CVS)

VARIANT -- VARIANT Klasse

Synopsis

$vVar = new VARIANT($var)

Beschreibung

Ein einfacher Container, um Variablen in VARIANT Strukturen zu verpacken.

Methoden

string VARIANT::VARIANT ( [mixed value [, int type [, int codepage]]])

VARIANT Klassen-Konstruktor. Parameter:

value

Anfangswert. Ist er nicht angegeben, wird ein VT_EMPTY Objekt erzeugt.

type

spezifiziert den Typ vom Inhalt des VARIANT Objektes. Mögliche Werte sind VT_UI1, VT_UI2, VT_UI4, VT_I1, VT_I2, VT_I4, VT_R4, VT_R8, VT_INT, VT_UINT, VT_BOOL, VT_ERROR, VT_CY, VT_DATE, VT_BSTR, VT_DECIMAL, VT_UNKNOWN, VT_DISPATCH und VT_VARIANT. Diese Werte sind wechselseitig exklusiv, können aber mit VT_BYREF vereinigt werden, um zu spezifizieren, dass es sich um einen Wert handelt. Wird er weggelassen, wird der Typ von value verwendet. Konsultieren Sie bitte die MSDN Library für weitere Informationen.

codepage

gibt die Codepage an, welche zur Konvertierung der PHP-Strings in Unicode-Strings und umgekehrt verwendet wird. Mögliche Werte sind CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 und CP_UTF8.

com_addref

(4.1.0 - 4.3.0 only)

com_addref --  Erhöht den Referenzzähler der Komponente

Beschreibung

void com_addref ( void)

Erhöht den Referenzzähler der Komponente.

com_get

(PHP 3>= 3.0.3, 4.0.5 - 4.3.0 only)

com_get --  Liefert den Wert der Eigenschaft einer COM Komponente

Beschreibung

mixed com_get ( resource com_object, string property)

Liefert den Wert der Eigenschaft property der mittels com_object referenzierten COM Komponente. Gibt im Fehlerfall FALSE zurück.

com_invoke

(PHP 3>= 3.0.3)

com_invoke --  Ruft eine Methode einer COM Komponente auf

Beschreibung

mixed com_invoke ( resource com_object, string function_name [, mixed function parameters, ...])

com_invoke() ruft eine Methode des mittels com_object referenzierten COM Komponente auf. Gibt bei Erfolg den Rückgabewert von function_name, oder im Fehlerfall FALSE zurück.

com_isenum

(4.1.0 - 4.3.0 only)

com_isenum -- Holt eine IEnumVariant

Beschreibung

void com_isenum ( object com_module)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

com_load_typelib

(4.1.0 - 4.3.0 only)

com_load_typelib -- Lädt eine Typelib

Beschreibung

void com_load_typelib ( string typelib_name [, int case_insensitive])

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

com_load

(PHP 3>= 3.0.3)

com_load --  Erstellt eine neue Referenz auf eine COM Komponente

Beschreibung

string com_load ( string module_name [, string server_name [, int codepage]])

com_load() erstellt eine neue COM Komponente, und gibt eine Referenz darauf zurück. Im Fehlerfall wird FALSE zurückgegeben. Mögliche Werte für codepage sind CP_ACP, CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP, CP_UTF7 und CP_UTF8.

com_propget

(PHP 3>= 3.0.3, 4.0.5 - 4.3.0 only)

com_propget --  Liefert den Wert der Eigenschaft einer COM Komponente

Beschreibung

mixed com_propget ( resource com_object, string property)

Diese Funktion ist ein Alias von com_get().

com_propput

(PHP 3>= 3.0.3, 4.0.5 - 4.3.0 only)

com_propput --  Weist einer Eigenschaft einer COM Komponente einen Wert zu

Beschreibung

void com_propput ( resource com_object, string property, mixed value)

Diese Funktion ist ein Alias für com_set().

com_propset

(PHP 3>= 3.0.3, 4.0.5 - 4.3.0 only)

com_propset --  Weist einer Eigenschaft einer COM Komponente einen Wert zu

Beschreibung

void com_propset ( resource com_object, string property, mixed value)

Diese Funktion ist ein Alias für com_set().

com_release

(4.1.0 - 4.3.0 only)

com_release --  Reduziert den Referenzzähler der Komponente

Beschreibung

void com_release ( void)

Reduziert den Referenzzähler der Komponente.

com_set

(PHP 3>= 3.0.3, 4.0.5 - 4.3.0 only)

com_set --  Weist einer Eigenschaft einer COM Komponente einen Wert zu.

Beschreibung

void com_set ( resource com_object, string property, mixed value)

Setzt den Wert der Eigenschaft property der COM Komponente com_object. Gibt bei Erfolg den neu gesetzten Wert, oder im Fehlerfall FALSE zurück.

IX. Klassen- und Objekt-Funktionen

Einführung

About

Diese Funktionen ermöglichen Ihnen den Zugriff auf Informationen über Klassen und Objektinstanzen. Sie können den Namen der Klasse ermitteln, zu der ein Objekt gehört, sowie ihre Eigenschaften und -methoden. Mit diesen Funktionen können Sie nicht nur die Klassenmitgliedschaft eines Objektes herausfinden, sondern auch ihre Abstammung (d. h. welche Klasse die des Objektes erweitert).


Anwendungsbeispiel

In diesem Beispiel definieren wir zuerst eine Basisklasse und eine Erweiterung dieser Klasse. Die Basisklasse beschreibt ein beliebiges Gemüse, ob es eßbar ist oder nicht, sowie seine Farbe. Die Subklasse Spinat fügt eine Methode hinzu, um sie zu kochen und eine weitere, um herauszufinden, ob sie gekocht ist.

Beispiel 1. classes.inc

<?php

// Basisklasse mit Eigenschaften und Methoden
class Gemuese {

    var $essbar;
    var $farbe;

    function Gemuese( $essbar, $farbe="grün" ) {
        $this->essbar = $essbar;
        $this->farbe = $farbe;
    }

    function ist_essbar() {
        return $this->essbar;
    }

    function welche_farbe() {
        return $this->farbe;
    }
    
} // Ende der Klasse Gemuese

// erweitert die Basisklasse
class Spinat extends Gemuese {

    var $gekocht = false;

    function Spinat() {
        $this->Gemuese( true, "grün" );
    }

    function koche_es() {
        $this->gekocht = true;
    }

    function ist_gekocht() {
        return $this->gekocht;
    }
    
} // Ende der Klasse Spinat

?>

Jetzt instantiieren wir zwei Objekte von diesen Klassen und geben Informationen über sie aus, einschließlich ihrer Abstammung. Wir definieren auch einige Hilfsfunktionen, hauptsächlich um eine hübsche Ausgabe der Variablen zu erhalten.

Beispiel 2. test_script.php

<pre>
<?php

include "classes.inc";

// utility functions

function zeige_vars($obj) {
    $arr = get_object_vars($obj);
    while (list($prop, $val) = each($arr))
        echo "\t$prop = $val\n";
}

function zeige_methoden($obj) {
    $arr = get_class_methods(get_class($obj));
    foreach ($arr as $method)
        echo "\tfunction $method()\n";
}

function klassen_abstammung($obj, $class) {
    global $$obj;
    if (is_subclass_of($$obj, $class)) {
        echo "Objekt $obj gehört zur Klasse ".get_class($$obj);
        echo " einer Subklasse von $class\n";
    } else {
        echo "Object $obj gehört nicht zu einer Subklasse von $class\n";
    }
}

// Instantiiere zwei Objekte

$veggie = new Gemuese(true,"blau");
$leafy = new Spinat();

// Informationen über die Objekte ausgeben
echo "veggie: KLASSE ".get_class($veggie)."\n";
echo "leafy: KLASSE ".get_class($leafy);
echo ", ELTERN ".get_parent_class($leafy)."\n";

// Zeige Eigenschaften von veggie
echo "\nveggie: Eigenschaften\n";
zeige_vars($veggie);

// und Methoden von leafy
echo "\nleafy: Methoden\n";
zeige_methoden($leafy);

echo "\nAbstammung:\n";
klassen_abstammung("leafy", "Spinat");
klassen_abstammung("leafy", "Gemuese");
?>
</pre>

Wichtig ist in diesem Beispiel, dass das Objekt $leafy eine Instanz der Klasse Spinat ist, die eine Subklasse von Gemuese ist. Darum gibt der letzte Teil des obigen Skripts folgendes aus:

[...]
Abstammung:
Objekt leafy gehört nicht zu einer Subklasse von Spinat
Objekt leafy gehört zur Klasse spinat einer Subklasse von Gemuese

Inhaltsverzeichnis
call_user_method_array --  Call a user method given with an array of parameters [deprecated]
call_user_method --  Aufruf einer benutzerdefinierten Methode eines bestimmten Objektes
class_exists -- Prüft, ob eine Klasse definiert ist
get_class_methods --  Liefert die Namen aller Methoden einer Klasse
get_class_vars --  Liefert die Standard-Elemente einer Klasse
get_class -- Gibt den Namen der Klasse eines Objektes zurück
get_declared_classes -- Gibt ein Array mit den Namen der definierten Klassen zurück
get_object_vars -- Liefert die Elemente eines Objekts
get_parent_class -- Gibt den Namen der Elternklasse eines Objektes zurück
is_a --  Returns TRUE if the object is of this class or has this class as one of its parents
is_subclass_of --  Bestimmt, ob ein Objekt zu einer Subklasse der angegebenen Klasse gehört
method_exists -- Prüft, ob Methode in einer Klasse definiert ist

call_user_method_array

(PHP 4 >= 4.0.5)

call_user_method_array --  Call a user method given with an array of parameters [deprecated]

Description

mixed call_user_method_array ( string method_name, object obj [, array paramarr])

Warnung

The call_user_method_array() function is deprecated as of PHP 4.1.0, use the call_user_func_array() variety with the array(&$obj, "method_name") syntax instead.

Calls the method referred by method_name from the user defined obj object, using the parameters in paramarr.

See also: call_user_func_array(), call_user_func(), call_user_method().

Anmerkung: This function was added to the CVS code after release of PHP 4.0.4pl1

call_user_method

(PHP 3>= 3.0.3, PHP 4 )

call_user_method --  Aufruf einer benutzerdefinierten Methode eines bestimmten Objektes

Beschreibung

mixed call_user_method ( string method_name, object obj [, mixed parameter [, mixed ...]])

Ruft die durch method_name angegebene Methode des benutzerdefinierten Objektes obj auf. Ein Anwendungsbeispiel sehen Sie unten, wo wir eine Klasse definieren, ein Objekt instantiieren und call_user_method() benutzen, um seine Methode zeige_info indirekt aufzurufen.

<?php
class Land {
    var $NAME;
    var $TLD;
    
    function Land($name, $tld) {
        $this->NAME = $name;
        $this->TLD = $tld;
    }

    function zeige_info($prestr="") {
        echo $prestr."Land: ".$this->NAME."\n";
        echo $prestr."Top-Level-Domain: ".$this->TLD."\n";
    }
}

$cntry = new Land("Peru","pe");

echo "* Direkter Aufruf der Methode\n";
$cntry->zeige_info();

echo "\n* Indirekter Aufruf derselben Methode\n";
call_user_method ("zeige_info", $cntry, "\t");
?>

Siehe auch call_user_func().

class_exists

(PHP 4 )

class_exists -- Prüft, ob eine Klasse definiert ist

Beschreibung

bool class_exists ( string class_name)

Diese Funktion ergibt TRUE, falls eine Klasse mit dem Namen class_name definiert ist, ansonsten FALSE.

get_class_methods

(PHP 4 )

get_class_methods --  Liefert die Namen aller Methoden einer Klasse

Beschreibung

array get_class_methods ( string class_name)

Diese Funktion liefert ein String-Array zurück, das mit den Namen aller in der Klasse class_name definerten Methoden gefüllt ist.

get_class_vars

(PHP 4 )

get_class_vars --  Liefert die Standard-Elemente einer Klasse

Beschreibung

array get_class_vars ( string class_name)

Diese Funktion liefert ein String-Array zurück, das mit den Standard-Elementen der Klasse class_name gefüllt ist. Standard-Elemente sind all die Elemente, die bereits in der Klassendefinition mit 'var' definiert wurden.

get_class

(PHP 4 )

get_class -- Gibt den Namen der Klasse eines Objektes zurück

Beschreibung

string get_class ( object obj)

Diese Funktion gibt den Namen der Klasse zurück, von der obj eine Instanz ist.

Siehe auch get_parent_class(), is_subclass_of()

get_declared_classes

(PHP 4 )

get_declared_classes -- Gibt ein Array mit den Namen der definierten Klassen zurück

Beschreibung

array get_declared_classes ( void)

Diese Funktion gibt ein Array mit den Namen aller im aktuellen Skript definierten Klassen zurück.

Anmerkung: In PHP 4.0.1pl2 werden drei zusätzliche Klassen am Anfang des Array zurückgegeben: stdClass (definiert in Zend/zend.c), OverloadedTestClass (definiert in ext/standard/basic_functions.c) und Directory (definiert in ext/standard/dir.c).

Abhängig von den Optionen, mit denen PHP kompiliert wurde, könnnen noch weitere Klassen vorhanden sein.

get_object_vars

(PHP 4 )

get_object_vars -- Liefert die Elemente eines Objekts

Beschreibung

array get_object_vars ( object obj)

Diese Funktion gibt ein assoziatives Array der für das angegebene Objekt obj definierten Eigenschaften zurück. Wenn Variablen der Klasse, von der obj eine Instanz ist, kein Wert zugewiesen wurde, werden diese nicht im Array zurückgegeben.

Beispiel 1. Gebrauch von get_object_vars()

<?php
class Punkt2D {
    var $x, $y;
    var $bezeichnung;

    function Punkt2D($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }

    function setzeBezeichnung($bezeichnung) {
        $this->bezeichnung = $bezeichnung;
    }

    function gibPunkt() {
        return array("x" => $this->x,
                     "y" => $this->y,
                     "bezeichnung" => $this->bezeichnung);
    }
}

$p1 = new Punkt2D(1.233, 3.445);
print_r(get_object_vars($p1));
// "$bezeichnung" ist deklariert, aber nicht definiert
// Array
// (
//     [x] => 1.233
//     [y] => 3.445
// )

$p1->setzeBezeichnung("point #1");

print_r(get_object_vars($p1));
// Array
// (
//     [x] => 1.233
//     [y] => 3.445
//     [bezeichnung] => point #1
// )

?>

Siehe auch get_class_methods(), get_class_vars()

get_parent_class

(PHP 4 )

get_parent_class -- Gibt den Namen der Elternklasse eines Objektes zurück

Beschreibung

string get_parent_class ( object obj)

Diese Funktion gibt den Namen der Elternklasse der Klasse zurück, von der obj eine Instanz ist.

Siehe auch get_class(), is_subclass_of()

is_a

(PHP 4 >= 4.2.0)

is_a --  Returns TRUE if the object is of this class or has this class as one of its parents

Description

bool is_a ( object object, string class_name)

This function returns TRUE if the object is of this class or has this class as one of its parents, FALSE otherwise.

See also get_class(), get_parent_class(), and is_subclass_of().

is_subclass_of

(PHP 4 )

is_subclass_of --  Bestimmt, ob ein Objekt zu einer Subklasse der angegebenen Klasse gehört

Beschreibung

bool is_subclass_of ( object obj, string superclass)

Diese Funktion ergibt TRUE, falls das Objekt obj zu einer Subklasse von superclass gehört, ansonsten FALSE.

Siehe auch get_class(), get_parent_class()

method_exists

(PHP 4 )

method_exists -- Prüft, ob Methode in einer Klasse definiert ist

Beschreibung

bool method_exists ( object object, string method_name)

Diese Funktion liefert TRUE, wenn eine Methode mit Namen method_name für das in object übergebene Objekt definiert wurde, sonst FALSE.

Siehe auch function_exists()

X. ClibPDF Funktionen

Einführung

Mit der ClibPDF können Sie PDF-Dokumente mit PHP erstellen. Funktionalität und API der ClibPDF sind der PDFlib ähnlich. Diese Dokumentation sollten Sie zusammen mit dem ClibPDF-Handbuch lesen, weil letzteres diese Bibliothek viel ausführlicher erklärt.

Die Namen vieler Funktionen in der ClibPDF, im PHP-Modul und in der PDFlib sind gleich. Außer cpdf_open() nehmen alle Funktionen die Bezeichnung des Dokuments als ihren ersten Parameter.

Diese Bezeichnung wird gegenwärtig nicht intern verwendet, weil ClibPDF die gleichzeitige Erzeugung mehrerer PDF-Dokumente nicht unterstützt. Da das Ergebnis nicht vorhersehbar ist, sollten Sie es am besten nicht einmal testen. Die Folgen, die das in einer multi-threaded Umgebung hätte, kann ich nicht abschätzen. Laut ClibPDF-Autor wird sich das in einer der nächsten Versionen ändern (als dieses geschrieben wurde, war Version 1.10 aktuell). Verwenden Sie das pdflib-Modul, wenn Sie diese Funktionalität benötigen.

Eine nette Eigenschaft der ClibPDF (und der PDFlib) ist die Möglichkeit, das PDF-Dokument vollständig im Speicher zu erzeugen, ohne temporäre Dateien zu verwenden. Sie bietet auch die Möglichkeit, Koordinaten in einer vordefinierten Längeneinheit zu übergeben. Dies ist eine praktische Fähigkeit, die bei Verwendung der PDFlib aber auch mit pdf_translate() simuliert werden kann.

Eine weitere nette Eigenschaft von ClibPDF ist die Tatsache, dass jede Seite jederzeit geändert werden kann, selbst wenn schon eine neue Seite geöffnet wurde. Die Funktion cpdf_set_current_page() erlaubt es, die aktuelle Seite zu verlassen und mit den Änderungen einer anderen Seite fortzufahren.

Die meisten Funktionen sind ziemlich einfach zu benutzen. Der schwierigste Teil ist wahrscheinlich die Erzeugung eines sehr einfachen PDF-Dokuments überhaupt. Das folgende Beispiel sollte für Sie eine gute Starthilfe sein. Es erzeugt ein Dokument mit einer Seite. Die Seite enthält den Umriss des Textes "Times-Roman" in 30-Punkt-Schrift. Der Text ist unterstrichen.


Anforderungen

Um die ClibPDF-Funktionen benutzen zu können, müssen Sie das ClibPDF-Paket installieren. Es ist zum Herunterladen erhältlich von FastIO, aber für deren kommerzielle Verwendung ist es erforderlich, dass Sie eine Lizenz erwerben. Für PHP wird cpdflib >= 2 benötigt.


Installation

Damit diese Funktionen zur Verfügung stehen, müssen Sie PHP mit --with-cpdflib[=DIR] übersetzen. DIR ist das cpdflib-Installationsverzeichnis, standardmäßig /usr. Zusätzlich können Sie die jpeg- und tiff-Bibliotheken für die Verwendung durch ClibPDF angeben. Das erreichen Sie, indem Sie an ihre Konfigurationszeile die Optionen --with-jpeg-dir[=DIR] --with-tiff-dir[=DIR] anfügen.


Laufzeit Konfiguration

Diese Erweiterung definiert keine Konfigurationseinstellungen in der php.ini.


Vordefinierte Konstanten

Folgende Konstanten werden von dieser Erweiterung definiert und stehen nur zur Verfügung, wenn die Erweiterung entweder statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen wurde.

CPDF_PM_NONE (integer)

CPDF_PM_OUTLINES (integer)

CPDF_PM_THUMBS (integer)

CPDF_PM_FULLSCREEN (integer)

CPDF_PL_SINGLE (integer)

CPDF_PL_1COLUMN (integer)

CPDF_PL_2LCOLUMN (integer)

CPDF_PL_2RCOLUMN (integer)


Beispiele

Beispiel 1. Ein einfaches ClibPDF-Beispiel

<?php
$cpdf = cpdf_open(0);
cpdf_page_init($cpdf, 1, 0, 595, 842, 1.0);
cpdf_add_outline($cpdf, 0, 0, 0, 1, "Seite 1");
cpdf_begin_text($cpdf);
cpdf_set_font($cpdf, "Times-Roman", 30, "WinAnsiEncoding");
cpdf_set_text_rendering($cpdf, 1);
cpdf_text($cpdf, "Times Roman outlined", 50, 750);
cpdf_end_text($cpdf);	
cpdf_moveto($cpdf, 50, 740);
cpdf_lineto($cpdf, 330, 740);
cpdf_stroke($cpdf);
cpdf_finalize($cpdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($cpdf);
cpdf_close($cpdf);
?>

Die pdflib-Distribution enthält ein komplexeres Beispiel, das eine Reihe von Seiten mit einer Analoguhr erzeugt. Hier ist dieses Beispiel, das unter Verwendung der ClibPDF-Erweiterung in PHP konvertiert wurde:

Beispiel 2. pdfclock-Beispiel der pdflib 2.0 Distribution

<?php
$radius = 200;
$margin = 20;
$pagecount = 40;

$pdf = cpdf_open(0);
cpdf_set_creator($pdf, "pdf_clock.php3");
cpdf_set_title($pdf, "Analog Clock");
  
while($pagecount-- > 0) {
  cpdf_page_init($pdf, $pagecount+1, 0, 2 * ($radius + $margin), 2 * ($radius + $margin), 1.0);
  
  cpdf_set_page_animation($pdf, 4, 0.5, 0, 0, 0);  /* wipe */
  
  cpdf_translate($pdf, $radius + $margin, $radius + $margin);
  cpdf_save($pdf);
  cpdf_setrgbcolor($pdf, 0.0, 0.0, 1.0);
  
  /* minute strokes */
  cpdf_setlinewidth($pdf, 2.0);
  for ($alpha = 0; $alpha < 360; $alpha += 6)
    {
    cpdf_rotate($pdf, 6.0);
    cpdf_moveto($pdf, $radius, 0.0);
    cpdf_lineto($pdf, $radius-$margin/3, 0.0);
    cpdf_stroke($pdf);
    }
  
  cpdf_restore($pdf);
  cpdf_save($pdf);
 
  /* 5 minute strokes */
  cpdf_setlinewidth($pdf, 3.0);
  for ($alpha = 0; $alpha < 360; $alpha += 30)
  {
    cpdf_rotate($pdf, 30.0);
    cpdf_moveto($pdf, $radius, 0.0);
    cpdf_lineto($pdf, $radius-$margin, 0.0);
    cpdf_stroke($pdf);
  }

  $ltime = getdate();

  /* draw hour hand */
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['minutes']/60.0) + $ltime['hours'] - 3.0) * 30.0);
  cpdf_moveto($pdf, -$radius/10, -$radius/20);
  cpdf_lineto($pdf, $radius/2, 0.0);
  cpdf_lineto($pdf, -$radius/10, $radius/20);
  cpdf_closepath($pdf);
  cpdf_fill($pdf);
  cpdf_restore($pdf);

  /* draw minute hand */
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['seconds']/60.0) + $ltime['minutes'] - 15.0) * 6.0);
  cpdf_moveto($pdf, -$radius/10, -$radius/20);
  cpdf_lineto($pdf, $radius * 0.8, 0.0);
  cpdf_lineto($pdf, -$radius/10, $radius/20);
  cpdf_closepath($pdf);
  cpdf_fill($pdf);
  cpdf_restore($pdf);

  /* draw second hand */
  cpdf_setrgbcolor($pdf, 1.0, 0.0, 0.0);
  cpdf_setlinewidth($pdf, 2);
  cpdf_save($pdf);
  cpdf_rotate($pdf, -(($ltime['seconds'] - 15.0) * 6.0));
  cpdf_moveto($pdf, -$radius/5, 0.0);
  cpdf_lineto($pdf, $radius, 0.0);
  cpdf_stroke($pdf);
  cpdf_restore($pdf);

  /* draw little circle at center */
  cpdf_circle($pdf, 0, 0, $radius/30);
  cpdf_fill($pdf);

  cpdf_restore($pdf);

  cpdf_finalize_page($pdf, $pagecount+1);
}

cpdf_finalize($pdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($pdf);
cpdf_close($pdf);
?>

Siehe auch

Siehe auch die Dokumentation der PDFlib-Erweiterung.

Inhaltsverzeichnis
cpdf_add_annotation -- Fügt eine Anmerkung ein
cpdf_add_outline --  Fügt ein Lesezeichen für die aktuelle Seite hinzu
cpdf_arc -- Zeichnet einen Kreisbogen
cpdf_begin_text -- Beginnt einen Textabschnitt
cpdf_circle -- Zeichnet einen Kreis
cpdf_clip --  Beschränkt alle Zeichnungen auf den aktuellen Pfad
cpdf_close -- Schließt ein PDF-Dokument
cpdf_closepath_fill_stroke --  Schließt, füllt und zeichnet den aktuellen Pfad
cpdf_closepath_stroke --  Schließt einen Pfad und zeichnet eine Linie entlang des Pfades
cpdf_closepath -- Schließt den aktuellen Pfad
cpdf_continue_text -- Gibt den Text in der nächsten Zeile aus
cpdf_curveto -- Zeichnet eine Kurve
cpdf_end_text -- Beendet einen Textabschnitt
cpdf_fill_stroke --  Füllt und zeichnet den aktuellen Pfad
cpdf_fill -- Füllt den aktuellen Pfad
cpdf_finalize_page -- Beendet eine Seite
cpdf_finalize -- Beendet ein Dokument
cpdf_global_set_document_limits --  Setzt Beschränkungen für alle PDF-Dokumente
cpdf_import_jpeg -- Öffnet ein JPEG-Bild
cpdf_lineto -- Zeichnet eine Linie
cpdf_moveto -- Legt die aktuelle Position fest
cpdf_newpath -- Beginnt einen neuen Pfad
cpdf_open -- Öffnet ein neues PDF-Dokument
cpdf_output_buffer --  Gibt das PDF-Dokument aus dem Zwischenspeicher aus
cpdf_page_init -- Beginnt eine neue Seite
cpdf_place_inline_image -- Platziert ein Bild auf der Seite
cpdf_rect -- Zeichnet ein Rechteck
cpdf_restore --  Stellt die zuvor gesicherte Umgebung wieder her
cpdf_rlineto -- Zeichnet eine Linie (relativ)
cpdf_rmoveto -- Legt die relative aktuelle Position fest
cpdf_rotate_text --  Legt den Drehwinkel für Text fest
cpdf_rotate -- Legt den Drehwinkel fest
cpdf_save_to_file -- Schreibt ein PDF-Dokument in eine Datei
cpdf_save -- Sichert die aktuelle Umgebung
cpdf_scale -- Legt die Vergrößerung fest
cpdf_set_action_url --  Setzt einen Hyperlink
cpdf_set_char_spacing -- Legt den Zeichenabstand fest
cpdf_set_creator -- Setzt das Urheberfeld des PDF-Dokuments
cpdf_set_current_page -- Setzt die aktuelle Seite
cpdf_set_font_directories --  Legt die Verzeichnisse fest, die bei Verwendung externer Schriftarten durchsucht werden
cpdf_set_font_map_file --  Legt bei Verwendung externer Schriftarten die Datei mit den Schriftart-Dateiname-Zuordnungen fest
cpdf_set_font -- Wählt die aktuelle Schriftart und -größe
cpdf_set_horiz_scaling -- Setzt die horizontale Textskalierung
cpdf_set_keywords --  Setzt das Schlüsselwortfeld des PDF-Dokuments
cpdf_set_leading -- Setzt den Zeilenabstand
cpdf_set_page_animation --  Legt den Übergang zwischen den Seiten fest
cpdf_set_subject -- Setzt das Themenfeld des PDF-Dokuments
cpdf_set_text_matrix -- Legt die Text-Matrix fest
cpdf_set_text_pos -- Legt die Textposition fest
cpdf_set_text_rendering -- Legt fest, wie Text wiedergegeben wird
cpdf_set_text_rise -- Legt die vertikale Textverschiebung fest
cpdf_set_title -- Setzt das Titelfeld PDF-Dokuments
cpdf_set_viewer_preferences --  Legt fest, wie das Dokument im Betrachter dargestellt wird
cpdf_set_word_spacing --  Legt den Abstand zwischen den Wörtern fest
cpdf_setdash -- Setzt eine gestrichelte Linie
cpdf_setflat -- Legt die Flachheit fest
cpdf_setgray_fill -- Setzt die Füllfarbe auf einen Grauwert
cpdf_setgray_stroke -- Setzt die Zeichenfarbe auf einen Grauwert
cpdf_setgray --  Setzt Zeichen- und Füllfarbe auf einen Grauwert
cpdf_setlinecap -- Legt den Typ der Linienenden fest
cpdf_setlinejoin -- Legt den Typ der Linienverbindungen fest
cpdf_setlinewidth -- Legt die Linienbreite fest
cpdf_setmiterlimit -- Legt die Gehrungsbegrenzung fest
cpdf_setrgbcolor_fill --  Setzt die Füllfarbe auf einen RGB-Farbwert
cpdf_setrgbcolor_stroke --  Setzt die Zeichenfarbe auf einen RGB-Farbwert
cpdf_setrgbcolor --  Setzt Zeichen- und Füllfarbe auf einen RGB-Farbwert
cpdf_show_xy -- Gibt Text an der angegebenen Position aus
cpdf_show -- Gibt Text an der aktuellen Position aus
cpdf_stringwidth --  Liefert die Breite einer Zeichenkette in der aktuellen Schriftart
cpdf_stroke --  Zeichnet eine Linie entlang des aktuellen Pfades
cpdf_text -- Gibt den Text mit Parametern aus
cpdf_translate --  Legt den Ursprung des Koordinatensystems fest

cpdf_add_annotation

(PHP 3>= 3.0.12, PHP 4 )

cpdf_add_annotation -- Fügt eine Anmerkung ein

Beschreibung

void cpdf_add_annotation ( int PDF-Dokument, float ulx, float uly, float orx, float ory, string Titel, string Inhalt [, int Modus])

Die Funktion cpdf_add_annotation() fügt eine Anmerkung ein, bei der die untere linke Ecke bei (ulx, uly) und die obere rechte Ecke bei (orx, ory) liegt.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, dil wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

cpdf_add_outline

(PHP 3>= 3.0.9, PHP 4 )

cpdf_add_outline --  Fügt ein Lesezeichen für die aktuelle Seite hinzu

Beschreibung

void cpdf_add_outline ( int PDF-Dokument, string Text)

Die Funktion cpdf_add_outline() fügt ein Lesezeichen mit dem Text Text hinzu, das auf die aktuelle Seite zeigt.

Beispiel 1. Hinzufügen einer Seitenübersicht

<?php
$cpdf = cpdf_open(0);
cpdf_page_init($cpdf, 1, 0, 595, 842);
cpdf_add_outline($cpdf, 0, 0, 0, 1, "Seite 1");
// ...
// etwas Zeichnung
// ... 
cpdf_finalize($cpdf);
Header("Content-type: application/pdf");
cpdf_output_buffer($cpdf);
cpdf_close($cpdf);
?>

cpdf_arc

(PHP 3>= 3.0.8, PHP 4 )

cpdf_arc -- Zeichnet einen Kreisbogen

Beschreibung

void cpdf_arc ( int PDF-Dokument, float x-koor, float y-koor, float Radius, float Anfang, float Ende [, int Modus])

Die Funktion cpdf_arc() zeichnet einen Kreisbogen mit dem Mittelpunkt (x-koor, y-koor) und dem Radius Radius, der mit dem Winkel Anfang beginnt und mit dem Winkel Ende endet.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_circle().

cpdf_begin_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_begin_text -- Beginnt einen Textabschnitt

Beschreibung

void cpdf_begin_text ( int PDF-Dokument)

Die Funktion cpdf_begin_text() beginnt einen Textabschnitt. Er muss mit cpdf_end_text() beendet werden.

Beispiel 1. Ausgabe von Text

<?php
cpdf_begin_text($pdf);
cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding");
cpdf_text($pdf, 100, 100, "Etwas Text");
cpdf_end_text($pdf)
?>

Siehe auch: cpdf_end_text().

cpdf_circle

(PHP 3>= 3.0.8, PHP 4 )

cpdf_circle -- Zeichnet einen Kreis

Beschreibung

void cpdf_circle ( int PDF-Dokument, float x-koor, float y-koor, float Radius [, int Modus])

Die Funktion cpdf_circle() zeichnet einen Kreis mit dem Mittelpunkt (x-koor, y-koor) und dem Radius Radius.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_arc().

cpdf_clip

(PHP 3>= 3.0.8, PHP 4 )

cpdf_clip --  Beschränkt alle Zeichnungen auf den aktuellen Pfad

Beschreibung

void cpdf_clip ( int PDF-Dokument)

Die Funktion cpdf_clip() beschränkt alle Zeichnungen auf den aktuellen Pfad.

cpdf_close

(PHP 3>= 3.0.8, PHP 4 )

cpdf_close -- Schließt ein PDF-Dokument

Beschreibung

void cpdf_close ( int PDF-Dokument)

Die Funktion cpdf_close() schließt das PDF-Dokument. Sie sollte als letzte, sogar nach cpdf_finalize(), cpdf_output_buffer() und cpdf_save_to_file(), aufgerufen werden.

Siehe auch: cpdf_open().

cpdf_closepath_fill_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath_fill_stroke --  Schließt, füllt und zeichnet den aktuellen Pfad

Beschreibung

void cpdf_closepath_fill_stroke ( int PDF-Dokument)

Die Funktion cpdf_closepath_fill_stroke() schließt den aktuellen Pfad, füllt seinen Innenraum mit der aktuellen Füllfarbe und zeichnet ihn.

Siehe auch: cpdf_closepath(), cpdf_stroke(), cpdf_fill(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() und cpdf_setrgbcolor().

cpdf_closepath_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath_stroke --  Schließt einen Pfad und zeichnet eine Linie entlang des Pfades

Beschreibung

void cpdf_closepath_stroke ( int PDF-Dokument)

Die Funktion cpdf_closepath_stroke() ist eine Kombination aus cpdf_closepath() und cpdf_stroke(). Der Pfad wird geschlossen.

Siehe auch: cpdf_closepath() und cpdf_stroke().

cpdf_closepath

(PHP 3>= 3.0.8, PHP 4 )

cpdf_closepath -- Schließt den aktuellen Pfad

Beschreibung

void cpdf_closepath ( int PDF-Dokument)

Die Funktion cpdf_closepath() schließt den aktuellen Pfad.

cpdf_continue_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_continue_text -- Gibt den Text in der nächsten Zeile aus

Beschreibung

void cpdf_continue_text ( int PDF-Dokument, string Text)

Die Funktion cpdf_continue_text() gibt die Zeichenkette in Text in der nächsten Zeile aus.

Siehe auch: cpdf_show_xy(), cpdf_text(), cpdf_set_leading() und cpdf_set_text_pos().

cpdf_curveto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_curveto -- Zeichnet eine Kurve

Beschreibung

void cpdf_curveto ( int PDF-Dokument, float x1, float y1, float x2, float y2, float x3, float y3 [, int Modus])

Die Funktion cpdf_curveto() zeichnet eine Bezier-Kurve vom aktuellen Punkt zum Punkt (x3, y3), wobei (x1, y1) und (x2, y2) als Kontrollpunkte verwendet werden.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_moveto(), cpdf_rmoveto(), cpdf_rlineto() und cpdf_lineto().

cpdf_end_text

(PHP 3>= 3.0.8, PHP 4 )

cpdf_end_text -- Beendet einen Textabschnitt

Beschreibung

void cpdf_end_text ( int PDF-Dokument)

Die Funktion cpdf_end_text() beendet einen Textabschnitt, der mit cpdf_begin_text() begonnen wurde.

Beispiel 1. Ausgabe von Text

<?php
cpdf_begin_text($pdf);
cpdf_set_font($pdf, 16, "Helvetica", "WinAnsiEncoding");
cpdf_text($pdf, 100, 100, "Etwas Text");
cpdf_end_text($pdf)
?>

Siehe auch: cpdf_begin_text().

cpdf_fill_stroke

(PHP 3>= 3.0.8, PHP 4 )

cpdf_fill_stroke --  Füllt und zeichnet den aktuellen Pfad

Beschreibung

void cpdf_fill_stroke ( int PDF-Dokument)

Die Funktion cpdf_fill_stroke() füllt den Innenraum des aktuellen Pfades mit der aktuellen Füllfarbe und zeichnet den aktuellen Pfad.

Siehe auch: cpdf_closepath(), cpdf_stroke(), cpdf_fill(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() und cpdf_setrgbcolor().

cpdf_fill

(PHP 3>= 3.0.8, PHP 4 )

cpdf_fill -- Füllt den aktuellen Pfad

Beschreibung

void cpdf_fill ( int PDF-Dokument)

Die Funktion cpdf_fill() füllt den Innenraum des aktuellen Pfades mit der aktuellen Füllfarbe.

Siehe auch: cpdf_closepath(), cpdf_stroke(), cpdf_setgray_fill(), cpdf_setgray(), cpdf_setrgbcolor_fill() und cpdf_setrgbcolor().

cpdf_finalize_page

(PHP 3>= 3.0.10, PHP 4 )

cpdf_finalize_page -- Beendet eine Seite

Beschreibung

void cpdf_finalize_page ( int PDF-Dokument, int Seitennummer)

Die Funktion cpdf_finalize_page() beendet die Seite mit der Seitennummer Seitennummer.

Diese Funktion hat nur den Zweck, Speicherplatz zu sparen. Eine abgeschlossene Seite belegt weniger Speicherplatz, kann aber nicht mehr verändert werden.

Siehe auch: cpdf_page_init().

cpdf_finalize

(PHP 3>= 3.0.8, PHP 4 )

cpdf_finalize -- Beendet ein Dokument

Beschreibung

void cpdf_finalize ( int PDF-Dokument)

Die Funktion cpdf_finalize() beendet das Dokument PDF-Dokument. Sie müssen danach trotzdem noch cpdf_close() aufrufen.

Siehe auch: cpdf_close().

cpdf_global_set_document_limits

(PHP 4 )

cpdf_global_set_document_limits --  Setzt Beschränkungen für alle PDF-Dokumente

Beschreibung

void cpdf_global_set_document_limits ( int maxSeiten, int maxSchriftarten, int maxAbbildungen, int maxBemerkungen, int maxObjekte)

Die Funktion cpdf_global_set_document_limits() setzt verschiedene Beschränkungen für Dokumente. Damit diese Funktion wirksam wird, muss sie vor cpdf_open() aufgerufen werden. Sie setzt die Beschränkungen für alle Dokumente, die danach geöffnet werden.

Siehe auch: cpdf_open().

cpdf_import_jpeg

(PHP 3>= 3.0.9, PHP 4 )

cpdf_import_jpeg -- Öffnet ein JPEG-Bild

Beschreibung

int cpdf_import_jpeg ( int PDF-Dokument, string Dateiname, float x-koor, float y-koor, float Winkel, float Breite, float Höhe, float x-Skalierung, float y-Skalierung [, int Modus])

Die Funktion cpdf_import_jpeg() öffnet ein Bild, das unter dem Namen Dateiname gespeichert wurde. Das Bild muss im JPEG-Format vorliegen. Es wird auf der aktuellen Seite an der Position (x-koor, y-koor) platziert. Das Bild wird um Winkel Grad gedreht.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_place_inline_image().

cpdf_lineto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_lineto -- Zeichnet eine Linie

Beschreibung

void cpdf_lineto ( int PDF-Dokument, float x-koor, float y-koor [, int Modus])

Die Funktion cpdf_lineto() zeichnet eine Linie vom aktuellen Punkt zum Punkt mit den Koordinaten (x-koor, y-koor).

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_moveto(), cpdf_rmoveto() und cpdf_curveto().

cpdf_moveto

(PHP 3>= 3.0.8, PHP 4 )

cpdf_moveto -- Legt die aktuelle Position fest

Beschreibung

void cpdf_moveto ( int PDF-Dokument, float x-koor, float y-koor [, int Modus])

Die Funktion cpdf_moveto() setzt die aktuelle Position auf die Koordinaten x-koor und y-koor.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_rmoveto().

cpdf_newpath

(PHP 3>= 3.0.9, PHP 4 )

cpdf_newpath -- Beginnt einen neuen Pfad

Beschreibung

void cpdf_newpath ( int PDF-Dokument)

Die Funktion cpdf_newpath() beginnt auf dem durch den Parameter PDF-Dokument angegebenen Dokument einen neuen Pfad.

cpdf_open

(PHP 3>= 3.0.8, PHP 4 )

cpdf_open -- Öffnet ein neues PDF-Dokument

Beschreibung

int cpdf_open ( int Komprimierung [, string Dateiname])

Die Funktion cpdf_open() öffnet ein neues PDF-Dokument. Wenn Komprimierung ungleich 0 ist, schaltet dieser Parameter die Komprimierung des Dokuments ein. Der optionale Parameter Dateiname bestimmt die Datei in die das Dokument geschrieben wird. Wenn er nicht angegeben wurde, wird das Dokument im Speicher erzeugt und kann entweder mit cpdf_save_to_file() in eine Datei geschrieben werden oder mit cpdf_output_buffer() an die Standardausgabe geschickt werden.

Anmerkung: Der Rückgabewert wird in künftigen ClibPDF-Versionen als erster Parameter aller anderen Funktionen benötigt, die in ein PDF-Dokument schreiben.

Die ClibPDF-Bibliothek betrachtet den Dateinamen "-" als Synonym für stdout. Das funktioniert allerdings nicht, wenn PHP als Apache-Modul kompiliert wurde, weil die Art und Weise, in der ClibPDF die Ausgabe an stdout vornimmt, nicht mit Apache funktioniert. Sie können dieses Problem lösen, indem Sie keinen Dateinamen angeben und stattdessen cpdf_output_buffer() verwenden, um das PDF-Dokument auszugeben.

Siehe auch: cpdf_close() und cpdf_output_buffer().

cpdf_output_buffer

(PHP 3>= 3.0.9, PHP 4 )

cpdf_output_buffer --  Gibt das PDF-Dokument aus dem Zwischenspeicher aus

Beschreibung

void cpdf_output_buffer ( int PDF-Dokument)

Die Funktion cpdf_output_buffer() gibt das PDF-Dokument an stdout aus. Das Dokument muss im Speicher erstellt worden sein, was der Fall ist, wenn cpdf_open() ohne den Parameter Dateiname aufgerufen wurde.

Siehe auch: cpdf_open().

cpdf_page_init

(PHP 3>= 3.0.8, PHP 4 )

cpdf_page_init -- Beginnt eine neue Seite

Beschreibung

void cpdf_page_init ( int PDF-Dokument, int Seitennummer, int Ausrichtung, float Höhe, float Breite [, float Einheit])

Die Funktion cpdf_page_init() beginnt eine neue Seite mit der Höhe Höhe und der Breite Breite. Die Seite hat die Nummer Seitennummer und die Ausrichtung Ausrichtung. Ausrichtung kann 0 für Hochformat oder 1 für Querformat sein. Der optionale Parameter Einheit gibt die Einheit des Koordinatensystems in Anzahl von Postscript-Punkten pro Einheit an. Da ein Zoll 72 Punkten entspricht, würde ein Wert von 72 die Einheit auf ein Zoll setzen. Auch der Standardwert ist 72.

Siehe auch: cpdf_set_current_page().

cpdf_place_inline_image

(PHP 3>= 3.0.9, PHP 4 )

cpdf_place_inline_image -- Platziert ein Bild auf der Seite

Beschreibung

void cpdf_place_inline_image ( int PDF-Dokument, int Bild, float x-koor, float y-koor, float Winkel, float Breite, float Höhe [, int Modus])

Die Funktion cpdf_place_inline_image() platziert auf der Seite ein Bild, das mit der PHP-Image-Funktion erstellt wurde, an der Position (x-koor, y-koor). Das Bild kann gleichzeitig skaliert werden.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_import_jpeg().

cpdf_rect

(PHP 3>= 3.0.8, PHP 4 )

cpdf_rect -- Zeichnet ein Rechteck

Beschreibung

void cpdf_rect ( int PDF-Dokument, float x-koor, float y-koor, float Breite, float Höhe [, int Modus])

Die Funktion cpdf_rect() zeichnet ein Rechteck, bei dem die linke untere Ecke im Punkt (x-koor, y-koor) liegt. Die Breite wird auf Breite und die Höhe auf Höhe gesetzt.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

cpdf_restore

(PHP 3>= 3.0.8, PHP 4 )

cpdf_restore --  Stellt die zuvor gesicherte Umgebung wieder her

Beschreibung

void cpdf_restore ( int PDF-Dokument)

Die Funktion cpdf_restore() stellt die mit cpdf_save() gesicherte Umgebung wieder her. Sie funktioniert wie der Postscript-Befehl grestore und ist sehr nützlich, wenn Sie ein Objekt verschieben oder drehen wollen, ohne dass es sich auf andere Objekte auswirkt.

Beispiel 1. Sichern/Wiederherstellen

<?php
cpdf_save($pdf);
// nehmen Sie alle möglichen Arten von Drehungen, Verformungen,... vor
cpdf_restore($pdf)
?>

Siehe auch: cpdf_save().

cpdf_rlineto

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rlineto -- Zeichnet eine Linie (relativ)

Beschreibung

void cpdf_rlineto ( int PDF-Dokument, float x-koor, float y-koor [, int Modus])

Die Funktion cpdf_rlineto() zeichnet eine Linie vom aktuellen Punkt zum relativen Punkt mit den Koordinaten (x-koor, y-koor).

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_moveto(), cpdf_rmoveto() und cpdf_curveto().

cpdf_rmoveto

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rmoveto -- Legt die relative aktuelle Position fest

Beschreibung

void cpdf_rmoveto ( int PDF-Dokument, float x-koor, float y-koor [, int Modus])

Die Funktion cpdf_rmoveto() setzt die aktuelle Position relativ zu den Koordinaten x-koor und y-koor.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_moveto().

cpdf_rotate_text

(PHP 3>= 3.0.9, PHP 4 )

cpdf_rotate_text --  Legt den Drehwinkel für Text fest

Beschreibung

void cpdf_rotate_text ( int PDF-Dokument, float Winkel)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cpdf_rotate

(PHP 3>= 3.0.8, PHP 4 )

cpdf_rotate -- Legt den Drehwinkel fest

Beschreibung

void cpdf_rotate ( int PDF-Dokument, float Winkel)

Die Funktion cpdf_rotate() setzt die Drehung in Grad auf Winkel.

cpdf_save_to_file

(PHP 3>= 3.0.8, PHP 4 )

cpdf_save_to_file -- Schreibt ein PDF-Dokument in eine Datei

Beschreibung

void cpdf_save_to_file ( int PDF-Dokument, string Dateiname)

Die Funktion cpdf_save_to_file() schreibt das PDF-Dokument in eine Datei, sofern es im Speicher erstellt wurde.

Diese Funktion wird nicht benötigt, wenn das PDF-Dokument unter Angabe eines Dateinamens als Parameter von cpdf_open() geöffnet wurde.

Siehe auch: cpdf_output_buffer() und cpdf_open().

cpdf_save

(PHP 3>= 3.0.8, PHP 4 )

cpdf_save -- Sichert die aktuelle Umgebung

Beschreibung

void cpdf_save ( int PDF-Dokument)

Die Funktion cpdf_save() sichert die aktuelle Umgebung. Sie funktioniert wie der Postscript-Befehl gsave und ist sehr nützlich, wenn Sie ein Objekt verschieben oder drehen wollen, ohne dass es sich auf andere Objekte auswirkt.

Siehe auch: cpdf_restore().

cpdf_scale

(PHP 3>= 3.0.8, PHP 4 )

cpdf_scale -- Legt die Vergrößerung fest

Beschreibung

void cpdf_scale ( int PDF-Dokument, float x-Vergrößerung, float y-Vergrößerung)

Die Funktion cpdf_scale() setzt den Vergrößerungsfaktor in beide Richtungen.

cpdf_set_action_url

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_action_url --  Setzt einen Hyperlink

Beschreibung

void cpdf_set_action_url ( int PDF-Dokument, float xll, float yll, float xur, float xur, string URL [, int Modus])

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cpdf_set_char_spacing

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_char_spacing -- Legt den Zeichenabstand fest

Beschreibung

void cpdf_set_char_spacing ( int PDF-Dokument, float Abstand)

Die Funktion cpdf_set_char_spacing() legt den Abstand zwischen den Zeichen fest.

Siehe auch: cpdf_set_word_spacing() cpdf_set_leading().

cpdf_set_creator

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_creator -- Setzt das Urheberfeld des PDF-Dokuments

Beschreibung

void cpdf_set_creator ( string Urheber)

Die Funktion cpdf_set_creator() setzt den Urheber eines PDF-Dokuments.

Siehe auch: cpdf_set_subject(), cpdf_set_title() und cpdf_set_keywords().

cpdf_set_current_page

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_current_page -- Setzt die aktuelle Seite

Beschreibung

void cpdf_set_current_page ( int PDF-Dokument, int Seitennummer)

Die Funktion cpdf_set_current_page() setzt die Seite, an der alle Aktionen durchgeführt werden. Sie können solange zwischen den Seiten wechseln, bis Sie eine Seite mit cpdf_finalize_page() abschließen.

Siehe auch: cpdf_finalize_page().

cpdf_set_font_directories

(PHP 4 >= 4.0.6)

cpdf_set_font_directories --  Legt die Verzeichnisse fest, die bei Verwendung externer Schriftarten durchsucht werden

Beschreibung

void cpdf_set_font_directories ( int PDF-Dokument, string pfmdir, string pfbdir)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cpdf_set_font_map_file

(PHP 4 >= 4.0.6)

cpdf_set_font_map_file --  Legt bei Verwendung externer Schriftarten die Datei mit den Schriftart-Dateiname-Zuordnungen fest

Beschreibung

void cpdf_set_font_map_file ( int PDF-Dokument, string Datei)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cpdf_set_font

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_font -- Wählt die aktuelle Schriftart und -größe

Beschreibung

void cpdf_set_font ( int PDF-Dokument, string Schriftart, float Größe, string Kodierung)

Die Funktion cpdf_set_font() setzt die aktuelle Schriftart, Schriftgröße und -kodierung. Gegenwärtig werden nur Standard-Postscript-Schriftarten unterstützt.

Der Parameter Kodierung kann die folgenden Werte akzeptieren: "MacRomanEncoding", "MacExpertEncoding", "WinAnsiEncoding" und "NULL". "NULL" steht für die schriftarteigene Kodierung.

Weitere Informationen, insbesondere wie asiatische Schriftarten unterstützt werden, finden Sie im ClibPDF-Handbuch.

cpdf_set_horiz_scaling

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_horiz_scaling -- Setzt die horizontale Textskalierung

Beschreibung

void cpdf_set_horiz_scaling ( int PDF-Dokument, float Maßstab)

Die Funktion cpdf_set_horiz_scaling() setzt die horizontale Skalierung auf Maßstab Prozent.

cpdf_set_keywords

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_keywords --  Setzt das Schlüsselwortfeld des PDF-Dokuments

Beschreibung

void cpdf_set_keywords ( string Schlüsselwörter)

Die Funktion cpdf_set_keywords() setzt die Schlüsselwörter eines PDF-Dokuments.

Siehe auch: cpdf_set_title(), cpdf_set_creator() und cpdf_set_subject().

cpdf_set_leading

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_leading -- Setzt den Zeilenabstand

Beschreibung

void cpdf_set_leading ( int PDF-Dokument, float Abstand)

Die Funktion cpdf_set_leading() setzt den Zeilenabstand. Dieser wird verwendet, wenn der Text durch cpdf_continue_text() ausgegeben wird.

Siehe auch: cpdf_continue_text().

cpdf_set_page_animation

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_page_animation --  Legt den Übergang zwischen den Seiten fest

Beschreibung

void cpdf_set_page_animation ( int PDF-Dokument, int Übergang, float Dauer)

Die Funktion cpdf_set_page_animation() legt den Übergang zwischen aufeinanderfolgenden Seiten fest.

Übergang kann folgende Werte haben:

0 für keinen,
1 für zwei über den Bildschirm sausende Zeilen, die die nächste Seite enthüllen,
2 für mehrere über den Bildschirm sausende Zeilen, die die nächste Seite enthüllen,
3 für eine Box, die die nächste Seite enthüllt,
4 für eine einzelne über den Bildschirm sausende Zeile, die die nächste Seite enthüllt,
5, dass dich die alte Seite auflöst und die nächste Seite enthüllt,
6, dass der Auflösungseffekt vom einen Bildschirmrand zum anderen wandert,
7, dass die alte Seite einfach durch die neue Seite ersetzt wird (Grundeinstellung)

Der Wert Dauer ist die Anzahl der Sekunden während des Seitenwechsels.

cpdf_set_subject

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_subject -- Setzt das Themenfeld des PDF-Dokuments

Beschreibung

void cpdf_set_subject ( string Thema)

Die Funktion cpdf_set_subject() setzt das Thema eines PDF-Dokuments.

Siehe auch: cpdf_set_title(), cpdf_set_creator() und cpdf_set_keywords().

cpdf_set_text_matrix

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_matrix -- Legt die Text-Matrix fest

Beschreibung

void cpdf_set_text_matrix ( int PDF-Dokument, array Matrix)

Die Funktion cpdf_set_text_matrix() legt die Matrix fest, die eine auf die aktuelle Schriftart angewandte Transformation beschreibt.

cpdf_set_text_pos

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_pos -- Legt die Textposition fest

Beschreibung

void cpdf_set_text_pos ( int PDF-Dokument, float x-koor, float y-koor [, int Modus])

Die Funktion cpdf_set_text_pos() legt die Position des Textes für den nächsten Aufruf von cpdf_show() fest.

Der optionale Parameter Modus bestimmt die Länge einer Einheit. Wenn er 0 ist oder weggelassen wurde, wird die Einheit verwendet, die für die Seite als Standard angegeben wurde. Andernfalls werden die Koordinaten unabhängig von der aktuellen Einheit in Postscript-Punkten gemessen.

Siehe auch: cpdf_show() cpdf_text().

cpdf_set_text_rendering

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_rendering -- Legt fest, wie Text wiedergegeben wird

Beschreibung

void cpdf_set_text_rendering ( int PDF-Dokument [, int Modus])

Die Funktion cpdf_set_text_rendering() legt fest, wie der Text wiedergegeben wird.

Die möglichen Werte für Modus sind 0=Text ausfüllen, 1=Text durchstreichen, 2=Text ausfüllen und durchstreichen, 3=unsichtbar, 4=Text ausfüllen und dem Begrenzungspfad hinzufügen, 5=Text durchstreichen und dem Begrenzungspfad hinzufügen, 6=Text ausfüllen und durchstreichen und dem Begrenzungspfad hinzufügen, 7=dem Begrenzungspfad hinzufügen.

cpdf_set_text_rise

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_text_rise -- Legt die vertikale Textverschiebung fest

Beschreibung

void cpdf_set_text_rise ( int PDF-Dokument, float Verschiebung)

Die Funktion cpdf_set_text_rise() legt die Verschiebung des Texts um Verschiebung Einheiten nach oben fest.

cpdf_set_title

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_title -- Setzt das Titelfeld PDF-Dokuments

Beschreibung

void cpdf_set_title ( string Titel)

Die Funktion cpdf_set_title() setzt den Titel eines PDF-Dokuments.

Siehe auch: cpdf_set_subject(), cpdf_set_creator() und cpdf_set_keywords().

cpdf_set_viewer_preferences

(PHP 3>= 3.0.9, PHP 4 )

cpdf_set_viewer_preferences --  Legt fest, wie das Dokument im Betrachter dargestellt wird

Beschreibung

void cpdf_set_viewer_preferences ( int PDF-Dokument, array Einstellungen)

Warnung

Diese Funktion ist bis jetzt nicht dokumentiert. Es steht nur die Liste der Argumente zur Verfügung.

cpdf_set_word_spacing

(PHP 3>= 3.0.8, PHP 4 )

cpdf_set_word_spacing --  Legt den Abstand zwischen den Wörtern fest

Beschreibung

void cpdf_set_word_spacing ( int PDF-Dokument, float Abstand)

Die Funktion cpdf_set_word_spacing() legt den Abstand zwischen den Wörtern fest.

Siehe auch: cpdf_set_char_spacing() cpdf_set_leading().

cpdf_setdash

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setdash -- Setzt eine gestrichelte Linie

Beschreibung

void cpdf_setdash ( int PDF-Dokument, float schwarz, float weiß)

Die Funktion cpdf_setdash() setzt das Muster einer gestrichelten Linie auf weiß weiße Einheiten und schwarz schwarze Einheiten. Wenn beide 0 sind, wird die Linie durchgezogen.

cpdf_setflat

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setflat -- Legt die Flachheit fest

Beschreibung

void cpdf_setflat ( int PDF-Dokument, float Flachheit)

Die Funktion cpdf_setflat() setzt die Flachheit auf einen Wert zwischen 0 und 100.

cpdf_setgray_fill

(PHP 3>= 3.0.8, PHP 4 )

cpdf_setgray_fill -- Setzt die Füllfarbe auf einen Grauwert

Beschreibung

void cpdf_setgray_fill ( int PDF-Dokument, float Grauwert)

Die Funktion cpdf_setgray_fill() setzt die Füllfarbe auf den angegebenen Grauwert.

Siehe auch: cpdf_setrgbcolor_fill().

cpdf_setgray_stroke