Εμπνευσμένος από το Open Source Exchange Rates και την βιβλιοθήκη money.js, δημιούργησα μία κλάση PHP που χρησιμοποιεί την υπηρεσία openexchangerates.org. Απ’ την στιγμή που έμαθα ότι η υπηρεσία αυτή “τραβάει” τις πληροφορίες της από το (ανεπίσημο) Google Calculator API, άρχισα να πειραματίζομαι και με αυτό, και βρήκα κάποιες διαφορές στις τιμές του συναλλάγματος που δίνουν οι δύο αυτές υπηρεσίες. Πιθανώς οφείλεται στο ότι το openexchangerates.org ανανεώνει τις τιμές του κάθε ώρα, αλλά όπως και να έχει, οι τιμές είναι διαφορετικές, και για κάποιες εφαρμογές ή sites η διαφορά αυτή μπορεί να είναι σημαντική.
Οπότε συγχώνευσα και τις δύο υπηρεσίες στην κλάση. Το μόνο που χρειάζεται είναι να περάσετε την σωστή παράμετρο στον constructor της κλάσης, και είστε έτοιμοι να ξεκινήσετε τις μετατροπές του συναλλάγματος.
Κατεβάστε το Open Source Exchange Rates for PHP (1902 downloads )
Εγκατάσταση
Η εγκατάσταση είναι πολύ απλή. Μόλις κατεβάσετε το αρχείο zip, αποσυμπιέστε το και μετακινήστε το αρχείο openexchangerates.php στον κατάλογο (φάκελο) που θέλετε, π.χ. στον /includes κατάλογο του script σας. Έπειτα απλά συμπεριλάβετε το με ένα include στα scripts σας. Για παράδειγμα:
require_once('../includes/openexchangerates.php');
Απλά ελέγξτε εάν ο server σας επιτρέπει εξωτερικές συνδέσεις, καθώς η function (συνάρτηση) file_get_contents() χρησιμοποιείται από την κλάση.
Περιγραφή Κλάσης
Η κλάση παρέχει τέσσερις functions/class methods που μπορείτε να χρησιμοποιήσετε. Παρακάτω είναι μία σύντομη περιγραφή της κάθε μίας.
getBase() - Επιστρέφει ένα string που εκπροσωπεί τη νομισματική μονάδα που χρησιμοποιείται ως βάση. Όλες οι νομισματικές αξίες εκφράζονται σε σχέση με την βάση. Προς το παρών, μόνο το Αμερικανικό Δολάριο (USD) υποστηρίζεται ως βάση.
getRate() - Επιστρέφει την τιμή συναλλάγματος της νομισματικής μονάδας που περνάτε ως παράμετρο, σχετική με την βάση.
getRates() - Επιστρέφει ένα associative array (συσχετισμένο πίνακα) με όλες τις νομισματικές μονάδες και τις αντίστοιχες τιμές συναλλάγματος που βρίσκονται στη μνήμη, σε σχέση με τη βάση.
change() - Περνάτε το ποσό και τα νομίσματα, και σας κάνει την μετατροπή. Τέλος.
Υπάρχουν κάποιες διαφορές που επηρεάζουν είτε τα αποτελέσματα που επιστρέφουν οι functions, είτε την απόδοση της κλάσης, ανάλογα με ποια υπηρεσία παροχής τιμών θα διαλέξετε. Συγκεκριμένα, όταν διαλέγετε το OpenExchangeRates για πάροχο, γίνεται μόνο ένα page request (αίτημα σελίδας) την ώρα που δημιουργείται το αντικείμενο και όλες οι τιμές συναλλάγματος φορτώνονται την ίδια στιγμή. Όταν επιλεγεί το GoogleRates ως πάροχος, πρέπει να γίνει ξεχωριστό page request για κάθε νόμισμα. Φυσικά αυτό είναι χρονοβόρο, οπότε δεν συμβαίνει εκτός και εάν ζητηθεί κάποια συγκεκριμένη νομισματική τιμή. Ως αποτέλεσμα, η getRates()
επιστρέφει ένα associative array με τα νομίσματα που έχουν ζητηθεί μέχρι την στιγμή της κλήσης της. Επίσης, από την στιγμή που το εξ ορισμού νόμισμα βάσης είναι το USD (και προς το παρών δεν μπορεί να αλλάξει), εάν η change()
κληθεί για δύο άλλα νομίσματα που χρησιμοποιούνται για πρώτη φορά. θα συμβούν δύο page requests.
Πάντως, από την στιγμή που η κλάση δεν κάνει κάποιο είδος τοπικού file caching, για κάθε αντικείμενο που δημιουργείται από την κλάση, θα γίνεται τουλάχιστον ένα page request. Με λίγα λόγια, το OpenExchangeRates είναι πιο γρήγορο, αλλά μπορεί να μην είναι τόσο ενημερωμένο όσο το GoogleRates. Διαλέξτε ανάλογα με τις ανάγκες σας.
Χρήση
Πρώτα απ’ όλα, πρέπει να επιλέξετε (και να καταλάβετε τις διαφορές) εάν θέλετε να χρησιμοποιήσετε τις πληροφορίες από το openexchangerates.org ή από την Google (διαβάστε της Περιγραφή Κλάσης επάνω).
Δημιουργώντας το αντικείμενο
Για να δημιουργήσετε το αντικείμενο χρησιμοποιώντας τον εξ ορισμού πάροχο OpenExchangeRates:
$er = new ExRates();
ή περιγραφικά
$er = new ExRates('OpenExchangeRates');
και για να το δημιουργήσετε με το GoogleRates
$er = new ExRates('GoogleRates');
getBase()
Αυτή η function δεν δέχεται παραμέτρους, και επιστρέφει ένα string με τον κωδικό της νομισματικής μονάδας που χρησιμοποιείται ως βάση για τις υπόλοιπες τιμές συναλλάγματος.
Όταν ο χρησιμοποιείται ο πάροχος OpenExchangeRates, η βάση είναι το USD μιάς και αυτήν την βάση χρησιμοποιεί και η υπηρεσία, αλλά μπορεί να αλλάξει στο μέλλον. Η κλάση είναι αρκετά έξυπνη στο να υπολογίζει σε περίπτωση που αλλάξει η βάση, και κάνει ότι τυχών μετατροπές χρειάζονται αυτόματα.
Στην περίπτωση του παρόχου GoogleRates, η βάση είναι το USD και προς το παρών δεν μπορεί να αλλαχθεί.
Παράδειγμα χρήσης:
echo $er->getBase();
θα τυπώσει:
USD
getRate($currency)
Αυτή η function δέχεται για παράμετρο ένα string με τον κωδικό του νομίσματος, και επιστρέφει σε έναν αριθμό float την τιμή του συναλλάγματος σε σχέση με την βάση. Επίσης επιστρέφει Boolean (λογικό) FALSE εάν το νόμισμα ή η τιμή δεν βρεθεί.
echo $er->getRate('EUR');
θα τυπώσει κάτι σαν:
0.71312312
Προσέξτε ότι εάν προσπαθήσετε να πάρετε την τιμή του νομίσματος βάσης, θα πρέπει να παίρνετε πάντα 1. Οπότε αφού το USD είναι η βάση,
echo $er->getRate('USD');
θα πρέπει να τυπώσει
1
και ασχέτως με το ποια είναι η βάση,
echo $er->getRate( $er->getBase() );
θα πρέπει πάντα να τυπώνει
1
getRates()
Αυτή η function δεν παίρνει παραμέτρους, και επιστρέφει ένα associative array με όσες τιμές συναλλάγματος υπάρχουν στην μνήμη του αντικειμένου.
print_r( $er->getRates() );
θα τυπώσει κάτι σαν
Array ( [USD] => 1 [AED] => 3.67300014 [ANG] => 1.74999869 ... [UYU] => 19.7499654 [YER] => 217.864924 [ZAR] => 7.98830512 )
Στην περίπτωση του GoogleRates
$er = new ExRates('GoogleRates'); print_r( $er->getRates() );
θα τυπώσει
Array ( [USD] => 1 )
και το
$er = new ExRates('GoogleRates'); $er->getRate('EUR'); print_r( $er->getRates() );
θα τυπώσει κάτι σαν
Array ( [USD] => 1 [EUR] => 0.72300014 )
change($amount, $currency_from, $currency_to)
Αυτή η function είναι η ψυχή της κλάσης και ο λόγος ύπαρξης της. Παίρνει τρεις παραμέτρους. Η πρώτη παράμετρος είναι αριθμός, το χρηματικό ποσό που θέλετε να μετατρέψετε. Η δεύτερη παράμετρος είναι ένα string, ο κωδικός του νομίσματος που εκφράζετε το χρηματικό ποσό. Και η τρίτη παράμετρος, επίσης string, είναι ο κωδικός του νομίσματος που θέλετε να μετατρέψετε το ποσό σας. Εάν η μετατροπή είναι επιτυχημένη, η function επιστρέφει έναν float με το αλλαγμένο ποσό, ή boolean FALSE σε περίπτωση αποτυχίας.
echo $er->change(5, 'EUR', 'GBP');
θα τυπώσει κάτι σάν
4.3105633
Μελλοντικά
Υπάρχει αρκετή δουλειά που μπορεί να γίνει για να γίνει η κλάση πιο γρήγορη, σε σχέση με τα page requests, ή χρήση τοπικού file caching κλπ, αλλά από την στιγμή που καλύπτει τις ανάγκες μου προς το παρών, την αφήνω όπως είναι. Φυσικά, εάν χρειαστώ κάτι άλλο, ή κάποιος από εσάς μου ζητήσει update/feature/bug-fix θα προσπαθήσω να βρω χρόνο και να το δουλέψω.
Σας αρέσει; Καλύπτει τις ανάγκες σας; Έχετε προτάσεις ή/και σχόλια; Πείτε τα μου, κάτω στην περιοχή με τα σχόλια.