在
PHP中给出以下内容:
- <?PHP
- class foo {
- public $bar;
- function __construct() {
- "Foo Exists!";
- }
- function magic_bullet($id) {
- switch($id) {
- case 1:
- echo "There is no spoon! ";
- case 2:
- echo "Or is there... ";
- break;
- }
- }
- }
- class bar {
- function __construct() {
- echo "Bar exists";
- }
- function target($id) {
- echo "I want a magic bullet for this ID!";
- }
- }
- $test = new foo();
- $test->bar = new bar();
- $test->bar->target(42);
我想知道’bar’类是否可以调用’foo’类的’magic bullet’方法. ‘bar’实例包含在’foo’实例中,但与它没有父/子关系.实际上,我有很多不同的“条形”类,“foo”在一个数组中,每个类都有一些与$id不同的东西,然后想要将它传递给“magic_bullet”函数以获得最终结果,因此禁止结构更改类关系,是否可以访问“容器”实例的方法?
您必须修改代码才能提供关系.在OOP中,我们称之为
aggregation.
假设PHP 4,以及“一系列条形图”的想法
- <?PHP
- class foo {
- var $bars = array();
- function __construct() {
- "Foo Exists!";
- }
- function magic_bullet($id) {
- switch($id) {
- case 1:
- echo "There is no spoon! ";
- case 2:
- echo "Or is there... ";
- break;
- }
- }
- function addBar( &$bar )
- {
- $bar->setFoo( $this );
- $this->bars[] = &$bar;
- }
- }
- class bar {
- var $foo;
- function __construct() {
- echo "Bar exists";
- }
- function target($id){
- if ( isset( $this->foo ) )
- {
- echo $this->foo->magic_bullet( $id );
- } else {
- trigger_error( 'There is no foo!',E_USER_ERROR );
- }
- }
- function setFoo( &$foo )
- {
- $this->foo = &$foo;
- }
- }
- $test = new foo();
- $bar1 = new bar();
- $bar2 = new bar();
- $test->addBar( $bar1 );
- $test->addBar( $bar2 );
- $bar1->target( 1 );
- $bar1->target( 2 );