• Conceitos de P.O.O

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Método como parâmetro/argumento
  2. Declarar parâmetros variáveis
  3. Passagem por valor e referência
  4. Escopo de classe e método
  5. Usando namespace

Os métodos são funções que nossos objetos possuem e que estão disponíveis para execução ou uso. Esses métodos ficam visíveis de acordo com o seus encapsulamentos: público, privado ou outro.

Os métodos construtor e destrutor são métodos especiais. O método construtor é invocados automaticamente quando instanciamos objetos e contém codificação para iniciar os atributos de objetos.

O método destrutor é chamado quando o objeto instanciado tem seus recursos em memória liberados ou destruídos.

Tanto o método construtor quanto e destrutor seguem as regras de declaração abaixo, quando declarados:

Regras
  1. Devem iniciar com __
  2. Devem possuir os nomes constructor e destructor
  3. Não possui retorno
  4. Apenas construtor pode possuir parâmetro(s)
  5. Apenas um construtor por classe
  6. Apenas um destrutor por classe

O método construtor padrão é um método especial com o objetivo de instanciar um novo objeto como visto anteriormente.

Esse tipo de método não tem sua declaração obrigatória, sendo é criado implicitamente em nossas classes.

Sintaxe
class nome_classe
{
    //atributos omitidos

    modificador_acesso function __construct(){
        //corpo omitido
    }
}
Onde
modificador_acesso: modificador public, private e protected. Padrão public
Exemplo 1
//MinhaClasse.php
<?php
class MinhaClasse{
   function __construct(){
     echo "__construct chamado";
   }
}
?>

//main.php
<?php
    include("MinhaClasse.php");

    $obj = new MinhaClasse();
?>
Saída
__construtor chamado

Os construtores com parâmetros, são métodos que além de instanciar um objeto também nos permitem configurá-los ou iniciá-los com valores.

Sintaxe
function __construct(<lista_parametros>){
    //corpo
}
Onde
-
Exemplo 2
//MinhaClasse.php
<?php
class MinhaClasse{
   public $atributo = 0;
   
   function __construct($param){
     echo "__construct chamado";
     $atributo = $param;
   }
}
?>

//main.php
<?php
    include("MinhaClasse.php");
    $obj = new MinhaClasse(999);
    echo $obj->atributo,"\n";
?>
Saída
__construct chamado
999

O método destruct é outro método especial que é chamado para liberar os recursos utilizados nossos objetos. Assim como o método construtor pode conter codificação.

Sintaxe
class nome_classe 
{
    function __destruct()
    {
        //corpo destrutor
    }
}
Onde
-
Exemplo 2
//MinhaClasse.php
<?php
class MinhaClasse{
   public $atributo = 0;
   
   function __construct($param){
     echo "__construct chamado","\n";
     $this->atributo = $param;
   }
   
   function __destruct(){
     echo "__destrutor chamado","\n";       
   }
}
?>

//main.php
<?php
    include("MinhaClasse.php");
    $obj = new MinhaClasse(999);
    echo $obj->atributo,"\n";
?>
Saída
__construct chamado
999
__destrutor chamado

Em PHP, as funções são métodos associados a objetos. Por intermédio dos métodos é possível trocar mensagens utilizando argumentos e recebendo dados de retorno. Nesta parte do tutorial vamos aprender mais características sobre os métodos.

A declaração de métodos é feita respeitando a sintaxe abaixo:

Sintaxe
modificador_acesso function nome_metodo()
{
	//corpo
}
Onde
modificador_acesso: modificadores de acesso ao método conforme tabela abaixo

O encapsulamento de métodos de nossas classes é feito utilizando os modificadores mostrados na tabela abaixo:

Tab. 1: Modificadores de acesso
Acesso public private protected
Mesma Classe Sim Sim Sim
Outra Classe Sim Não Não
Outra Classe (Outro pacote) Sim Não Não
Classe Herdada Sim Não Sim

O modificador de acesso public é o modificador padrão dos métodos que não têm seus modificadores informados.

Exemplo 3
<?php
class MinhaClasse{
   public $atributo = 0;
   
