Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Paulo Nasc.

[Resolvido] Namespace

Recommended Posts

Eai galera, tudo certinho?

 

Estou particularmente "começando" no mundo OO. Já adquiri algum conhecimento na área e por isso vou ser mais ativo por aqui no forum :b

 

Eu sei que pra definir um namespace no PHP é basicamente isso:

 

namespace Projeto;
class MinhaClasse {
   // conteúdo;
}

 

 

Mas minha dúvida é a seguinte: Quero definir um namespace pra varias classes ao mesmo tempo, sendo que todas elas estariam dentro ou incluídas(include/require) em um único arquivo, pra não precisar fazer isso ai de cima pra cada nova classe ou função. Já pesquisei sobre o assunto e não obtive sucesso, talvez por não saber me referir corretamente.

 

Já vi em algum lugar a seguinte sintaxe:

 

namespace Projeto {
   class MinhaClasse {
       // conteúdo;
   }
}

 

E eu quero algo assim:

 

namespace Projeto {
   class MinhaClasse {
       // conteúdo;
   }

   class MinhaSegundaClasse {
       // conteúdo;
   }
}

 

 

Não sei se eu estou viajando e é tudo da minha cabeça, pois o PHP não está reconhecendo a classe com o namespace definido dessa forma. Eu estou usando o PHP 5.3.8.

 

Me ajudem por favor,

Vlw ai galera :b

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu também não tenho experiência com namespaces, pois comecei a estudar este recurso faz pouco tempo para trabalhar com a versão 2.0 do Zend Framework que vem por aí. Mas pelo o que eu já andei estudando no manual do PHP, esta sua sintaxe está errada, pois eu pelo menos não encontrei nada parecido na documentação.

 

Acredito que o correto seria assim:

 

namespace Projeto1;

class MinhaClasse1 {

}

class MinhaClasse2 {

}

namespace Projeto2;

class MinhaClasse1 {

}

class MinhaClasse2 {

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não coloque 2 classes por aquivo.

No arquivo Class1.php faça:

namespace myNamespace;
class Class1 {
}

No arquivo Class2.php faça:

namespace myNamespace;
class Class2 {
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara,

Assim funciona :clap: .

Estava tentando assim só que ao invés das classes estarem em um mesmo arquivo eu incluo elas de arquivos separados, assim:

 

namespace Projeto:

require 'projeto/minha.class.php';
require 'projeto/minhaSegunda.class.php';

 

Só que dessa forma as classes não são encontradas :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não coloque 2 classes por aquivo.

No arquivo Class1.php faça:

namespace myNamespace;
class Class1 {
}

No arquivo Class2.php faça:

namespace myNamespace;
class Class2 {
}

 

Henrique,

 

É exatamente isso que eu não quero fazer: Definir um namespace antes de toda classe, entendeu?

Já tentei definir uma variável no lugar do namespace e no arquivo de inclusão dar um valor a ela, mas o php não aceita.

 

Arquivo: minha.class.php;

namespace $ns;
class MinhaClass {
   // Conteúdo;
}

 

Arquivo que junta as classes;

$ns = 'Projeto';

require "projeto/minha.class.php";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique, ele quer definir UM namespace para várias classes ..

Não tem problema nenhum ter duas classes no mesmo namespace .. arquivo Namespace.php

<?php

         namespace Nspace ; 

         class X { } 
         class Y { } 
         class Z { } 

 

Arquivo índice

<?php          
         use Nspace as Ns ;
         var_dump ( new Ns\X , new Ns\Y , new Ns\Z ) ;

 

Saída


object(Nspace\X)#1 (0) {
}
object(Nspace\Y)#2 (0) {
}
object(Nspace\Z)#3 (0) {
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Henrique,

 

É exatamente isso que eu não quero fazer: Definir um namespace antes de toda classe, entendeu?

Já tentei definir uma variável no lugar do namespace e no arquivo de inclusão dar um valor a ela, mas o php não aceita.

 

Arquivo: minha.class.php;

namespace $ns;
class MinhaClass {
   // Conteúdo;
}

 

Arquivo que junta as classes;

$ns = 'Projeto';

require "projeto/minha.class.php";

 

Você disse que não quer ficar definindo o namespace dentro de cada classe, mas mesmo assim fica digitando require para pegar essa classe... Ao meu vê, é o mesmo trabalho.

Se você quiser tirar o máximo proveito do autoloader, você deve seguir as boas práticas, e as boas práticas dizem que você deve definir apenas um namespace por classe/arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Henrique, ele quer definir UM namespace para várias classes ..

Não tem problema nenhum ter duas classes no mesmo namespace .. arquivo Namespace.php

Tá e o recurso de autoloading fica onde?

O padrão é 1 classe por aquivo.

Em Java temos que declarar o pacote ao qual a classe pertence em TODOS os arquivos, dar import das bibliotecas necessárias em TODOS os arquivos. Não existe mágica...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece, Henrique, que utilizando-se dessa técnica você consegue abolir o autoload tornando o sistema, seja ele qual for, três vezes mais rápido.

 

