I had to fix someone else's php4 code to work under php5 that was b0rked due to aggregate not working, here's how I did it.
<?php
class shell { }
$classes = array("foo", "bar", "baz");
function php5aggregate($holdingClass, $className)
{
// use php5 reflection to suss out the method names for the given class
// http://uk.php.net/manual/en/language.oop5.reflection.php
$reflect = new ReflectionClass($className);
foreach ($reflect->getMethods() as $method)
{
// copy the method to $holdingClass
// http://www.php.net/manual/en/function.runkit-method-copy.php
runkit_method_copy($holdingClass, $method->getName(), $className);
}
}
if (version_compare(PHP_VERSION, '5.0.0') === 1)
{
/**
* aggregate() does not exist in php5, so use our custom function
* note, our custom aggregate function takes the holding class *name*
* which is instantiated afterwards, this is different to how the php4 function works
*/
foreach($classes as $value)
{
php5aggregate("shell",$value);
}
$shell = new shell;
}
else
{
// php4
$shell = new shell;
foreach($classes as $value)
{
aggregate($shell,$value);
}
}
?>
aggregate
(PHP 4 >= 4.2.0)
aggregate — メソッドおよびプロパティの動的なクラス/オブジェクト集約を行う
説明
void aggregate
( object
$object
, string $class_name
)既存のオブジェクトにあるクラスで定義されたメソッドとプロパティを集約します。 アンダースコア文字 (_) で始まるメソッドとプロパティは、 集約されたクラスではプライベートとみなされ、使用されません。 コンストラクタも集約処理から除外されます。
パラメータ
-
object -
-
class_name -
返り値
値を返しません。
参考
- aggregate_info() - 指定したオブジェクトの集約情報を取得する
- aggregate_methods() - クラスのメソッドを、動的にオブジェクトに集約する
- aggregate_methods_by_list() - 選択したクラスメソッドを、動的にオブジェクトに集約する
- aggregate_methods_by_regexp() - 正規表現を使用して選択したクラスメソッドを、 動的にオブジェクトに集約する
- aggregate_properties() - クラスのプロパティを、動的にオブジェクトに集約する
- aggregate_properties_by_list() - 選択したクラスプロパティを、動的にオブジェクトに集約する
- aggregate_properties_by_regexp() - 正規表現を使用して選択したクラスプロパティを、 動的にオブジェクトに集約する
- deaggregate() - 集約されたメソッドやプロパティをオブジェクトから取り除く
mail at bealers dot com
20-Nov-2008 03:14
kencomer at NOSPAM dot kencomer dot com
11-Sep-2005 03:22
For PHP5 applications, the aggregate functionality available through classkit has been incorporated into and replaced by runkit. Per the classkit page of the PHP manual:
"Note: This extension has been replaced by runkit, which is not limited to class manipulation but has function manipulation, as well."
http://php.net/manual/en/ref.runkit.php
Per the runkit page:
" This package is meant as a feature added replacement for the classkit package. When compiled with the --enable-runkit=classkit option to ./configure, it will export classkit compatible function definitions and constants."
Matt Barry
28-Mar-2005 05:02
A note for those who may be implementing projects in PHP4 using aggregate(); these functions do not exist in PHP5. For similar functionality, you can try using the Classkit extension:
http://us2.php.net/manual/en/ref.classkit.php
gmail pfayolle
07-Jan-2005 05:16
Note that even if this can be used to emulate multiple inheritance to some extent, an object in PHP can only be subclass of the class used in the class declaration and no other.
<?php
class A {}
class B {}
class C extends A
{
function C()
{
aggregate($this, 'B'); // emulate multiple inheritance
}
}
$c = new C;
echo (int)is_subclass_of($c, 'B');
/*
Output: 0
*/
?>
hewei at ied dot org dot cn
01-Mar-2003 08:34
YES you can use aggregation functions to simulate multiple inheritence.
function foo()
{
aggregate($this, "bar");
bar::bar();
}
