self:: e $this->. Qual a diferença?

Posted by Otávio On terça-feira, 18 de setembro de 2007 0 comentários


Em PHP 5 podemos referenciar métodos e atributos de uma classe dentro de outros métodos dela utilizando self:: ou $this, mas muitas pessoas não sabem quando usar um e o outro...
Basicamente a diferença está em self:: referir-se à classe e $this-> referir-se ao objeto.
Bom, suponha as classe:

class Carro {
public $marcha;
public function reduzirMarcha() {
$this->marcha--;
}
}
O atributo $marcha representa a marcha que o carro está atualmente e o método reduzirMarcha decrementa esse atributo. Observe que utilizamos $this->.
Vamos instanciar um objeto dessa classe:

$corsa = new Carro();
$corsa->marcha = 2;
$corsa->reduzirMarcha();
echo $corsa->marcha; //irá retornar 1.

se utilizar-mos self:: ao invés de $this-> não irá funcionar e no PHP 5 irá dar Fatal Error por $marcha não ser uma variavel estática.
Observe agora:
class Carro {
public static $quantidade;
public function __construct() {
self::$quantidade++;
}
}

$corsa = new Carro();
$gol = new Carro();
echo Carro::$quantidade; //irá retornar 2. ( duas instancias de carro )

Agora a classe Carro possui uma variável estática $quantidade que não poderá ser chamada a partir de um objeto e somente a partir da Classe ( sem estar instanciada ).
Lembre-se só utilizamos self:: para variáveis estáticas.

Nenhum comentário: