Instânciar uma classe dentro dela mesma.

110 views
Skip to first unread message

Ruan Carlos

unread,
Jan 23, 2009, 12:47:18 PM1/23/09
to LISTA PHP
Opa galera, alguém sabe como instanciar uma classe dentro dela mesma?

EX:

public static function login($login,$senha) {
$rs = Banco::query("select gr_matricula from tblusuario where
\"login\" = '".Util::antiInjection($login)."' and senha =
'".Util::encriptMd5($senha)."'");
$qtde = Banco::numRows($rs);

if($qtde == 1) {
$row = Banco::fetchArray($rs);
$gr_matricula = $row["gr_matricula"];

$a = new Usuario();
//$user = Usuario__construct($gr_matricula);

return $user;
} else {
$mensagem = new Mensagem();
$mensagem->setIdMensagem("001");
$mensagem->setTipo("erro");
$mensagem->setMensagem(utf8_encode("Usuário portador do login
<strong> $login </strong> não cadastrado no sistema. Entre em contato
com o administrador"));
return $mensagem;
}
}



---
$a = new Usuario();
//$user = Usuario__construct($gr_matricula);

return $user;
Esta parte não funciona, dizendo que o método Usuario não funciona.

Obrigado

Alexandre Gaigalas

unread,
Jan 23, 2009, 12:54:22 PM1/23/09
to list...@googlegroups.com
class Teste
{
    public function __construct() {
        $nova_instancia = new self(); //Exemplo 1
        $outra_instancia = new Teste(); //Assim também funciona
    }
}
--
Alexandre Gomes Gaigalas
alex...@gaigalas.net
http://Alexandre.Gaigalas.Net


2009/1/23 Ruan Carlos <ruan...@gmail.com>

Bruno Gross

unread,
Jan 23, 2009, 12:58:50 PM1/23/09
to list...@googlegroups.com
se todos os métodos dela estão disponíveis dentro do escopo, tem um porque vc instanciar??

2009/1/23 Alexandre Gaigalas <alex...@gaigalas.net>



--
Visite: www.UpaLele.com

att.
Bruno Gross
Analista de Sistemas
Celular: (21) 78545483
Rádio ID: 83*39379

Esta mensagem, incluindo seus anexos, pode conter informações confidenciais e/ou privilegiadas. Se você não for a pessoa autorizada a receber esta mensagem, não pode usar, copiar ou divulgar as informações nela contidas ou tomar qualquer ação baseada nessas informações. Caso esta mensagem tenha sido recebida por engano, por favor avise imediatamente o remetente, respondendo o e-mail e em seguida elimine-a do seu sistema. Agradeço sua cooperação.

Ruan Carlos

unread,
Jan 23, 2009, 1:07:12 PM1/23/09
to LISTA PHP
@Alexandre

Obrigadão, funcionou assim "return new self($gr_matricula);". Não
entendi o por que dos (*) mais funcionou sem. Obrigado

@Gross
É por que o login é um Método Estático e não teria como eu ter acesso
via $this a outros métodos.
Me corrija se estiver errado.


On 23 jan, 15:58, Bruno Gross <brunogr...@gmail.com> wrote:
> se todos os métodos dela estão disponíveis dentro do escopo, tem um porque
> vc instanciar??
>
> 2009/1/23 Alexandre Gaigalas <alexan...@gaigalas.net>
>
>
>
> > *class* Teste
> > {
> >     public function __construct() {
> >         $nova_instancia = new *self*(); //Exemplo 1
> >         $outra_instancia = new *Teste*(); //Assim também funciona
> >     }
> > }
> > --
> > Alexandre Gomes Gaigalas
> > alexan...@gaigalas.net
> >http://Alexandre.Gaigalas.Net
>
> > 2009/1/23 Ruan Carlos <ruanl...@gmail.com>

Bruno Gross

unread,
Jan 23, 2009, 1:08:25 PM1/23/09
to list...@googlegroups.com
acho q dentro do escopo da classe pode sim, mesmo sem instanciar


2009/1/23 Ruan Carlos <ruan...@gmail.com>

Bruno Gross

unread,
Jan 23, 2009, 1:09:29 PM1/23/09
to list...@googlegroups.com
testei aqui no C#

realmente vc ta certo

sem instancia, nada feito

2009/1/23 Bruno Gross <bruno...@gmail.com>

Ruan Carlos

unread,
Jan 23, 2009, 1:13:38 PM1/23/09
to LISTA PHP
Podemos dizer assim, métodos estáticos não fazem parte da class
(apenas uma maneira de falar).

Mais mesmo assim, obrigado!

On 23 jan, 16:09, Bruno Gross <brunogr...@gmail.com> wrote:
> testei aqui no C#
>
> realmente vc ta certo
>
> sem instancia, nada feito
>
> 2009/1/23 Bruno Gross <brunogr...@gmail.com>
>
>
>
> > acho q dentro do escopo da classe pode sim, mesmo sem instanciar
>
> > 2009/1/23 Ruan Carlos <ruanl...@gmail.com>

Alexandre Gaigalas

unread,
Jan 23, 2009, 1:14:11 PM1/23/09
to list...@googlegroups.com
Até mesmo com uma instância, é possível e lógico uma instância criar outra instância dentro de si mesma.

class Categoria
{
    public $nome;
    public $subcategorias = array();
    public function __construct($nome)
    {
        $this->nome = $nome;
    }
    public function criaSubCategoria($nome)
    {
        return $this->subcategorias[$nome] = new self($nome);
    }
}

$informatica = new Categoria('Informática');
$computadores = $informatica->criaSubCategoria('Computadores');
$monitores = $informatica->criaSubCategoria('Monitores');
$LCD = $monitores->criaSubCategoria('LCD');

;)
2009/1/23 Bruno Gross <bruno...@gmail.com>

Rômulo Nunes

unread,
Jan 23, 2009, 1:18:42 PM1/23/09
to list...@googlegroups.com
Ruan:
Realmente no método estático você não poderá acessar métodos não estáticos.
Seu método login está bem similar a um Factory, acho que você pode dar uma olhada nesse pattern para guiar melhor seu código. Por exemplo: creio que ao falhar o login você deveria dar um throw numa excessão evitando que seu método retorne objetos de tipos diferentes...
O exemplo do Alexandre realmente vai funcionar, só não use-o no construtor ;)

Bruno:
Não sei se você se referiu ao caso específico do problema dele, mas é normal criar instancias da mesma classe dentro de uma instancia.

--

Romulo Nunes


2009/1/23 Bruno Gross <bruno...@gmail.com>

Bruno Gross

unread,
Jan 23, 2009, 1:46:08 PM1/23/09
to list...@googlegroups.com
pode até ser romulo, eu não vejo necessidade

em c# crio cópias do objeto se for preciso

2009/1/23 Rômulo Nunes <saruma...@gmail.com>

Alexandre Gaigalas

unread,
Jan 23, 2009, 1:51:55 PM1/23/09
to list...@googlegroups.com
Dá uma checada no exemplo que coloquei das categorias ;) Não se pode simplesmente copiar... é teoricamente uma nova instância.
2009/1/23 Bruno Gross <bruno...@gmail.com>

