Вы $bar
экземпляр, внутри Foo, не можете узнать, что это за класс; так что нельзя вызывать какой-либо метод этого метода.
(Ну, может быть (возможно, не) работа с Reflection ... Я должен попробовать это однажды ^^)
РЕДАКТИРОВАТЬ: немного подумать об этом: вы можете, внутри вашего класса bar, держать указатель на foo; примерно так:
class foo {
var $bar;
function __construct() {
var_dump("Foo Exists!");
}
function magic_bullet($id) {
var_dump('magic_bullet : ' . $id);
switch($id) {
case 1:
var_dump("There is no spoon! ");
case 2:
var_dump("Or is there... ");
break;
}
}
}
class bar {
protected $pointer_to_foo;
function __construct($pointer_to_foo) {
var_dump("Bar exists");
$this->pointer_to_foo = $pointer_to_foo;
}
function target($id) {
var_dump("I want a magic bullet for this ID!");
if (method_exists($this->pointer_to_foo, 'magic_bullet')) {
$this->pointer_to_foo->magic_bullet($id);
}
}
}
$test = new foo();
$test->bar = new bar($test);
$test->bar->target(42);
Обратите внимание, что я использовал method_exists
в качестве меры безопасности.
И вы получите:
string 'Foo Exists!' (length=11)
string 'Bar exists' (length=10)
string 'I want a magic bullet for this ID!' (length=34)
string 'magic_bullet : 42' (length=17)
Итак, это можно сделать ... Если вы немного измените свой код; -)
Редактировать 2: хо, зомбат бить меня, кажется: - (