Pena é que existe um bug, que eu mesmo reportei, que impede a técnica de ser plenamente funcional sob todos os aspectos da Orientação a Objetos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acontece, Henrique, que utilizando-se dessa técnica você consegue abolir o autoload tornando o sistema, seja ele qual for, três vezes mais rápido.

 

Aí também depende do tamanho da aplicação, se você tiver uma aplicação muito grande, vamos supor com centenas de classes, e colocar todas essas classes dentro de um único arquivo, você estará desperdiçando o uso da memória do servidor, pois você terá que incluir toda vez um arquivo gigante com centenas de classes onde a maioria não será usada no mesmo momento.

 

Também concordo que, por questões de organização, cada classe deva estar em um arquivo distinto. Mas como cada caso é um caso, aí fica por conta do autor do tópico ver qual é a melhor solução pro caso dele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, sim. Mas se você tiver, por exemplo, todas as classes de um mesmo módulo num mesmo namespace, você invoca um único use e garante acesso à todas as classes do pacote.

 

Ainda haverá algum tipo de desperdício que será compensado na performance geral.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia do Bruno é até interessante, mas não para o desenvolvimento. Ao meu ver, deveria se desenvolver com cada classe em um arquivo separado. Ao final do desenvolvimento, seria feita uma "compilação", de preferência de forma automática, deixando cada namespace dentro de um só arquivo, com todas as classes, sem quebras de linhas. Nunca testei, mas sempre achei que isto melhoraria o desempenho. Só que isto gerará um problema, que o Bruno citou acima e que foi identificado por ele em outro tópico que falamos sobre isto, sobre um erro com as interfaces.

 

Alguém já tentou fazer desta forma e fez algum tipo de teste? Seria legal para vermos se existe ganho de desempenho ou se não faz diferença.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já que você quer evitar o autoload por considerar que ele faz a aplicação perder performance, eu acho melhor você deixar as classes em cada arquivo separado e abusar do uso dos requires.

 

As classes essenciais para o funcionamento da aplicação, como por exemplo conexão com banco de dados, manipulação de sessões, registry, etc, você pode incluir no próprio bootstrap da aplicação. Já as outras classes mais específicas você vai incluindo na medida que for necessário usá-las.

 

Essa é só a minha opinião, pois acho essa de incluir mais de uma classe no mesmo arquivo muito desorganizado e foge um pouco dos padrões da orientação a objetos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A ideia do Bruno é até interessante, mas não para o desenvolvimento.

Com toda certeza. Faltou mencionar isso ^_^

 

Prestar manutenção, quando em desenvolvimento, num arquivo de 10 mil linhas (ou mais) é froids...

 

Ao final do desenvolvimento, seria feita uma "compilação", de preferência de forma automática, deixando cada namespace dentro de um só arquivo, com todas as classes, sem quebras de linhas.

Eu quase consegui, mas esbarrei naquele problema.

 

Alguém já tentou fazer desta forma e fez algum tipo de teste? Seria legal para vermos se existe ganho de desempenho ou se não faz diferença.

Eu testei. Quando meu AB rodava direitinho no Windows Seven, fiz um teste "folgado", algo em torno de 100 requisições com 50 de concorrência e foi três vezes mais rápido. Isso nas configurações bem abaixo do normal do notebook que eu uso. :cry:

 

Daí eu andei lendo a respeito e parece que isso acontece não por causa do PHP em si, que tem de incluir diversos arquivos, mas sim com o Servidor que quando "recebe" uma instrução com relação ao Sistema de Arquivos executa algum comando antes de, de fato, incluir.

 

Não lembro direito, acho que seria algo similar ao lstat() do PHP...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Captei a idéia de vocês, seria reunir automaticamente todas as classes em um único arquivo somente para ambiente de produção. ^_^

 

Realmente interessante isso, mas somente se não forem muitas classes, se não como eu disse vai ter um desperdiço muito grande de memória aí.

 

EDIT:

 

Só espero que o mestre dos padrões (João Batista Neto) não arrance os seus cabelos ao ler este tópico. haha

Compartilhar este post


Link para o post
Compartilhar em outros sites
Acontece, Henrique, que utilizando-se dessa técnica você consegue abolir o autoload tornando o sistema, seja ele qual for, três vezes mais rápido.

Três vezes mais rápido por quê?

Se você usar um autoload 'burro' que fica escaneando diretórios toda vez para procurar classes, perde performance mesmo.

 

Eu crio um 'cache' em um registro de todas as classes e caminhos para elas na minha aplicação logo no início da execução. Toda a classe que for carregada apenas vai nesse registro e inclui o arquivo correto. Esse registro nada mais é que uma tabela hash, logo, o tempo de acesso é constante.

Na verdade, já até pensei em colocar isso numa sessão para executar uma vez só, o problema seria a segurança, já que a sessão é armazenada no cliente.

 

Em termos de manutenibilidade, se perde muito ao termos várias classes em um arquivo só.

 

Ele não perguntou sobre autoload, e sim como colocar várias classes em um único namespace, essa pergunta foi respondida e ponto.

Então agora é assim? Vê alguém fazendo uma cagada, você não fala nada? Ou pior, incentiva?

Desculpa, mas tem certas coisas com as quais eu não consigo concordar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.