Sobrecarga em PHP fornece a capacidade de adicionar membros do objeto em tempo de execução. Isto é feito com a implementação de classe com métodos sobrecarregados __get, __set, __calland __callStatic. Tenha em mente que o significado de uma sobrecarga no PHP é diferente de muitas outras linguagens de programação.

Sobrecarga de propriedade

Os métodos __get e __set fornecem uma maneira conveniente de implementar métodos getter e setter, que são métodos que são usados ​​frequentemente para ler e escrever para propriedades com segurança. Estes métodos sobrecarregados são usados quando as propriedades que são invocadas são inacessíveis, seja porque não são definidas na classe ou porque não estão disponíveis a partir do escopo atual. No exemplo abaixo, o método __set acrescenta quaisquer propriedades inacessíveis ao array $data e __get recupera com segurança os elementos.

class MyProperties
{
    private $data = array();
    public function __set($name, $value)
    {
        $this->data[$name] = $value;
    }
    public function __get($name)
    {
        if (array_key_exists($name, $this->data))
        return $this->data[$name];
    }
}

Ao definir o valor de uma propriedade inacessível, __set é chamado com o nome da propriedade e o valor como seus argumentos. Da mesma forma, ao acessar uma propriedade inacessível, __get é chamado com o nome da propriedade como seu argumento.

$obj = new MyProperties();
$obj->a = 1; // chamado __set
echo $obj->a; // chamado __get

Sobrecarga de método

Existem dois métodos para lidar com chamadas a métodos inacessíveis de uma classe – __call e __callStatic. O método __call é invocado para chamadas de método de instância.

class MyClass
{
    public function __call($name, $args)
    {
        echo "Calling $name $args[0]";
    }
}
// "Chamando myTest no contexto do objeto"
(new MyClass())->myTest('in object context');

O primeiro argumento para __call é o nome do método que está sendo chamado, e a segunda é uma matriz numérica que contém os parâmetros passados ​​para o método. Esses argumentos são os mesmos para o método __callStatic, que lida com chamadas para métodos estáticos inacessíveis.

class MyClass
{
    public static function __callStatic($name, $args)
    {  
         echo "Calling $name $args[0]";
    }
}
// "Chamando myTest no contexto estático"
MyClass::myTest('in static context');

Isset e sobrecarga unset

Uma função isset, empty e unset só irá funcionar em propriedades definidas explicitamente, e não nos sobrecarregados. Esta funcionalidade pode ser adicionado a uma classe, sobrecarregando os métodos __isset e __unset.

class MyClass
{
    private $data = array();
    public function __set($name, $value) { 
        $this->data[$name] = $value;
    }
    public function __get($name) {
        if (array_key_exists($name, $this->data))
        return $this->data[$name];
    }
    public function __isset($name) {
        return isset($this->data[$name]);
    }
    public function __unset($name) {
        unset( $this->data[$name] );
    }
}

O método __isset será chamado quando isset é chamado em uma propriedade inacessível.

$obj = new MyClass();
$obj->name = "Joe";
isset($obj->name); // true
isset($obj->age); // false

Quando unset é chamado em uma propriedade inacessível o método __unset tratará
essa chamada.

unset($obj->name); // delete property
isset($obj->name); // false

O empty só irá funcionar em propriedades sobrecarregados se ambos __isset e __get estão aplicados. Se o resultado de __isset é false a função empty retornará true. Se, por outro lado __isset retorna true, em seguida, recuperar empty pode com a propriedade __get e avaliar se ela tem um valor considerado vazio.

empty($obj->name); // false
empty($obj->age); // true

No Manual do PHP.net

http://php.net/manual/pt_BR/language.oop5.overloading.php

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.