W poprzednich postach sporo pisałem o pracy z Google Maps API. Prawdę mówiąc, nie pracowałem z tym od tamtego postu.
Jednak musiałem pracować z szerokością i długością geograficzną w PHP i zacząłem stosować pewne praktyki, które moim zdaniem mogą nam dobrze służyć podczas pracy ze współrzędnymi lub ogólnie wartościami zmiennoprzecinkowymi.
W następnym fragmencie kodu opiszę podejście, którego użyłem i dlaczego to zrobiłem. Ale chcę wyjaśnić, że jeśli czytasz to w związku z interfejsem API Map Google, niewiele mogę zaoferować w zakresie sposobu działania i bieżącej wersji ich interfejsu API.
Szerokość i długość geograficzna w PHP
Kiedykolwiek pracujesz z szerokością i długością geograficzną w PHP, pracujesz z wartościami zmiennoprzecinkowymi, prawda? Więc nigdy nie chcesz ich analizować na coś mniejszego niż to; w przeciwnym razie tracisz dane i nie będziesz w stanie zlokalizować tego, co próbujesz zlokalizować.
Tak więc dla wszystkich zamierzeń i celów załóżmy, że masz informacje przychodzące do serwera i musisz z nimi pracować za pomocą PHP.
Dwie rzeczy, o których chcesz pamiętać, to:
- zdezynfekuj przychodzące dane,
- upewnij się, że jest przekonwertowany na wartość zmiennoprzecinkową.
Można to zrobić za pomocą funkcji filter_var i floatval PHP, o których powiem za chwilę. Zauważ jednak, że jeśli wynik floatval nie zwraca liczby zmiennoprzecinkowej, musisz mieć wdzięczny sposób na radzenie sobie z tym.
Zgodnie z instrukcją, floatval może zwrócić następujące elementy:
Wartość zmiennoprzecinkowa danej zmiennej. Puste tablice zwracają 0, niepuste tablice zwracają 1. Ciągi najprawdopodobniej zwrócą 0, chociaż zależy to od skrajnych lewej znaków ciągu. Obowiązują wspólne zasady rzucania na spławik.
W dalszej części postu przyjrzymy się, jak radzić sobie z tym z wdziękiem.
Analiza przychodzącej szerokości i długości geograficznej
Załóżmy, że przychodzące wartości znajdują się w kolekcji PHP $_REQUEST (która odnosi się do żądań HTTP przychodzących do serwera) z kluczami acme-demo-latitude i acme-demo-longitude.
Możemy je pobrać w ten sposób :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Ale to nie wystarczy. Najpierw musimy użyć filter_var, aby upewnić się, że dane są oczyszczone i zgodne ze schematem zmiennoprzecinkowym :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
Następnie uważam, że pomocne jest użycie floatval do przeanalizowania wyniku jako wartości zmiennoprzecinkowej. Pozostawia to następujący blok kodu wyglądający tak :
<?php
$latitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
$longitude = floatval(
filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT) );
Po czym możesz z niego korzystać. Pamiętaj jednak, że nadal musimy upewnić się, że zwracane wartości są wartościami zmiennoprzecinkowymi.
Walidacja danych
Teraz, gdy mamy informacje, musimy upewnić się, że wygląda dobrze. A jeśli nie, musimy odpowiednio się tym zająć. Jeśli tak nie jest, możemy po prostu:
- zwraca false z funkcji, z której jest zawarty,
- wyrzuć wyjątek i pozwól wywołującemu obsłużyć go tak, jak uzna za stosowne.
Każdy z tych przykładów może wyglądać tak :
<?php
// Return false...
if (! (is_float( $latitude) && is_float( $longitude) )) {
return false;
}
// Or throw an exception...
if (! (is_float( $latitude) && is_float( $longitude) )) {
throw new Exception('Latitude and longitude are not valid floating point values.');
}
Ostatecznie jednak decyzja, jak obsłużyć wartości, gdy nie są one w odpowiednim formacie po ich przeanalizowaniu, należy do Ciebie.
Czy to są najlepsze praktyki?
Szczerze mówiąc, wątpię w to. Wiem, że są to rzeczy, których używam i które okazały się przydatne. Zapewnia również defensywny, odporny sposób na upewnienie się, że twoje wartości są prawidłowe.
Ale jeśli istnieją lepsze sposoby na zrobienie tego, to jestem otwarty na ich wysłuchanie w komentarzach.