Первый файл:
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? Есть ли разница?
Здесь есть только одна потенциальная ошибка: Class_two
не будет иметь прямого доступа к Class_one
закрытые / защищенные методы и переменные. Это может быть хорошо (инкапсуляция — это когда класс выполняет какую-то конкретную задачу, и вы не хотите, чтобы дети вмешивались в нее), но это также может означать, что вы не можете получить нужные данные.
Я бы предложил вам сделать Class_two
как внедрение зависимости (как показано в вашем примере), однако
class Class_two {
public $class_one;
public function __construct(Class_one $class) {
$this->class_one = $class;
}
}
Должна быть семантическая разница:
Выше правила должны быть первыми соображениями при выборе наследования или ассоциации в объектно-ориентированном программировании. Всегда говорили о том, как избежать наследования, и некоторые утверждают, что вам следует выбирать композицию вместо наследования. Смотрите этот другой Q&A: Предпочитаете композицию наследству?
С точки зрения чистого кодирования, как @Mavavity на его ответ Я уже говорил, что могут быть ограничения доступности при использовании композиции вместо наследования, но я бы не решил, какой подход использовать на основе доступности члена.