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












