Qual a diferença entre Private, Public, Protected, Static e $this e self:: no PHP


Antes de tudo, devemos separar Private, Public e Protected das outras coisas. Estas declarações definem a visibilidade de um método ou propriedade de uma dada classe no PHP. Veja abaixo:

  • Public: Acessível para todos. Um método ou propriedade public é acessível através de um objeto instanciado, por outros métodos e por outras classes herdeiras.
  • Protected: Acessível somente para a própria classe ou por classes herdeiras. Um método ou propriedade definida como protected não é acessível de fora dela. Por exemplo, se você instanciar um objeto, não conseguirá invocar um método protected ou acessar uma propriedade protegida.
  • Private: Acessível somente para a própria classe. Um método ou propriedade private (privada) só é acessível de dentro da própria classe. Mesmo classes herdeiras não conseguirão acesso.

Veja alguns exemplos:

Visibilidade Public

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CLASSE {
    public $valor = 1;
}  
 
class CLASSE2 extends CLASSE{
    
    public function get_valor(){
    
        return $this->valor;
        
    }
    
}
 
$ob = new CLASSE2;
 
echo $ob->valor . "<br>";
 
echo $ob->get_valor();
class CLASSE {
    public $valor = 1;
}  

class CLASSE2 extends CLASSE{
	
	public function get_valor(){
	
		return $this->valor;
		
	}
	
}

$ob = new CLASSE2;

echo $ob->valor . "<br>";

echo $ob->get_valor();

Neste exemplo acima não há segredo, tanto a propriedade valor da primeira classe quanto o método get_valor da segunda classe são públicos, portanto acessíveis a todos.

Visibilidade Protected

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CLASSE {
    protected $valor = 1;
}  
 
class CLASSE2 extends CLASSE{
    
    public function get_valor(){
    
        return $this->valor;
        
    }
    
}
 
 
$ob = new CLASSE2;
 
echo $ob->valor . "<br>";
class CLASSE {
    protected $valor = 1;
}  

class CLASSE2 extends CLASSE{
	
	public function get_valor(){
	
		return $this->valor;
		
	}
	
}


$ob = new CLASSE2;

echo $ob->valor . "<br>";

O código acima vai gerar um erro de permissão, pois você não pode acessar uma propriedade protected de fora da classe. No caso, quando você tentar acessar a propriedade valor desta forma $ob->valor, o erro fatal ocorre. Como eu disse antes, propriedades e métodos protegidos só podem ser acessos ou pela própria classe ou por classes herdeiras. Então, se ao invés de echo $ob->valor você utilizasse o método get_valor da segunda classe (e que está como public), então você conseguiria obter o valor da propriedade valor sem nenhum erro. Veja o exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CLASSE {
    protected $valor = 1;
}  
 
class CLASSE2 extends CLASSE{
    
    public function get_valor(){
    
        return $this->valor;
        
    }
    
}
 
 
$ob = new CLASSE2;
 
echo $ob->get_valor();
class CLASSE {
    protected $valor = 1;
}  

class CLASSE2 extends CLASSE{
	
	public function get_valor(){
	
		return $this->valor;
		
	}
	
}


$ob = new CLASSE2;

echo $ob->get_valor();

Visibilidade Private

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CLASSE {
    private $valor = 1;
}  
 
class CLASSE2 extends CLASSE{
    
    public function get_valor(){
    
        return $this->valor;
        
    }
    
}
 
 
$ob = new CLASSE2;
 
echo $ob->get_valor();
class CLASSE {
    private $valor = 1;
}  

class CLASSE2 extends CLASSE{
	
	public function get_valor(){
	
		return $this->valor;
		
	}
	
}


$ob = new CLASSE2;

echo $ob->get_valor();

O mesmo código que usado anteriormente falhará quando a visibilidade da propriedade valor for private. O Código acima gerará um erro, pois como eu disse, métodos e propriedades private só são acessíveis dentro da própria classe. Então, se você quisesse obter este valor da primeira classe, deveria criar um método public que pegasse ele para você, como neste exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
class CLASSE {
    private $valor = 1;
    
    public function get_valor(){
        return $this->valor;    
    }
 
}  
 
$ob = new CLASSE();
 
echo $ob->get_valor();
class CLASSE {
    private $valor = 1;
	
	public function get_valor(){
		return $this->valor;	
	}

}  

$ob = new CLASSE();

echo $ob->get_valor();

Propriedade e Método Static

Static, em suma, define com uma propriedade e método poderão ser acessados. Por exemplo, métodos e propriedades static podem ser acessados sem a necessidade de instanciar um objeto. Obtendo o valor estático ou o retorno do método diretamente através da sintaxe dos dois pontos duplos “::”. Veja alguns exemplos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CLASSE {
    public static $valor = 1;
    
    public static function get_valor(){
        
        echo CLASSE::$valor;    
    }
 
}  
 
 
echo CLASSE::$valor . "<br>";
 
echo CLASSE::get_valor();
class CLASSE {
    public static $valor = 1;
	
	public static function get_valor(){
		
		echo CLASSE::$valor;	
	}

}  


echo CLASSE::$valor . "<br>";

echo CLASSE::get_valor();

Como você pode ver, foi possível obter o valor da propriedade $valor e também invocar o método get_valor sem instanciar um objeto da classe. Isso só foi possível por que a propriedade e o método estavam declarados como static e com visibilidade public.

Um detalhe é que propriedades e métodos static só são acessíveis com a sintaxe dos dois pontos duplos, em detrimento do “->” utilizado para acessar propriedades e métodos de objetos instanciados.

Diferença entre $this e self::

$this

O $this é utilizado para acessar propriedades e métodos de dentro da própria classe, mas referindo-se ao objeto já instanciado. Veja:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CLASSE {
    
    public $valor = 1;
    
    public function CLASSE(){
            
        $this->valor = 2;   
    }
 
}  
 
$ob = new CLASSE();
 
echo $ob->valor . "<br>";
class CLASSE {
	
    public $valor = 1;
	
	public function CLASSE(){
			
		$this->valor = 2;	
	}

}  

$ob = new CLASSE();

echo $ob->valor . "<br>";

O código acima vai imprimir o valor 2, pois quando o objeto é instanciado, a função de mesmo nome dela é invocada e então é atribuído a sua propriedade valor o valor 2.

self::

Self é idêntico ao $this, suas funções são as mesmas, referir-se a própria classe instanciada. A diferença é que o self:: é utilizado para obter valores de propriedades definidas como static e também de constantes. Veja o exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CLASSE {
    
    const VALOR = 8;
    public static $valor = 1;
    
    public function CLASSE(){
            
        self::$valor = 2;   
    }
    
    public function get_valor(){
        return self::$valor + self::VALOR;
    }
 
}  
 
$ob = new CLASSE();
 
echo $ob->get_valor() . "<br>";
class CLASSE {
	
	const VALOR = 8;
    public static $valor = 1;
	
	public function CLASSE(){
			
		self::$valor = 2;	
	}
	
	public function get_valor(){
		return self::$valor + self::VALOR;
	}

}  

$ob = new CLASSE();

echo $ob->get_valor() . "<br>";

O Código vai imprimir o valor 10 na tela. Como VALOR era uma constante e $valor uma variável do tipo static, foi preciso utilizar o self:: ao invés do $this. Uma curiosidade é que com self:: você pode invocar métodos estáticos ou não, enquanto que com $this, você só conseguirá invocar métodos NÃO estáticos.

Leave a Reply