Membros de classes PHP

Nenhum produto encontrado nessa seleção.

Se você vem acompanhando nosso curso gratuito de PHP, provavelmente deve ter visto a diferença entre variáveis, constantes e valores estáticos. Uma classe PHP também pode conter propriedades constantes, que não podem ter seu valor alterado no decorrer do script, e estáticas, que mantém seu valor no decorrer do script.

Além disso, também podemos criar métodos estáticos, onde não é preciso criar um objeto de classe (instanciar) para executar sua ação.

Vamos ver como isso funciona na prática.

Constantes em classes PHP

Você pode definir uma constante em uma classe PHP utilizando a palavra {php}const{/php}, o nome da constante, um sinal de {php}={/php}, o valor dela, e um {php};{/php}.

<?php
class MinhaAplicacao
{
	// Propriedades constantes
	const NomeApp = 'Minha Aplicação';
	const Versao  = '1.0';
}
?>

Você pode exibir o valor de uma constante sem instanciar a classe. Para isso basta utilizar o nome da classe, duas vezes dois pontos ({php}::{/php}) e o nome da constante.

<?php
class MinhaAplicacao
{
	// Propriedades constantes
	const NomeApp = 'Minha Aplicação';
	const Versao  = '1.0';
}

// Exibe o valor da constante fora do contexto da classe
echo MinhaAplicacao::NomeApp; // Minha Aplicação
?>

Se você quiser exibir o valor da constante dentro da própria classe, é possível utilizar as palavras {php}parent{/php}, para referir-se à classe mãe, ou {php}self{/php}, para fazer referência a própria classe na qual você está trabalhando. Veja:

<?php
class MinhaAplicacao
{
	// Propriedades constantes
	const NomeApp = 'Minha Aplicação';
	const Versao  = '1.0';
	
	// Construtor
	function __construct () {
		// Exibe o valor das constantes
		echo 'Aplicação: ' . self::NomeApp . '<br>';
		echo 'Versão '     . self::Versao  . '<br>';
	}
}

// Objeto (instância da classe)
$MyApp = new MinhaAplicacao();
?>

Veja outro exemplo, agora utilizando uma subclasse:

<?php
class MinhaAplicacao
{
	// Propriedades constantes
	const NomeApp = 'Minha Aplicação';
	const Versao  = '1.0';	
}

// Subclasse
class Extensao extends MinhaAplicacao
{
	// Cria uma nova constante para a subclasse
	const Versao  = '1.1';	

	// Construtor
	function __construct () {
		// Exibe o valor das constantes
		echo 'Aplicação: '          . parent::NomeApp . '<br>';
		echo 'Versão inicial: '     . parent::Versao  . '<br>';
		echo 'Versão da Extensão: ' . self::Versao    . '<br>';
	}
}

// Objeto (instância da classe)
$MyApp = new Extensao();
?>

O trecho acima deverá exibir:

Aplicação: Minha Aplicação
Versão inicial: 1.0
Versão da Extensão: 1.1

Propriedades estáticas em classes PHP

Propriedades estáticas são podem ser definidas com a palavra {php}static{/php}, veja:

<?php
class MinhaAplicacao
{
	// Propriedades estáticas
	static $acessos = 0;
}

// Exibe o valor da propriedade estática sem instanciar a classe
echo MinhaAplicacao::$acessos;
?>

As propriedades estáticas retém o valor da última execução da classe, e este valor é alterado em todos os objetos que instanciarem a mesma. Por exemplo:

<?php
class MinhaAplicacao
{
	// Propriedades estáticas
	static $acessos = 0;
	
	// Soma +1 quanto instancia a classe
	function __construct () {
		self::$acessos++;
	}
}

// Cria várias instâncias da mesma classe
$obj1 = new MinhaAplicacao();
$obj2 = new MinhaAplicacao();
$obj3 = new MinhaAplicacao();
$obj4 = new MinhaAplicacao();

// Exibe o valor da propriedade estática sem instanciar a classe
echo MinhaAplicacao::$acessos; // 4
?>

Como você pôde visualizar no trecho de código acima, acesso a propriedade estática com a palavra {php}self{/php}, duas vezes dois pontos {php}::{/php}, e o nome da propriedade com um cifrão {php}${/php}. A palavra {php}parent{/php} também pode ser utilizada. Veja:

<?php
// Classe
class MinhaAplicacao
{
	// Propriedades estáticas
	static $acessos = 0;
}

// Subclasse
class Extensao extends MinhaAplicacao
{
	// Soma +1 quanto instanciar a classe
	function __construct () {
		parent::$acessos++;
	}
}

// Cria várias instâncias da mesma classe
$obj1 = new Extensao();
$obj2 = new Extensao();
$obj3 = new Extensao();
$obj4 = new Extensao();

// Exibe o valor da propriedade estática
echo Extensao::$acessos; // 4
?>

No trecho acima, como estou utilizando o construtor para somar mais um na variável estática, não preciso utilizar nenhuma outra função. Cada vez que que criar um objeto da classe (instanciar), a função do construtor é executada e soma mais um na propriedade. Como ela mantém seu valor, eu consigo visualizar quantas vezes a classe foi instanciada.

Métodos estáticos em classes PHP

Métodos estáticos podem ser acessados diretamente pelo nome da classe, sem a necessidade de uma instância (objeto), veja:

<?php
// Classe
class MinhaAplicacao
{
	// Método estático
	static public function exibe( $valor ) {
		echo $valor;
	}	
}

// Executa o método estático sem objeto
MinhaAplicacao::exibe('Qualquer valor.');
?>

Você também pode acessar o método estático de um objeto. Veja:

<?php
// Classe
class MinhaAplicacao
{
	// Método estático
	static public function exibe( $valor ) {
		echo $valor;
	}	
}

// Objeto
$classe = new MinhaAplicacao();

// Também funciona com o método estático
$classe->exibe('Qualquer valor');
?>

Porém, você não pode fazer referência a propriedades e métodos utilizando a palavra {php}$this{/php}, já que essa palavra é utilizada para referenciar instâncias da classe, não a classe em si. Veja o erro:

<?php
// Classe
class MinhaAplicacao
{
	// Método estático
	static public function exibe( $valor ) {
		echo $this->adiciona_valor() . ' ' . $valor;
	}
	
	protected function adiciona_valor() {
		return 'Adicionado: ';
	}
}

// Objeto
$classe = new MinhaAplicacao();

// Fatal error: Using $this when not in object context
$classe->exibe('Qualquer valor');
?>

Além disso, se você utilizar as palavras {php}self{/php} ou {php}parent{/php}, o código será executado, mas você também verá um erro. Veja:

<?php
// Classe
class MinhaAplicacao
{
	// Método estático
	static public function exibe( $valor ) {
		echo self::adiciona_valor() . ' ' . $valor;
	}
	
	protected function adiciona_valor() {
		return 'Adicionado: ';
	}
}

// Objeto
$classe = new MinhaAplicacao();

// Strict Standards: Non-static method MinhaAplicacao::adiciona_valor() should not be called statically
$classe->exibe('Qualquer valor');
?>

Concluindo

Se você perdeu as aulas anteriores, não deixe de seguir nosso curso de PHP gratuito e PHP com orientação a objetos.

Em caso de dúvidas, é só perguntar aí nos comentários.

Até a próxima !