XCII. Przeciążanie właściwości obiektów i wołania ich metod

Wstęp

Celem tego rozszerzenia jest umożliwienie przeciążania dostępu do właściwości obiektów oraz wołania metod. Rozszerzenie to definiuje tylko jedną funkcję, overload(), która przyjmuje jako parametr nazwę klasy dla której przeciążanie powinno być udostępnione. Klasa ta powinna mieć zdefiniowane odpowiednie metody, jeżeli chce korzystać z tej dodatkowej funkcjonalności: __get(), __set() oraz __call() odpowwiednio dla pobierania/ustawiania wartości właściwości, lub wołania metod. Tym sposobem przeciążanie może być dostępne wybiórczo. Wewnątrz tych funkcji bsługujących przeciążanie, ono samo jest niedostępne by mieć możliwość normalnego dostępu do właściwości obiektu.

Ostrzeżenie

Ten moduł jest w stadium EKSPERYMENTALNYM. Oznacza to, że zachowanie tych funkcji, ich nazwy, w zasadzie wszystko udokumentowane tutaj może zostać zmienione w przyszłych wersjach PHP bez wcześniejszego uprzedzenia. Używaj tego modułu na własne ryzyko.

Wymagania

Do zbudowania tego rozszerzenia nie są wymagane żadne zewnętrzne biblioteki.

Instalacja

Chcąc używać tych funkcji musisz skompilować PHP z opcją --enable-overload. Od PHP 4.3.0 to rozszerzenie jest włączone domyślnie. Możesz wyłączyć wsparcie dla przeciążania opcją --disable--overload.

PHP w wersji dla systemów Windows posiada wbudowaną obsługę dla tego rozszerzenia. Nie trzeba ładować żadnych dodatkowych rozszerzeń aby korzystać z tych funkcji.

Notatka: Wsparcie dla przeciążania jest wbudowane od wersji PHP 4.3.0.

Konfiguracja czasu wykonywania

To rozszerzenie nie definiuje posiada żadnych dyrektyw konfiguracyjnych w pliku php.ini.

Typy zasobów

To rozszerzenie nie posiada żadnych rodzajów zasobów.

Stałe predefinopwane

To rozszerzenie nie posiada żadnych stałych.

Przykłady

Kilka prostych przykładów demonstrujących użycie funkcji overload():

Przykład 1. Przeciążanie klasy PHP

<?php

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

    
// Funkcja obsługująca pobierania właściwości
    
function __get($wl_nazwa, &$wl_wart)
    {
        if (isset(
$this->elem[$wl_nazwa])) {
            
$wl_wart = $this->elem[$wl_nazwa];
            return
true;
        } else {
            return
false;
        }
    }

    
// Funkcja obsługująca ustawianie właściwości
    
function __set($wl_nazwa, $wl_wart)
    {
        
$this->elem[$wl_nazwa] = $wl_wart;
        return
true;
    }
}

// Umożliwiamy przeciążanie obiektów klasy 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:

// dodajemy nową pozycję do tablicy $elem w OO
$o->x = 56;

// tworzymy egzemplarz klasy stdclass (wbudowanej w PHP 4)
// $val nie jest przeciążane!
$val = new stdclass;
$val->prop = 555;

// Ustawiamy "a" jako tablicę z obiektem $val w środku
// Lecz __set() włoży to do tablicy $elem
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

Ostrzeżenie

Ponieważ jest to rozszerzenie eksperymentalne, nie wszystko działa. Brakuje aktualnie wsparcia dla __call(), można przeciążać tylko operacje pobierania i ustawiania właściwości obiektu. Nie można także wołać funkcji obsługi przeciążania jak normalnych metod istniejących w klasie, a __set() działa tylko do jednego poziomu dostępu do właściwości.

Spis treści
overload -- Umożliwienie przeciążania właściwości i wołania metod dla klasy

Hosting by: Hurra Communications Sp. z o.o.
Generated: 2007-01-26 18:02:57