PHP  
downloads | documentation | faq | getting help | | php.net sites | links 
search for in the  
previousob_startoverloadnext
Last updated: Tue, 11 Jun 2002
view this page in Printer friendly version | English | Brazilian Portuguese | Czech | Dutch | Finnish | German | Hungarian | Italian | Japanese | Korean | Polish | Romanian | Russian | Spanish | Turkish

LXXIV. Overload

Avertissement

Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et concr�tement, TOUT ce qui est document� ici peut changer dans un futur proche, SANS PREAVIS! Soyez-en conscient, et utiliser ce module � vos risques et p�rils.

Le but de cette extension est de permettre de ma�triser les appels aux m�thodes et aux membres d'un objet. Seule une fonction est d�finie dans cette extension, overload() qui demande le nom de la classe qui supporte cet fonctionnalit�. Cette classe doit �tre pourvue des m�thodes n�cessaire au bon fonctionnement de l'extension, c'est � dire : __get(), __set() et __call(), qui servent respectivement � lire et modifier un membre, et appeler une m�thode. De cette mani�re, l'overloading assure un contr�le sur les fonctions appel�es. A l'int�rieur de ces m�thodes, l'overloading est d�sactiv�, pour que vous puissiez acc�der � l'objet.

Voici un exemple simple de fonctions utilisant overload() :

Exemple 1. Overload avec une classe PHP

<?php

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

    // Fonction de callback pour la lecture de membre
    function __get($prop_name, &$prop_value)
    {
        if (isset($this->elem[$prop_name])) {
            $prop_value = $this->elem[$prop_name];
            return true;
        } else {
            return false;
        }
    }

    // Fonction de callback pour l'&eacute;criture de membre
    function __set($prop_name, $prop_value)
    {
        $this->elem[$prop_name] = $prop_value;
        return true;
    }
}

// Ici, l'initiation de l'overload
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:

// ajouter une nouvelle valeur au membre $elem, en programmation OOP
$o->x = 56; 

// instantiation de la classe stdclass (elle existe par d&eacute;faut en PHP 4)
// $val n'est pas overload&eacute;e!
$val = new stdclass;
$val->prop = 555;

// Forcez "a" &agrave; &ecirc;tre un tableau avec l'&eacute;l&eacute;ment $val
// Mais _set() forcera cet &eacute;l&eacute;ment dans le tableau $elem
$o->a = array($val);
var_dump($o->a[0]->prop);

?>

Avertissement

Comme c'est une extension exp�rimentale, tout ne fonctionne pas encore. Il n'y a pas de support pour __call() actuellement, et nouvs ne pouvez overloader que des accesseurs. Vous ne pouvez pas appeler les fonctions d'overload de la classe, et __set() ne fonctionne que pour un seul niveau d'accesseur.

Table des mati�res
overload -- Active la couche de contr�le des membres et m�thodes
User Contributed Notes
Overload
add a note about notes

20-Jan-2002 07:33

I think that object references should be implicit when using objects.

---
$my_object->child = $other_object;

$foo              = $my_object->child;

$my_object->bar ( $other_object );
---

would be more interesting than

---
$my_object->child =& $other_object;

$foo =& $my_object->child;

class MyClass
{
 ...

 function bar ( &$object ) {...}

 ...
};
---

__get, __set and __call will probably introduce a solution to this
problem.

class MyClass
{

    /**
     * When accessing a class member, we return a reference
     * to the member if it's an object. Else, we return a
     * copy.
     */
    function __get ($var_name, &$return)
    {
        if ( is_object($this->$var_name) )
        {
            $return =& $this->$var_name;
        }
        else
        {
            $return = $this->$var_name;
        }
        return true;
    }

    /**
     * It seems that "__set()" does not take a reference to a
     * variable as second parameter (cf: overload() example).
     * But if &$value is possible, the following code should
     * work.
     */
    function __set ($var_name, &$value )
    {
        if ( is_object($value) )
        {
            $this->$var_name =& $value;
        }
        else
        {
            $this->$var_name = $value;
        }
        return true;
    }

};

overload ("MyClass");

The __call() method should also give a way to get parameters' references
if they are objects.

The problem :

$foo = $my_object->foo;

$foo is not a reference to $my_object->foo;

If the right member of the '=' sign is a reference, it would be great if
'=' do the same job as '=&'.

ben at dubuque365 dot com
13-Jun-2002 04:06

The docs don't say this yet, probably because it goes without saying, but
if you want to try this extension you have to add
"--enable-overload" to your configure args.

If you've got the time, please help test this extension. Even without
__call, the benefits of this extension are huge. PHP class designers can
finally control how class properties are accessed and modified. 

One thing you may want to note is that the __get and __set methods won't
be called if the named property is already defined within the object.

It looks like Andrei decided this after he wrote the documentation. This
means that part of the example above is no longer correct. It should
actually read:

print: $o->a: 111

01-Jul-2002 07:00
mmmmmmmmmmm mmmmmmmmmmmmmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm
mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm
mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm
mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm
mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm mmmmmmmmmmm

add a note about notes
previousob_startoverloadnext
Last updated: Tue, 11 Jun 2002
show source | credits | stats | mirror sites:  
Copyright © 2001, 2002 The PHP Group
All rights reserved.
This mirror generously provided by:
Last updated: Mon Jul 8 12:18:18 2002 CEST