Fundição de objetos SplFile * como strings

Há um tl; dr na parte inferior se você não se dá ao trabalho de ler

As implementações de SplFile * fornecem uma API orientada a objetos para trabalhar com o sistema de arquivos em PHP. Às vezes, essas construções podem ser muito úteis para trabalhar e manipular arquivos facilmente.

No entanto, o comportamento ao converter esses objetos em uma string só pode ser descrito como “indefinido”. Primeiro, vamos dar uma olhada nos documentos PHP para SplFileInfo :: __ toString & SplFileObject :: __ toString . Portanto, SplFileInfo deve retornar o caminho do arquivo, um comportamento completamente razoável e um caso de uso bastante impressionante. SplFileObject, por outro lado, tem o alias de … current ()? Caso você não esteja familiarizado com iteradores, este é um método chamado para recuperar o elemento atual para o qual o iterador está apontando. No caso de um SplFileObject, esta é a linha atual do arquivo que está sendo apontado.

Portanto, vamos dar uma olhada em primeiro converter esses dois tipos de objetos em strings sem nos preocupar com a iteração. Queremos dar uma olhada em várias versões de idiomas e o melhor lugar para fazer isso é 3v4l.org . Aqui está o link para o exemplo de fundição de string simples: http://3v4l.org/rGkpb

Como podemos ver no exemplo, SplFileInfo faz exatamente o que deveria fazer em todas as versões, imprimir o caminho para o arquivo, uma vez que foi introduzido no 5.1.0. No entanto, dê uma olhada na saída de SplFileObject. Para aqueles de vocês que não clicaram no link, aqui está o resultado do elenco:

Para as versões 5.1.2 – 5.3.21, 5.4.0 – 5.4.6:

SplFileObject: /in/rGkpb
SplFileInfo: /in/rGkpb

Para as versões 5.3.22 – 5.3.24, 5.4.7 – 5.5.0beta2:

SplFileObject: <?php

SplFileInfo: /in/rGkpb

Neste exemplo, as versões 5.3.22-5.3.24 e 5.4.7-5.5.0beta2 são as únicas versões para implementar o objeto de acordo com os documentos. As outras versões estão gerando a implementação de SplFileInfo. Estranho para dizer o mínimo.

No entanto, como estamos lidando com o método current () como resultado da conversão de SplFileObject em uma string, também devemos entender como esse comportamento funciona com a iteração. Então, vamos dar uma olhada nesse script: http://3v4l.org/a7YkN

Não colarei nenhuma saída aqui, pois é um pouco mais longa, mas esse é um comportamento ainda mais estranho. Existem quatro tipos diferentes de saída, dependendo das versões.

  • 5.1.0 = jargão que muda toda vez
  • 5.1.1 = também gibberish que muda toda vez, mas gibberish diferente de 5.1.0
  • 5.1.2 – 5.3.21, 5.4.0 – 5.4.6 = o caminho do arquivo atual
  • 5.3.22 – 5.3.24, 5.4.7 – 5.5.0beta2 = saída esperada, linha atual do arquivo

Podemos dizer que todas as implementações listadas, exceto o último conjunto, não implementam corretamente o método __toString de acordo com os documentos deste exemplo: http://3v4l.org/pmTmR

A conversão de SplFileObject em uma string deve ser altamente desencorajada. O comportamento é simplesmente muito variado, mesmo nas mesmas versões em línguas menores. Resumindo, não converta o SplFileObject em uma string !

E quanto ao objeto SplFileInfo? Seu comportamento é bem definido e poderia ser usado certo? Bem não. Você vê que o SplFileObject, e toda a sua maluquice, pode ser passado como se fosse um objeto SplFileInfo; porque é um objeto SpleFileInfo. Portanto, para usar o método SplFileInfo :: __ toString corretamente, você precisa adicionar um monte de clichês para verificar se está realmente usando SplFileInfo e não SplFileObject. Não vale a pena. Use o SplFileInfo :: getPathname método em vez.

tl; dr

Você não lançar os SplFile * objetos a uma corda. O comportamento é indefinido na melhor das hipóteses e você será mordido.