В чем разница между расширением класса и включением его в PHP? - PullRequest
6 голосов
/ 09 июня 2009

Может кто-нибудь объяснить мне, в чем разница между

include_once 'classb.php'
class A
{
     $a = new B
}

и

class A extends B
{
     $a = new B
}

есть

Какие преимущества / недостатки существуют в расширении класса по сравнению с включением файла .php?

Ответы [ 4 ]

8 голосов
/ 09 июня 2009

Ваш include_once читает в исходном файле, который в этом случае предположительно содержит определение класса для B. Ваш extends устанавливает класс A как , наследующий class B, т.е. A получает все в B и может затем определять свои собственные модификации этой базовой структуры. Между этими двумя операциями вообще нет никакой связи, и ваши $a = new B операции бессмысленны (не говоря уже о синтаксических ошибках).

6 голосов
/ 09 июня 2009

Если вы ищете ответ более высокого уровня ...

Использование extends привязывает A к действиям, аналогичным B, тогда как создание экземпляра B в A не накладывает никаких ограничений на A.

Второй подход называется Композицией и обычно является предпочтительным подходом к построению ОО-систем, поскольку он не дает высоких иерархий классов и является более гибким в долгосрочной перспективе. Это, однако, дает немного более медленный код, и больше, чем простое использование extends.

Мои 2 цента

2 голосов
/ 01 мая 2011

секунда, т.е. расширение, - это операция класса. Во-первых, то есть include - это файловая операция (перед компиляцией).

Итак, секунда невозможна никогда. без первого.

1 голос
/ 09 июня 2009

Прежде всего, include - это команда, которая читает исходный файл php и обрабатывает его так, как он был написан вместо директивы include. Вы можете использовать его в любом исходном файле php и не связано с наследованием класса.

Кстати, если вы не включите файл, содержащий исходный код класса А., вы не сможете расширить этот класс.

Расширение класса с помощью ключевого слова расширение подразумевает концепцию наследования, которая является ключевой концепцией в объектно-ориентированном программировании.

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

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

В википедии вы можете найти более подробное объяснение состав объекта и [наследование классов] (http://en.wikipedia.org/wiki/Inheritance_(computer_science))

Кажется, в этих понятиях есть небольшая путаница, поскольку вы расширяете свой класс A и одновременно пытаетесь его составить (кстати, правильный синтаксис: $ a = new B ( ). )

Полезная ссылка это, очевидно, [Gof, Design pattern] (http://en.wikipedia.org/wiki/Design_Patterns_(book))

...