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