   public function metodo(){
       echo "metodo","\n";
   } 
}
?>
Saída
-

O modificador protected será melhor compreendido quando estivermos estudando o tópico sobre POO: Herança.

A chamada dos métodos de nossos objetos é feita utilizando o operador (->) como pode ser conferido na sintaxe abaixo:

Sintaxe
$nome_objeto->nome_metodo();
Exemplo 4
//MinhaClasse.php
<?php
class MinhaClasse{

   public function metodo($param){
       echo "metodo:",$param,"\n";
   } 
}
?>

//main.php
<?php
    include("MinhaClasse.php");
    
    $obj = new MinhaClasse();
    $obj->metodo(999);
?>}
Saída
777

Assim como funções, métodos podem receber argumentos e possuir retorno de dados. Abaixo a sintaxe da declaração de métodos que aceitam parâmetros e retorno de dados.

Sintaxe
modificador_acesso function nome_metodo(<lista_parametros>) : tipo_retorno
{
    //corpo
    return valor_retorno;
}
Onde
<lista_parametros>: parâmetros serparados por (,) sendo primitivos, enumeradores, classes e outros. 
modificador_acesso: modificadores de acesso: public , protected e private
Exemplo 5
//MinhaClasse.php
<?php
class MinhaClasse{
   public function metodo_sem_retorno($param)
   {
       echo $param,"\n";
   } 
   public function metodo_com_retorno(int $param): int 
   {
       return $param*2;
   } 
}
?>

//Main.java
<?php
    include("MinhaClasse.php");
    
    $obj = new MinhaClasse();
    $obj->metodo_sem_retorno(999);
    echo $obj->metodo_com_retorno(2);
?>
Saída
999
4

Quando aplicamos encapsulamento nos atributos de nossas classes usando o modificador de acesso private, vamos precisar de disponibilizar métodos para recuperar e alterar esses atribuitos. Assim, criamos os métodos get e set.

Sintaxe: Get
modificador_acesso tipo_dado getNome_atributo()
{
    return nome_atributo;
}
Sintaxe: Set
modificador_acesso void setNome_atribuito($parametro)
{
    $this->nome_atributo = $param;
}
Exemplo 6
//MinhaClasse.php
<?php
class MinhaClasse{
    private $atributo = null;

    function __contruct($msg){
        $this->atributo = $msg;
    }
    public function getAtributo() : string {
      return $this->atributo;
    }
    public function setAtributo(string $p){
      $this->atributo = $p;
    }
}
?>

//Main.java
<?php
    include("MinhaClasse.php");
    
    $obj = new MinhaClasse();
    $obj->setAtributo("Uma string PHP");
    echo $obj->getAtributo();
?>
Saída
Um string PHP

Métodos com modificador de restrição static, são métodos que irão existir independente de um objeto ser instanciado ou não. Esse seguem a idéia semelhante que foi vista com atributos estáticos.

Regras
  1. Podem ser acessados sem instanciar um objeto
  2. Podem ser acessado pela própria classe
  3. Podem acessar apenas recursos estáticos
  4. Devem ser acessados utilizando self e operador (::) internamente
  5. Devem ser acessados utilizando operador (::) externamente
Sintaxe
modificador_acesso static function nome_metodo(<lista_parametros>)
{
   //corpo
   return valor;
} 

Esse tipo de método é acessado diretamente por sua classe da mesma forma que acessos aos métodos vistos utilizando o operador (->).

Sintaxe
nome_classe::nome_metodo(<lista_argumentos>);
Exemplo 8
//MinhaClasse.php
<?php
class MinhaClasse{
    public static $atributo = 999;

    public static function metodo_estatico() : string {
      return self::$atributo;
    }
}
?>
//main.php
<?php
    include("MinhaClasse.php");
    
    echo MinhaClasse::metodo_estatico();
?>
Saída
999

O this é uma palavra reservada da linguagem PHP que diz que estamos fazendo referência à própria classe. Usando essa palavra é possível declarar de qual classe o método desejado será invocado:

