oop — Разница между расширением класса и созданием экземпляра в другом классе в переполнении стека

Первый файл:

class Class_one {

public function __construct() {

}

public function show_name() {
echo "My Name is Siam";
}

public function show_class() {
echo "I read in class 7";
}

}

Второй файл:

<?php

require_once './Class_one.php';

class Class_two {

public $class_one;

public function __construct() {
$aa = new Class_one();
$this->class_one = $aa;
}

public function history() {
$this->class_one->show_name();
}

}

$ab = new Class_two();
$ab->history();

Что произойдет, если я не буду создавать экземпляр class_one в class_two и расширять class_one в class_two? Есть ли разница?

2

Решение

Здесь есть только одна потенциальная ошибка: Class_two не будет иметь прямого доступа к Class_one закрытые / защищенные методы и переменные. Это может быть хорошо (инкапсуляция — это когда класс выполняет какую-то конкретную задачу, и вы не хотите, чтобы дети вмешивались в нее), но это также может означать, что вы не можете получить нужные данные.

Я бы предложил вам сделать Class_two как внедрение зависимости (как показано в вашем примере), однако

class Class_two {

public $class_one;

public function __construct(Class_one $class) {
$this->class_one = $class;
}
}
1

Другие решения

Должна быть семантическая разница:

  • Вы используете наследование, когда отношения между двумя классами могут быть выражены быть глагол. Например: Мой форд это Автомобиль
  • Вы используете ассоциацию / композицию, когда отношения между двумя классами могут быть выражены иметь глагол. Например: Моя машина имеет двигатель.

Выше правила должны быть первыми соображениями при выборе наследования или ассоциации в объектно-ориентированном программировании. Всегда говорили о том, как избежать наследования, и некоторые утверждают, что вам следует выбирать композицию вместо наследования. Смотрите этот другой Q&A: Предпочитаете композицию наследству?

С точки зрения чистого кодирования, как @Mavavity на его ответ Я уже говорил, что могут быть ограничения доступности при использовании композиции вместо наследования, но я бы не решил, какой подход использовать на основе доступности члена.

0

По вопросам рекламы [email protected]