Справочник и перезапись - PullRequest
1 голос
/ 29 ноября 2009

у меня есть:

class A{

    public $name = 'A';
    public $B;

    public function B_into_A($b)
    {
        $this->B = $b;
    }
}

class B{

    public $name = 'B';
    public $A;

    public function new_A_into_B($a)
    {
        $this->A = new $a;
    }
}

$a = new A;
$b = new B;
$a->B_into_A($b);
$b->new_A_into_B('A');

Является ли это хорошим способом вставить другой класс в «основной» класс в начале выполнения? Должен ли я использовать ссылки?

(Справочная информация: в настоящее время я работаю над платформой MVC, в которой мне приходится обрабатывать многие классы в некоторых основных классах, например, загрузчик, упаковщик, модули, адаптер и т. Д.)

Ответы [ 2 ]

2 голосов
/ 29 ноября 2009

Да и нет ...

Ваш первый вызов функции был в порядке, я бы просто использовал более стандартное имя:

$a = new A;
$b = new B;
$a->setB($b); // B_into_A is a little bit of a whacky function name

Ваш второй вызов, на самом деле не имеет смысла передавать строку и затем создавать объект (если вы не ищете какой-то factory ). Если вы хотите, чтобы B владел A:

$b->new_A_into_B( new A );

public function new_A_into_B($a)
{
    $this->A = $a;
}

Опять же, мне не нравится это имя. Я бы, наверное, тоже добавил туда setA().

1 голос
/ 29 ноября 2009

Передача объекта вместо имени класса имеет смысл, потому что тогда сборщику мусора будет легче угадать, когда он больше не нужен.

<?php

class A {
    public $B;
}

class B {
    public $A;
}

$a = new A;
$b = new B;

$a->B = $a;
$b->A = $b;

Кроме того, я бы попытался избавиться от него.методы установки.На практике единственное преимущество, которое они предоставляют, заключается в проверке входных данных.Поскольку здесь дело не в этом, я бы посоветовал вам напрямую назначать классы.

Вы спросили: «Должен ли я использовать ссылки?».На самом деле все объекты передаются по ссылке начиная с PHP5.Единственный способ получить их точную копию - использовать ключевое слово clone .

Кстати, вам не нужно хранить имя класса в каждом объекте.Просто используйте get_class ().

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