Доступ к классу, который был создан методом в отдельном классе - PullRequest
1 голос
/ 13 марта 2009

В двух словах: как получить доступ к методам класса, который создается методом другого класса?

Есть фрагмент кода, на который я сейчас смотрю, который выполняет следующее (кстати, изменение кода - это не вариант, кстати. Это не мое ... Я просто расшифровал его):

В классе есть метод, который создает экземпляр другого класса. Это выглядит примерно так:

// this file is named fooClassHere.php

class Foo{
    public $meh;

    function bar(){
        $something = new Baz;
        $this->meh = $something->getStuff();
    }
}

Я пытаюсь понять, как получить доступ к методам этого экземпляра класса Baz. Другая страница содержит что-то вроде следующего:

include 'bazClassHere.php';
include 'fooClassHere.php';

$a = new Foo;
$a->bar();

Так не должны ли теперь все Baz быть доступны каким-либо образом (и не только getStuff (), который я назначил для $ this-> meh)? Включены классы Foo и Baz, код создает экземпляр Foo, а затем вызывает метод Foo bar (), который, в свою очередь, создает экземпляр класса Baz. Очевидно, что в следующем примере будут отображаться данные, возвращаемые методом getStuff () Baz:

var_dump($a->meh);

Но я бы хотел получить доступ к всем доступных методов Baz, не проходя промежуточный этап их ручного назначения, как я делал внутри метода бара Foo:

$this->meh = $something->getStuff()

Может быть, что-то вроде (но, конечно, это не работает):

$a = new Foo;<br>
$a->bar();                 //instantiates Baz as $something
$a->something->fromBaz();  //$something is an instance of Baz, yes? No?

Надеюсь, это имеет смысл, и я не путал проблему с моими заметками. Ack! > _ <</p>

Ответы [ 2 ]

3 голосов
/ 13 марта 2009

Если изменить код нельзя, вам не повезло. Чтобы добиться того, что вы хотите, вы делаете это:

class Foo {
    public $meh;
    public $something;

    function bar(){
        $this->something = new Baz;
        $this->meh = $this->something->getStuff();
    }
}

А потом вы можете сделать:

$foo = new Foo;
$foo->something->myBazMethod();
1 голос
/ 13 марта 2009

Вы можете использовать __call в своем классе Foo, посмотрите его на php.net

По сути, __call вызывается при попытке вызвать функцию, которой у класса нет. Там вы можете вместо этого передать запрос своему внутреннему объекту.

class a
{
    protected $b;

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

    public function meh()
    {
        return 'meh';
    }

    public function __call($func, $param)
    {
        return call_user_func_array(array($this->b, $func), $param);
    }
}

class b
{
    public function yo($something)
    {
        return $something;
    }
}

$a = new a();
echo $a->meh();
echo $a->yo('dude!');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...