LXXV. Object property and method call overloading

Atenção

Este módulo é EXPERIMENTAL. Isso quer dizer que o comportamento destas funções e seus nomes, incluindo TUDO o que está documentado aqui pode mudar em futuras versões do PHP, SEM QUALQUER NOTIFICAÇÃO. Esteja avisado, e use este módulo por sua própria conta e risco.

O propósito desta extensão é permitir overload de propriedades de acesso e metodos de objetos. Somente uma função é definida nesta extensão, overload() que recebe o nome da classe que deve ter esta funcionalidade habilitada. A classe especificada tem que definir os metodos para ter esta funcionalidade: __get(), __set() and __call() respectivamente para get/set as propriedades, ou chamar um metodo. Desta forma o overloading pode ser seletivo. Dentro destas funções o overloading é disabilitado de forma que você possa acessar propriedades do objeto normalmente.

Alguns exemplos simples da utilização da função overload()

Exemplo 1. Overload de uma classe no PHP

<?php

class OO
{
    var $a = 111;
    var $elem = array('b' => 9, 'c' => 42);

    // Metodo callback para pegar uma propriedade
    function __get($prop_name, &$prop_value)
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // Metodo callback para definir uma propriedade
    function __set($prop_name, $prop_value)
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }
}

// Aqui nós é feito o overload do objeto OO
overload('OO');

$o = new OO;
print "\$o->a: $o->a\n"; // print: $o->a:
print "\$o->b: $o->b\n"; // print: $o->b: 9
print "\$o->c: $o->c\n"; // print: $o->c: 42
print "\$o->d: $o->d\n"; // print: $o->d:

// adicionar um novo intem para o array $elem em OO
$o->x = 56; 

// iniciar stdclass (é integrada no PHP 4)
// $var não é overloaded!
$val = new stdclass;
$val->prop = 555;

// Que "a" seja um array com o objeto $val dentro dele
// mas __set() o colocará no array $elem
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

Atenção

Como esta é uma extensão experimental, nem todas as coisas funcionam. Não existe ainda suporte para __call() e você somente pode fazer overload das operações get e set para propriedades. Você não pode invocar as chamadas originais da classe (antes de terem sido overloaded), e __set() somente funciona até um nível de acesso de propriedades.

Índice
overload --  Habilitar overloading de chamadas de propriedade e metodo para classes