views:

139

answers:

3

So I have two classes like this:

class foo {
    /* code here */
}
$foo = new foo();
class bar {
    global $foo;
    public function bar () {
        echo $foo->something();
    }
}

I want to access the methods of foo inside all methods bar, without declaring it in each method inside bar, like this:

class bar {
    public function bar () {
        global $foo;
        echo $foo->something();
    }
    public function barMethod () {
        global $foo;
        echo $foo->somethingElse();
    }
    /* etc */
}

I don't want to extend it, either. I tried using the var keyword, but it didn't seem to work. What do I do in order to access the other class "foo" inside all methods of bar?

+3  A: 

Make it a member of bar. Try to never use globals.

class bar {
    private $foo;

    public function __construct($foo) { $this->foo = $foo; }

    public function barMethod() {
        echo $this->foo->something();
    }
}
Tesserex
+1  A: 

You could do like this too:

class bar {
    private $foo = null;

    function __construct($foo_instance) {
      $this->foo = $foo_instance;
    }

    public function bar () {
        echo $this->foo->something();
    }
    public function barMethod () {
        echo $this->foo->somethingElse();
    }
    /* etc */
}

Later you could do:

$foo = new foo();
$bar = new bar($foo);
Sarfraz
Never thought about passing it as a parameter; it works now. Thanks!
arxanas
@arxanas: You are welcome :)
Sarfraz
FYI, that's known as Dependency Injection
John Conde
@John: it's too early to say someone about DI if he didn't even know about how to pass data through parameters.
zerkms
A: 

The short answer: nope, there is no way to implement what you want.

Another short answer: you're working with classes in "wrong" way. Once you selected Object Oriented paradigm - forget about "global" keyword.

The proper way of doing what you want is to create an instance of foo as member of bar and use it's methods. This is called delegation.

zerkms