Ir para conteúdo

POWERED BY:

Arquivado

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

falcao544

Quando usar self::, parent:: e $this

Recommended Posts

O titulo do topico ja diz tudo. Eu ja li alguns artigos a respeito, mas ainda nao sei direito qual usar quando eu uso extends e etc...

 

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou meio preguiçoso hoje, vou responder me curtinho...

 

self dentro de uma classe para invocar métodos ou propriedades estáticas

 

parent é o mesmo que self, porém para quando o método ou propriedade se encontra em sua classe-pai. Essa keyword também admite que o construtor da classe-pai seja invocado estaticamente, mesmo que este não seja estático:

 

abstrac class AbstractClass {

   public functtion __construct() {
       echo 'Cruel World';
   }
}

class SayHello extends AbstractClass {

   public function __construct() {

       echo 'Hello! ';

       parent::__construct();
   }
}

Ao instanciar SayHello você verá Hello! Cruel Worldpois apesar de sobrescrever o construtor, você o está invocado depois de fazer alguma coisa, no caso, ecoar o prefixo da frase.

 

Pode ser que os outros métodos mágicos também devam ser invocados, quando justificado fazê-lo, utilizando parent. Não confirmo porque nunca fiz.

 

$this é quase o mesmo que self e parent juntos, porém, para métodos e propriedades não-estáticos.

 

Lembrando novamente que o construtor, mesmo que não estático deve ser invocado utilizando parent. Usar self para invocar o construtor dentro da própria classe, como em Singletons, não faz serntido nenhum, sendo que é possível usar o new

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum! Muito obrigado! Entao se eu quiser chamar um metodo dentro da classe aonde ele foi declarado, eu so poderia usar usar self se ele fosse estatico, caso contrario, so usando $this, correto?

 

E quando eu devo declarar um metodo como estatico? Eu li que se deve declarar um metodo como estatico, quando ele eh muito usado e assim se evita uma linha de codigo, que seria usada para instanciar a classe, mas nao achei que isso fizesse muito sentido.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que esse exemplo esclarece o conceito de propriedade estática.

 

Se puder testar.

 

<?php

class Teste{

public static $contador;

function __construct(){

	self::$contador++;

}


}


$t1 = new Teste();
$t2 = new Teste();

echo Teste::$contador;


?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelo exemplo, mas eu ja entendi o conceito de propriedades estaticas, o que eu nao consegui entender muito bem foi em relacao aos metodos estaticos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

métodos estáticos são úteis quando você que chamar um método de uma classe sem instanciá-la. Por exemplo, se você possui uma classe com alguns métodos auxiliares, que executam ações que não dependem de outros dados da classe, pode defini-lo como estático.

 

Outro uso comum é nos padrões Singleton e Factory, que tem um método geralmente chamado getInstance(), que retorna sempre uma instância única da classe.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas Beraldo, eu li que mesmo o metodo nao sendo estatico, tem como chama-lo sem instanciar a classe! E ai? Isso eh meio que uma falha da equipe do PHP ou tem algum uso?

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas Beraldo, eu li que mesmo o metodo nao sendo estatico, tem como chama-lo sem instanciar a classe!

Nunca vi isso. Onde leu? Mostre um exemplo

 

 

E ai? Isso eh meio que uma falha da equipe do PHP ou tem algum uso?

Isso não é do PHP. Toda linguagem que suporte OO tem isso. Se fosse uma falha, seria uma falha da OO, não do PHP

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca vi isso. Onde leu? Mostre um exemplo

 

<?php
class aclass {
function anonstatic() {
echo 'non static';
}

static function astatic() {
echo 'static';
}
}

$aobj = new aclass();

aclass::anonstatic();
//it works.

$aobj->astatic();
//it works too.
?>

Testei esse codigo localmente usando o servidor nativo do PHP 5.4 e obtive esse retorno:

Strict Standards: Non-static method aclass::anonstatic() should not be called statically in C:\ProgramFiles\Projeto\NetBeans\example.php on line 14

non staticstatic

 

Mesmo acusando o erro ele imprime na tela a mensagem! Eu achava que o php retornaria um erro do tipo fatal!

 

 

Isso não é do PHP. Toda linguagem que suporte OO tem isso. Se fosse uma falha, seria uma falha da OO, não do PHP

 

Aonde eu li, eu entendi que essa possibilidade era somente no PHP!

 

Aqui esta o link -> http://bytes.com/topic/php/answers/495206-static-method-vs-non-static-method

 

Esta escrito no segundo paragrafo da primeira resposta!

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto mais eu conheço o PHP, mais eu veto a bagunça que ele é :lol:

 

Isso é só no PHP, mesmo, que eu saiba. Pensando assim, realmente não faz muito sentido ter um método estático...

 

bicho doido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é! Haha! Sera que isso se deve ao fato de o PHP ter sido criado como uma linguagem estruturada e assim essas falhas se devem a esse processo de transição para OO? O tipo de erro retornado deveria ser um do tipo fatal?

 

Outra dúvida: é um método estático pode ser chamado através de uma instância da classe à qual ele pertence?

 

Obrigado!

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.