Recuperando propriedades com namespace em PHP
Quando você escreve código suficiente que se comunica com APIs de terceiros, é mais do que provável que você se encontre se comunicando com uma API baseada em XML.
E diga o que quiser sobre isso: alguns gostam, outros não. Mas eles existem e, portanto, serão uma parte necessária do seu desenvolvimento em algum momento.
Se a API for bem projetada, provavelmente usará namespaces para diferentes tipos de solicitações e respostas. E quando você estiver escrevendo o cliente para a referida API, provavelmente precisará recuperar propriedades com namespace.
É fácil fazê-lo, mas não é imediatamente óbvio. Então, neste post, vou dar um exemplo de como fazer exatamente isso.
Para este exemplo, suponha que estou fazendo uma chamada para uma API baseada em XML. Para fazer isso, estou usando a biblioteca Array-To-XML da Spatie (que é extremamente conveniente).
Para configurar a solicitação, eu a crio usando um array como este:
<?php
// Setup the XML to connect to the API endpoint.
$namespaceExampleGetIDs = [
'Version' => $this->version,
'ApiKey' => $this->getPrivateKey(),
'acmePasscode' => $this->getPasscode(),
'Call' => [
'_attributes' => ['Method' => 'Namesepace.Example.GetIDs'],
'Date' => $this->getTimestamp(),
],
];
$xml = ArrayToXml::convert($namespaceExampleGetIDs, 'Acme', false);
Em seguida, usarei o cliente da API (que foi abstraído para manter este post o mais sucinto possível) para fazer a solicitação da API. A partir daí, podemos pegar o conteúdo da resposta e fazer o trabalho necessário (neste caso, será iterando pelas propriedades da resposta).
E é aqui que a recuperação de propriedades de namespaces entra em ação. Supondo que precisamos acessar uma única propriedade, ou uma propriedade de uma propriedade, veja como fazê-lo sempre que tiver namespace:
<?php
// Now make a request to the server.
$response = $this->makePostRequest($xml);
$xmlResponse = new SimpleXMLElement($response->getBody()->getContents());
// Iterate through all of the event IDs to get the information about them.
$events = [];
foreach ($xmlResponse->{'Namesepace.Example.GetIDs'}->EventID as $eventId) {
// Work with the $eventId however necessary...
}
Em suma, as chaves servem como ” variáveis variáveis " e nos dão acesso à natureza dinâmica de um objeto.
Do manual:
Às vezes é conveniente poder ter nomes de variáveis variáveis. Ou seja, um nome de variável que pode ser definido e usado dinamicamente.
E como é útil configurá-los dinamicamente, é naturalmente útil recuperá-los dinamicamente.
Portanto, da próxima vez que você estiver trabalhando com uma API baseada em XML (ou talvez qualquer API), observe que você pode definir a recuperação de propriedades de namespace do objeto por meio de variáveis variáveis.
Isso faz sentido, certo?

