Métodos encadeados em PHP

Gustavo Paes, 02/04/2010

O termo métodos encadeados é usado quando você chama um método após o outro sem a necessidade da variável de instância do objeto. Veja o exemplo abaixo, do framework CodeIgniter:

$this->db->select("title")->from("mytable")->where("id", $id)->limit(10, 20);

Criando um método encadeado

Criar um método que permite a chamada de outro método é muito simples. O retorno dele deve ser a referência à instância, ou seja, $this;. A classe abaixo demonstra dois métodos que permitem ser encadeados.

<php
class Calculadora {
    private $valor = 0;

    public function Calculadora($init = 0) {
        $this->valor = $init;
    }

    public function soma($valor = 0) {
        $this->valor += $valor;
        return $this;
    }

    public function subtrai($valor = 0) {
        $this->valor -= $valor;
        return $this;
    }

    public function getValor() {
        return $this->valor;
    }
}

// Exemplo de uso
$calculadora = new Calculadora(10);
$calculadora->soma(5)->subtrai(3)->soma(10);

echo $calculadora->getValor(); // 22
?>

Algumas considerações

Nem todos os métodos devem permitir ser encadeados, até porque alguns devem retornar de fato algum valor ou estado, como no exemplo acima onde getValor retora o valor atual da calculadora.

É importante que os métodos que executam rotinas retornem true ou false ou que seja possível obter o status da última execução através de algum outro método. Sem isso pode ficar difícil saber o que foi executado e realizado com sucesso ou onde ocorreu o erro — em qual dos métodos.