Nos posts anteriores, escrevi um pouco sobre como trabalhar com a API do Google Maps. Sinceramente, eu não trabalhei com isso desde aquele post.
No entanto, tive que trabalhar com latitude e longitude em PHP, e existem algumas práticas que comecei a usar que acho que podem nos servir bem ao trabalhar com coordenadas ou valores de ponto flutuante, em geral.
No trecho de código a seguir, detalharei a abordagem que usei e por que fiz isso. Mas quero deixar claro que, se você estiver lendo isso em relação à API do Google Maps, não há muito que eu possa oferecer sobre como isso funciona e a versão atual de sua API.
Latitude e Longitude em PHP
Sempre que você está trabalhando com latitude e longitude em PHP, você está trabalhando com valores de ponto flutuante, certo? Então você nunca quer analisá-los em nada menos do que isso; caso contrário, você estará perdendo dados e não conseguirá localizar o que quer que esteja tentando localizar.
Portanto, para todos os efeitos, vamos supor que você tenha informações chegando ao servidor e precise trabalhar com elas usando PHP.
As duas coisas que você quer lembrar são:
- higienizar os dados recebidos,
- certifique-se de que seja convertido em um valor de ponto flutuante.
Isso pode ser feito através do uso das funções filter_var e floatval do PHP, sobre as quais falarei brevemente. Observe, no entanto, que se o resultado de floatval não retornar um ponto flutuante, você precisa ter uma maneira elegante de lidar com isso.
De acordo com o manual, floatval pode retornar o seguinte:
O valor float da variável fornecida. Arrays vazios retornam 0, arrays não vazios retornam 1. Strings provavelmente retornarão 0, embora isso dependa dos caracteres mais à esquerda da string. As regras comuns de fundição de flutuação se aplicam.
Veremos como lidar com isso mais graciosamente mais adiante no post.
Analisando Latitude e Longitude de Entrada
Vamos supor que os valores recebidos estejam na coleção $_REQUEST do PHP (que se refere às solicitações HTTP que chegam ao servidor) codificados como acme-demo-latitude e acme-demo-longitude.
Podemos recuperá-los assim :
<?php
$latitude = $_REQUEST['acme-demo-latitude'];
$longitude = $_REQUEST['acme-demo-longitude'];
Mas isso não é suficiente. Primeiro, precisamos usar filter_var para garantir que os dados sejam higienizados e sigam o esquema de ponto flutuante :
<?php
$latitude = filter_var(
$_REQUEST['acme-demo-latitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
$longitude = filter_var(
$_REQUEST['acme-demo-longitude'],
FILTER_SANITIZE_NUMBER_FLOAT
);
Em seguida, acho útil usar floatval para analisar o resultado como um valor de ponto flutuante. Isso deixa o seguinte bloco de código assim :
<?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) );
Depois disso, você está livre para usá-lo. Mas lembre-se, ainda precisamos ter certeza de que os valores retornados são valores de ponto flutuante.
Validando os dados
Agora que temos as informações, precisamos ter certeza de que parece bom. E se isso não acontecer, precisamos lidar com isso adequadamente. Se não for, então podemos simplesmente:
- retorne false da função da qual está contido,
- lançar uma exceção e permitir que o chamador a trate da maneira que achar melhor.
Cada um desses exemplos pode ter esta aparência :
<?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.');
}
Em última análise, porém, a decisão é sua sobre como lidar com os valores quando eles não estão no formato adequado depois de analisá-los.
Essas são as melhores práticas?
Para ser sincero, duvido. Eu sei que estas são as coisas que eu tenho usado e que achei úteis. Ele também fornece uma maneira defensiva e resiliente de garantir que seus valores estejam corretos.
Mas se houver maneiras melhores de fazer isso, estou aberto a ouvi-las nos comentários.