mirror of
https://github.com/php/php-src.git
synced 2024-11-28 20:34:29 +08:00
108 lines
2.3 KiB
Plaintext
108 lines
2.3 KiB
Plaintext
Title: Delegation
|
|
(a/k/a. Object-Based Inheritance)
|
|
Version: $Revision$
|
|
Status: draft
|
|
Maintainer: Sebastian Bergmann <sb@sebastian-bergmann.de>
|
|
|
|
|
|
Dynamic Delegation
|
|
|
|
Syntax / Example
|
|
|
|
<?php
|
|
class aDelegatee {
|
|
function doSomething() {
|
|
echo 'hubu';
|
|
}
|
|
}
|
|
|
|
class anotherDelegatee {
|
|
function doSomething() {
|
|
echo 'tubu';
|
|
}
|
|
}
|
|
|
|
class Foo {
|
|
delegatee $bar;
|
|
|
|
function setDelegatee($delegatee) {
|
|
$this->delegatee = $delegatee;
|
|
}
|
|
}
|
|
|
|
$foo = new Foo;
|
|
|
|
$foo->setDelegatee(new aDelegatee);
|
|
$foo->doSomething(); /* prints "hubu" */
|
|
|
|
$foo->setDelegatee(new anotherDelegatee);
|
|
$foo->doSomething(); /* prints "tubu" */
|
|
?>
|
|
|
|
Semantics / Synopsis
|
|
|
|
The "Foo" class may use all methods available in "$bar" as if they
|
|
where locally defined or inherited from a superclass. The essential
|
|
difference is that by assigning another object to "$bar" it is
|
|
possible to dynamically switch between different implementations for
|
|
these methods.
|
|
|
|
|
|
Fixed Delegation
|
|
|
|
Syntax / Example
|
|
|
|
<?php
|
|
class aDelegatee {
|
|
function doSomething() {
|
|
echo 'hubu';
|
|
}
|
|
}
|
|
|
|
class Foo {
|
|
final delegatee $bar = new aDelegatee;
|
|
}
|
|
|
|
$foo = new Foo;
|
|
|
|
$foo->doSomething(); /* prints "hubu" */
|
|
?>
|
|
|
|
Semantics / Synopsis
|
|
|
|
The "Foo" class may use all methods available in "$bar" as if they
|
|
where locally defined or inherited from a superclass. The difference
|
|
to the dynamic delegation is that once the delegatee object is set,
|
|
it cannot be changed.
|
|
|
|
|
|
Default Delegation
|
|
|
|
Syntax / Example
|
|
|
|
<?php
|
|
class Foo {
|
|
function __delegate($name, $parameters = array()) {
|
|
echo $name;
|
|
}
|
|
}
|
|
|
|
$foo = new Foo;
|
|
$foo->bar(); /* prints "bar" */
|
|
?>
|
|
|
|
Semantics / Synopsis
|
|
|
|
If a class has a __delegate() method, it is called whenever a
|
|
method on an object of this class is called that is
|
|
|
|
* Not defined in the class.
|
|
|
|
* Not provided by a delegatee object.
|
|
|
|
The __delegate() method is called with the name and parameters
|
|
of the method call.
|
|
|
|
This supersedes / obsoletes similar functionality introduced in
|
|
Zend Engine 1 by ext/overload.
|