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

Author: Otávio Calaça Xavier

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:

PHP:
<?php
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:

PHP:
<?php
$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:

PHP:
<?php
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.

Retirado de PHPendo

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.