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

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

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

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 20 Math
  gp 20.1 Math_Integer
  gp 20.2 Math_TrigOp
  gp 20.3 Math_Stats
  gp 20.4 Math_Fraction
  gp 20.5 Math_BinaryUtils

20 Math

Da mathematische Aufgabenstellungen bei der Programmierung nicht unüblich sind, gibt es auch dafür einige Pakete. Insbesondere die Pakete »Math_Stats«, das statistische Kennzahlen errechnet, und »Math_Integer«, das die Verarbeitung von Integer-Zahlen vereinfacht, gefallen mir sehr gut, da sie einige Arbeit ersparen können.


Rheinwerk Computing

20.1 Math_Integer  toptop


Besprochene Version: 0.8 Lizenz: PHP-Lizenz 2.02
Klassendatei(en): Math/Integer.php, Math/IntegerOp.php

Ein Paket zur Verarbeitung von Integer-Werten mag auf den ersten Blick überflüssig erscheinen, da PHP ja selbst schon gut mit diesen ganzzahligen Werten umgehen kann. Allerdings ist die PHP-eigene Integer-Verarbeitung nur auf den ersten Blick unproblematisch, da der Wertebereich einer Integer-Zahl beschränkt ist. Weisen Sie einer Variable eine Zahl zu, die größer ist als 2.147.483.647, so verlassen Sie den Integer-Wertebereich, und die Zahl wird automatisch in eine Fließkommazahl konvertiert, woraus sich dann Folgeprobleme ergeben können. Zwar sind in PHP die BCMath- und die GMP-Funktionen definiert, mit denen Sie beliebig lange Integer-Werte korrekt verarbeiten können. Allerdings sind diese Funktionen nicht immer verfügbar, und genau da kommt Math_Integer ins Spiel. Die Klasse ist keine neue Implementierung der kompletten Integer-Verarbeitung. Sie ist lediglich eine Art Abstraktionslayer Abstraktionsschicht. Sie nutzt intern eine der beiden vorgenannten Bibliotheken oder greift, wenn keine der beiden verfügbar ist, auf die normalen PHP-Features zur Verarbeitung von Integer-Werten zurück. Sollte in diesem Fall das Ergebnis einer Operation außerhalb des Integer-Wertebereichs liegen, liefert die Methode, die die Rechenoperation ausgeführt hat, einen PEAR_Error zurück. Das passiert übrigens auch dann, wenn Sie ein Math_Integer-Objekt mit einer Zahl außerhalb des Integer-Wertebereichs initialisieren, wenn keine der vorgenannten Bibliotheken verfügbar ist.

Das Paket besteht aus zwei Dateien. Die Datei Integer.php, die im Ordner Math liegt, definiert die eigentliche Klasse, in der die Daten verwaltet werden. Die Datei IntegerOp.php, die im selben Ordner zu finden ist, definiert die eigentlichen Methoden, die zur Berechnung benötigt werden. Da Sie in den meisten Fällen sicher nicht nur eine Zahl abspeichern, sondern auch mit ihr rechnen wollen, bietet es sich an, die Datei IntegerOp.php zu inkludieren, die dann automatisch Integer.php einbindet.

Um einem Math_Integer-Objekt einen Wert zuzuweisen, können Sie diesen direkt dem Konstruktor übergeben. Um den Wert später wieder zu ändern, können Sie dann setValue() nutzen.

require_once('Math/IntegerOp.php'); 
 
// Zahl groesser als Integer, 
// daher als String uebergeben 
$int_eins=new Math_Integer('2147483650'); 
if (PEAR::isError($int_eins)) 
{ 
   die ($int_eins->getMessage()); 
}  
 
// Instanziierung ohne Wertzuweisung; 
// dabei kann kein Fehler auftauchen 
$int_zwei=new Math_Integer(); 
 
// Wert mithilfe von setValue() zuweisen 
$res=$int_zwei->setValue(12322); 
if (PEAR::isError($res)) 
{ 
   die ($res->getMessage()); 
}  
 
// Neues Math_IntegerOp-Objekt ableiten 
$int_op=new Math_IntegerOp(); 
 
$res=$int_op->add($int_eins,$int_zwei); 
if (PEAR::isError($res)) 
{ 
   die ($res->getMessage()); 
}  
echo 'Ergebnis:<br />'; 
echo $int_eins->getValue().' + '.$int_zwei->getValue(). 
     ' = '.$res->getValue();

Listing 20.1 Addition zweier Zahlen mit PEAR_Integer

Wie Sie in Listing 20.1 sehen können, sind für die Operationen eigene Methoden definiert. In diesem Beispiel wird die Methode add() genutzt, um zwei Zahlen zu addieren. Sie liefert wiederum ein Math_Integer-Objekt zurück. Um die Inhalte der Objekte auszulesen, steht die Methode getValue() zur Verfügung, die den enthaltenen Wert ausliest und ihn als String zurückgibt.

Neben add() sind natürlich auch die anderen Grundrechenarten definiert. So ist sub() zum Subtrahieren zweier Zahlen vorgesehen. Der erste übergebene Parameter ist hierbei der Minuend und der zweite der Subtrahend. Um zwei Werte miteinander zu multiplizieren, können Sie auf mul() zurückgreifen. Für die Division ist die Methode div() im Paket enthalten, die allerdings nur ganzzahlig dividiert, also keine Nachkommastellen liefert. Wenn Sie diese Methode nutzen, müssen Sie allerdings beachten, dass die Methode nicht prüft, ob der zweite Wert, sprich der Divisor, gleich 0 ist. Die enthaltenen Werte werden direkt an die darunter liegenden Funktionen weitergeleitet, was dazu führt, dass eine unschöne Fehlermeldung ausgegeben wird, wenn der Divisor 0 entspricht. Dies gilt übrigens auch für die Methode mod(), mit der Sie eine Modulo-Division (in PHP ist das der Operator %) durchführen können.

Darüber hinaus sind noch die folgenden Operationen definiert.

Um die Quadratwurzel aus einer Zahl zu ziehen, können Sie die Methode sqrt() nutzen. Sie bekommt nur eine Zahl übergeben und liefert den ganzzahligen Anteil der gesuchten Wurzel zurück. Natürlich wird auch das Potenzieren unterstützt, wozu die Methode pow() definiert ist. Dieses erfordert allerdings zwei Werte: die Basis und den Exponenten. Ein negativer Exponent ist hierbei zulässig, wobei das Ergebnis dann üblicherweise 0 ist, da auch hier nur die Vorkommastellen zurückgegeben werden.

Auch um Vorzeichen effizient behandeln zu können, sind einige Methoden vorgesehen. Mit abs() erhalten Sie eine positive Zahl, unabhängig davon, welches Vorzeichen sie vorher hatte. Um das Vorzeichen einer Zahl umzukehren, ist neg() vorgesehen. Die Methode liefert nur dann einen negativen Rückgabewert, wenn die ursprüngliche Zahl positiv war. Möchten Sie sicherstellen, dass ein Objekt einen negativen Wert hat, müssten Sie abs() und neg() kombinieren.

$int = new Math_Integer(-2); 
$op = new Math_IntegerOp(); 
$negativ = $op->neg($op->abs($int));

In einem solchen Fall können Sie allerdings auch sign() nutzen, die nur ein Math_Integer-Objekt als Parameter erwartet. Diese Methode ermittelt das Vorzeichen einer Zahl und liefert einen normalen Integer-Wert zurück. Die Zahl eins wird zurückgegeben, wenn das Math_Integer-Objekt eine positive Zahl enthält, und in dem Fall, dass der übergebene Wert negativ sein sollte, ist der Rückgabewert -1. Ist im Math_Integer-Objekt die 0 enthalten, so wird dieser Wert auch von der Methode zurückgegeben.

Zu guter Letzt ist natürlich auch noch eine Methode enthalten, die zwei Math_Integer-Objekte miteinander vergleichen kann, da die normalen PHP-Operatoren das natürlich nicht leisten können.

Die Methode compare() bekommt zwei Math_Integer-Objekte übergeben und liefert den normalen Integer-Wert 0 zurück, wenn die beiden Werte identisch sind. Ist der linke größer, wird eine 1 und sonst eine -1 zurückgegeben.

Hilfreich kann auch noch die Methode isMath() sein. Sie bekommt einen Parameter übergeben und prüft, ob dieser ein Math_Integer-Objekt ist. Ist das der Fall, bestätigt sie das mit einem true. Andernfalls liefert sie ein false zurück.

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

 Buchtipps
Zum Katalog: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Katalog: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Katalog: Responsive Webdesign






 Responsive Webdesign


Zum Katalog: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Katalog: MySQL 5.6






 MySQL 5.6


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo








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


[Rheinwerk Computing]

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