Начинающий ООП: classB расширяет classA. classA уже объект. нужен метод в классе B и т. д. - PullRequest
2 голосов
/ 17 марта 2010

Я учусь переходить от кодирования PHP на основе функций к ООП. И это ситуация:

ClassA содержит много основных методов (функций) инструмента. это __construct устанавливает соединение с БД. ClassB содержит определенные методы, основанные на определенной деятельности (извлечение виджетов). ClassB расширяет ClassA, потому что там используются некоторые основные инструменты, например, вызов базы данных.

В php-файле я создаю объект $a_class = new ClassA (таким образом, новое соединение с БД).

Теперь мне нужен метод в ClassB. Я делаю $b_class = new ClassB; и вызываю метод, который использует метод из его parent:: ClassA.

В этом примере у меня ClassA 'используется' дважды. Onces как объект и onces через вызов parent::, поэтому ClassA создает другое соединение с БД (или нет?).

Так, какова наилучшая настройка для этой базовой ситуации: родительская, дочерняя (расширенная) ситуация? Я хочу только одно соединение, конечно?

Мне не нравится пересылать объект в ClassB следующим образом: $ b_class = new ClassB ($ a_object); или это лучший способ?

Спасибо, что подумали со мной и помогли: d

Ответы [ 4 ]

1 голос
/ 17 марта 2010
$class_a = new ClassA();
$class_b = new ClassB($class_a);

class ClassB {
    private $class_a;

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

Если я правильно понял, что ты хотел сделать. Таким образом, вы можете использовать методы ClassA в каждом методе ClassB без дублирования соединения с базой данных.

1 голос
/ 17 марта 2010

Не похоже, что вам нужен экземпляр класса А. Убедитесь, что класс B действительно is класс A, прежде чем использовать такое наследование. Посмотрите на композицию, если вы не уверены.

1 голос
/ 17 марта 2010

Из того, что я понял в вашем описании, звучит так, что класс B не должен наследовать от класса A. Спросите себя - действительно ли B является "расширенной версией" A? Если нет, и B просто использует какую-то утилиту из A, он должен только вызывать для нее методы или, возможно, создавать ее (содержать в качестве переменной-члена).

Кроме того, я не думаю, что вам следует подключаться к базе данных в конструкторе A, если только вы не наделили какую-то защиту вокруг нее, чтобы предотвратить дублирование соединений. Вероятно, лучше иметь функции Connect () и Disconnect (), чтобы было понятно, когда вы подключены и не подключены.

0 голосов
/ 17 марта 2010

У вас может быть другой объект, который содержит соединение Db, к которому могут подключиться и класс A, и B. И это тот класс ответственности, чтобы сделать только одно соединение. Вы можете заглянуть в синглтон-паттер для этого

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