Хранение объектов как переменных в классе PHP - PullRequest
0 голосов
/ 27 января 2010

Предположим, у вас есть несколько произвольных классов, как показано ниже:

class Foo
{
    $foovar;

    public function __construct()
    {
        $foovar = "Foo";
    }

    public function getFoo()
    {
        return($foovar);
    }
}

class Bar
{
    $F;

    public function __construct()
    {
        $F = new Foo();
    }
}

Мой вопрос: можно ли написать что-то вроде следующего

$B = new Bar();
echo($B->F->getFoo());

Как я уже говорил в своем предыдущем вопросе, я из сильного Java-фона знаю, что вы можете связать переменные вместе System.out.println() для вызова методов других объектов. Я хотел бы знать, возможно ли это в PHP

Ответы [ 6 ]

3 голосов
/ 27 января 2010

Да, вы абсолютно правы, смотрите этот пример.

class Foo {
 public function hello() {
  return 'hello world';
 }
}

class Bar {
 public $driver = NULL;

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

$test = new Bar;
echo $test->driver->hello();

Некоторые другие комментарии

return($foovar);
  • Парены здесь не нужны.
  • Вы должны использовать $this->foovar для работы с членами класса (кроме статических, в этом случае это self::$foovar

Членам класса также должен быть указан тип доступа, например public $foovar;.

Почему вы переходите с Java на PHP, я не знаю, но удачи:)

1 голос
/ 27 января 2010

Мало того, что это возможно, но это очень распространено.Один раз вы увидите, что он используется с делегированием .

1 голос
/ 27 января 2010

Это, безусловно, возможно.

0 голосов
/ 28 января 2010

Конечно, это возможно Это называется методы цепочки

// first clean your code 

class Foo
{
    public $foovar = NULL; 

    public function __construct()
    {
        $this->foovar = "Foo";
        return $this;
    }

    public function getFoo()
    {
        return $this->foovar;
    }
}

class Bar
{
    public $F = NULL;

    public function __construct()
    {
        $this->F = new Foo();
        return $this;
    }
}

$B  = new Bar(); // create the object. The constructor returns the whole object
// so we have full access to the methods
// firs call the object $B which return in the constructor $this so we call now 
// method F now the object F returns also in the constructor the whole object $this
// we now can access the method getFoo() which will print Foo
echo $B->F->getFoo();
0 голосов
/ 27 января 2010

Да, но с некоторым дополнительным синтаксисом. Я использовал методы getter, чтобы, надеюсь, немного лучше проиллюстрировать вещи, но они не нужны, если вы сделаете свои переменные в классе публичными.

<?php
class Foo
{
    private $foovar;

    public function __construct()
    {
        $this->foovar = "Foo";
    }

    public function getFooVar()
    {
        return $this->foovar;
    }
}

class Bar
{
    private $fooclass;

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

    public function getFoo()
    {
        return $this->fooclass;
    }
}


$bar = new Bar();
print $bar->getFoo()->getFooVar();
?>
0 голосов
/ 27 января 2010

Если $F в $B общедоступен или у вас есть метод __get($var) в баре, который готов вернуть $F, то $B->F->getFoo() работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...