Pergunta

Estou aprendendo PHP5 (a última vez que verifiquei o PHP foi na época do PHP4) e estou feliz em ver que o PHP5 OO é mais parecido com Java do que o PHP4, mas ainda há um problema que me faz sentir bastante desconfortável por causa do meu Java fundo :MATRIZ.

Estou lendo "Proffesional PHP6" (Wrox) e mostra sua própria implementação de coleção.Eu encontrei outras classes como a que está em http://aheimlich.dreamhosters.com/generic-collections/Collection.phps baseado em SPL.Também descobri que existe algum tipo de coleção no SPL (ArrayObject)

Porém, estou surpreso porque realmente não vejo pessoas usando Collections em PHP, elas parecem preferir arrays.

Então, não é uma boa ideia usar Collections em PHP assim como as pessoas usam ArrayList em vez de arrays básicos em Java?Afinal, os arrays php não são como os arrays java.

Foi útil?

Solução

As coleções em Java fazem muito sentido, pois é uma linguagem fortemente digitada. Faz sentido ter uma coleção de "carros" e outra de "motos".

No entanto, no PHP, devido à natureza tipulada dinamicamente, é bastante comum sacrificar a formalidade das coleções. As matrizes são suficientes para serem usadas como recipientes genéricos de vários tipos de objetos (carros, motos, etc.). Além disso, o benefício adicional vem do fato de que as matrizes podem ser mutadas com muita facilidade (o que às vezes pode ser uma grande desvantagem quando a verificação adequada de erros está ausente).

Eu venho de um plano de fundo Java e descobri que o uso de um padrão de design de coleções no PHP não compra muito em termos de vantagens (sem threading, sem otimização da alocação de memória, sem iteradores etc.).

Se você está procurando alguma dessas vantagens, provavelmente é melhor construir uma classe de wrapper em torno da matriz, implementando cada recurso (iteradores etc.) à la carte.

Outras dicas

Eu sou muito profissional em objetos de coleção em PHP, eles podem ser usados ​​para adicionar segurança de tipo, implementar funcionalidades de pesquisa, classificação e manipulação fáceis de usar e representar a abordagem OO correta em vez de usar arrays e a infinidade de funções úteis, mas procedimentais, que operam em eles em padrões diferentes em toda a fonte.

Temos várias coleções que usamos para diversos fins, todas herdadas de maneira organizada, promovendo segurança de tipo, padrões de codificação consistentes e um alto nível de reutilização de código.

Mas, em última análise, eles são todos arrays internamente!

Suponho que realmente se trata de escolha, mas em meu mundo orientado a objetos gosto de manter segmentos de código facilmente repetíveis, como algoritmos de classificação e pesquisa em classes base, e acho a notação de objeto mais autodocumentada.

As matrizes PHP são associativas ... são muito mais poderosas que as matrizes de Java e incluem grande parte da funcionalidade da lista <> e mapa <>.

O que você quer dizer com "boa ideia"? São ferramentas diferentes, usando um idioma da maneira como você usou, outro geralmente resulta em frustração.

Também fiquei um pouco consternado ao encontrar aulas do tipo coleta no PHP. Matrizes têm algumas desvantagens reais em minha experiência.

Primeiro, o número de funções disponíveis para manipulá -las é um pouco limitado. Por exemplo, preciso ser capaz de inserir e remover arbitrariamente os itens de/para uma coleção em uma determinada posição de índice. Fazer isso com as funções de idioma interno para matrizes no PHP é doloroso, na melhor das hipóteses.

Segundo, como uma espécie de ramificação do primeiro ponto, escrever um código limpo e legível que manipula as matrizes em qualquer nível de complexidade além do simples push/pop e as coisas do iterador são difíceis, na melhor das hipóteses. Costumo achar que tenho que usar uma matriz para indexar e acompanhar outra matriz em aplicativos com uso intensivo de dados que eu crio.

Eu prefiro trabalhar em uma estrutura (minha escolha pessoal é Noloh). Lá, eu tenho uma classe de coleção real chamada ArrayList que possui funções como Add, Insert, Removeat, Removerman e Alterne. Eu imagino que outras estruturas PHP também abordem esse problema.

Uma boa implementação da coleção no PHP é fornecida pela Varien Lib, esta biblioteca faz parte do Código Magento com a Licença OSL. (Mais informações sobre a Licença Magento e a reutilização do Código aqui.

Não é possível encontrar nenhum código -fonte para a biblioteca, então a melhor maneira é baixar o magento e depois procurar/lib/varien/

YII tem implementação de Java completo, como coleções, pilha

http://www.yiiframework.com/doc/api/1.1/clist

Às vezes, uso essa implementação realmente simples para me dar uma coleção aproximada e pronta.

Normalmente, o principal requisito de uma coleção é aplicar um grupo de um tipo de objeto, basta configurar uma classe básica com um construtor para implementá -lo.

class SomeObjectCollection {

   /**
    * @var SomeObject[]
    */
   private $collection = array();

   /** 
    * @param SomeObject $object1
    * @param SomeObject $_ [optional]
    */
   function __construct(SomeObject $object1 = null, SomeObject $_ = null) 
   {
       foreach (func_get_args() as $index => $arg) {
           if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject');
           $this->collection[] = $arg;
       }
   }

   /**
    * @return SomeObject[]
    */
   public function getAll()
   {
       return $this->collection;
   }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top