Bruno Gross

unread,
Jan 23, 2009, 1:57:09 PM1/23/09
to list...@googlegroups.com
C# tem um método copy q cria uma nova instancia e não apenas seta uma nova referência

entendo o q quis dizer

2009/1/23 Alexandre Gaigalas <alex...@gaigalas.net>

William G. Comnisky

unread,
Jan 23, 2009, 2:00:25 PM1/23/09
to list...@googlegroups.com

Bruno Gross

unread,
Jan 23, 2009, 2:02:06 PM1/23/09
to list...@googlegroups.com
issae

num é copy

é clone

to trabalhando mto essa semana

2009/1/23 William G. Comnisky <w.com...@gmail.com>

Ruan Carlos

unread,
Jan 23, 2009, 2:12:34 PM1/23/09
to LISTA PHP
Hehe, mais no caso ali não dava para usar o clone.

@Romulo

Obrigado pelas dicas, eu tinha esquecido que estou trabalhando com o
PHP 5 agora e posso usaro Try Catch ^^. Saudades do C# ou Java.

Sobre o Factory, eu dei uma olhada mais não era bem isso que eu
queria, mais vou olhar novamente.

Obrigado!


On 23 jan, 17:02, Bruno Gross <brunogr...@gmail.com> wrote:
> issae
>
> num é copy
>
> é clone
>
> to trabalhando mto essa semana
>
> 2009/1/23 William G. Comnisky <w.comni...@gmail.com>
>
>
>
>
>
> >http://br.php.net/manual/en/language.oop5.cloning.php
>
> > 2009/1/23 Bruno Gross <brunogr...@gmail.com>:
> > > C# tem um método copy q cria uma nova instancia e não apenas seta uma
> > nova
> > > referência
>
> > > entendo o q quis dizer
>
> > > 2009/1/23 Alexandre Gaigalas <alexan...@gaigalas.net>
>
> > >> Dá uma checada no exemplo que coloquei das categorias ;) Não se pode
> > >> simplesmente copiar... é teoricamente uma nova instância.
>
> > >> --
> > >> Alexandre Gomes Gaigalas
> > >> alexan...@gaigalas.net
> > >>http://Alexandre.Gaigalas.Net
>
> > >> 2009/1/23 Bruno Gross <brunogr...@gmail.com>
>
> > >>> pode até ser romulo, eu não vejo necessidade
>
> > >>> em c# crio cópias do objeto se for preciso
>
> > >>> 2009/1/23 Rômulo Nunes <sarumanrom...@gmail.com>
>
> > >>>> Ruan:
> > >>>> Realmente no método estático você não poderá acessar métodos não
> > >>>> estáticos.
> > >>>> Seu método login está bem similar a um Factory, acho que você pode dar
> > >>>> uma olhada nesse pattern para guiar melhor seu código. Por exemplo:
> > creio
> > >>>> que ao falhar o login você deveria dar um throw numa excessão evitando
> > que
> > >>>> seu método retorne objetos de tipos diferentes...
> > >>>> O exemplo do Alexandre realmente vai funcionar, só não use-o no
> > >>>> construtor ;)
>
> > >>>> Bruno:
> > >>>> Não sei se você se referiu ao caso específico do problema dele, mas é
> > >>>> normal criar instancias da mesma classe dentro de uma instancia.
>
> > >>>> --
>
> > >>>> Romulo Nunes
>
> > >>>> 2009/1/23 Bruno Gross <brunogr...@gmail.com>
>
> > >>>>> testei aqui no C#
>
> > >>>>> realmente vc ta certo
>
> > >>>>> sem instancia, nada feito
>
> > >>>>> 2009/1/23 Bruno Gross <brunogr...@gmail.com>
>
> > >>>>>> acho q dentro do escopo da classe pode sim, mesmo sem instanciar
>
> > >>>>>> 2009/1/23 Ruan Carlos <ruanl...@gmail.com>
> > w.comni...@gmail.com

Rômulo Nunes

unread,
Jan 23, 2009, 2:14:55 PM1/23/09
to list...@googlegroups.com
Clonar objetos servirá em alguns casos, mas somente se sua classe for stateless.
Reply all
Reply to author
Forward
0 new messages