Sintaxe
$this->nome_metodo(<lista_argumentos>);
Exemplo 4
//MinhaClasse.php
<?php
class MinhaClasse {

   function metodo2(){
     $this->metodo1();
   }   
   function metodo1(){
       echo "metodo1","\n";
   }
}

//main.php
<?php
    include("MinhaClasse.php");

    $objeto = new MinhaClasse();
    $objeto->metodo2();
?>
Saída
metodo1

O uso de modificadores de acesso podem restringir o uso do this de acordo com o nível de acesso de cada modificador utilizado.

A linguagem PHP, em relação a sobrecarga de métodos, é diferente outras linguagem como Java, C# e Vb.Net. Nessas linguagens, realizamos a sobrecarga de forma natural e intuitiva, mantendo-se os métodos com os mesmos nomes e variando o número de parâmetros e seus tipos.

//exemplo em Java
class Teste {
    public void metodo1(){
        //omitido
    }
    public void metodo1(int param){
        //omitido   
    }
    public void metodo1(int param, String param2){
        //omitido    
    }
} 

A linguagem PHP não permite tal forma de sobrecarga. Para atingirmos o mesmo resultado precisamos implementar o método especial chamado de __call.

Sintaxe
__call($name, $arguments){
 //corpo
}
Onde
$name: nome do método invocado
$arguments: argumentos passados para método $name

O método especial acima é executado, quando declarado em um classe, automaticamente quando tentamos acessar um método inacessível, ou que não existe, de um objeto.

Exemplo 5
//MinhaClasse.php
<?php
class MinhaClasse {
    public function __call(string $name, array $arguments)
    {
        echo "__call: ",$name,"\n"; //
        var_dump($arguments);
    }
}
?>
//main.php
<?php
    include("MinhaClasse.php");
    
    $obj = new MinhaClasse();
    $obj->metodo1(); //sem argumento
    $obj->metodo1(1,"string"); //com argumento
?>
Saída
__call: metodo1
array(0) {
}
__call: metodo1
array(2) {
  [0]=>
  int(1)
  [1]=>
  string(6) "string"
}

Implementando o método __call, esse servirá de ponte para a execução da chamada de outros métodos com diferentes números de argumentos.

Os métodos para a simulação da sobrecarga devem ser declarados com o modificador de acesso private para que nenhuma classe possa acessá-los.

Com auxílio das funções array_keys e também count podemos trabalhar com os argumentos passados para o métodos __call.

Sintaxe
array_keys(array $array): array
Sintaxe
count(Countable|array $value, int $mode = COUNT_NORMAL): int
Exemplo 6
//MinhaClasse.php
<?php
class MinhaClasse
{
	private function metodo1() {
		echo "metodo1() invocado.","\n";
	}

	private function metodo2($param) {
		echo "metodo2() invocado.","\n";
		echo "  param: \"$param\"";
	}

	//mC)todo usado como ponte para "sobrecarga"
	public function __call($name, $arguments)
	{
		$chaves = array_keys($arguments); //array de argumentos
		$args = count($arguments); //nC:mero de argumentos passados
        
		if ($name == "metodo1")
		{
			if($args == 0)
				$this->metodo1();

			if($args > 0)
				$this->metodo2($arguments[$chaves[0]]);
		}
	}
}?>
//main.php
<?php
    include("MinhaClasse.php");
    
    $obj = new MinhaClasse();
    $obj->metodo1(); //método1
    $obj->metodo1("string"); //método2 indiretamente
?>
Saída
metodo1() invocado.
metodo2() invocado.
  param: "string"

O exemplo 6 acima foi feito apenas como caracter ilustrativo da simulação de sobrecarga discutida, não sendo uma solução final.

  1. 26/08/2025 - revisão 4 - Ajustes: pontuais, objetivos, Ex. 6 e sintaxes;
  2. 20/09/2024 - revisão 2 - Correção em 'construtor com parâmetros', sintaxes 'get/set'; ajustes gramaticais e outros
  3. 05/02/2024 - revisão 1 - correção em navegação e erros gramaticais
  4. 20/09/2023 - versão inicial