Вы можете использовать следующий процесс для устранения большинства проблем с инициализацией, связанных с базой данных. Обратите внимание, что любые данные в эмуляторе в настоящее время будут потеряны.
Удалите экземпляр SQL:
sqllocaldb stop MSSQLLocalDB
sqllocaldb delete MSSQLLocalDB
Теперь удалите следующие файлы базы данных:
%USERPROFILE%\AzureStorageEmulatorDb*.mdf
%USERPROFILE%\AzureStorageEmulatorDb*.ldf
Наконец, заново создайте экземпляр SQL:
sqllocaldb start MSSQLLocalDB
Затем повторите попытку эмулятора init.
Ваш include_once
читает в исходном файле, который в этом случае предположительно содержит определение класса для B
. Ваш extends
устанавливает класс A
как , наследующий класс B
, то есть A
получает все в B
и затем может определять свои собственные модификации этой базовой структуры. На самом деле между этими двумя операциями нет никакой связи, и ваши $ a = new B
операции бессмысленны (не говоря уже о синтаксических ошибках).
Если вы ищете ответ более высокого уровня ...
Использование extends привязывает A к действиям, аналогичным B, тогда как создание экземпляра B внутри A не налагает любые ограничения на A.
Второй подход называется компоновкой и обычно является предпочтительным подходом к построению объектно-ориентированных систем, поскольку он не дает высоких иерархий классов и является более гибким в долгосрочной перспективе. Однако он дает немного более медленный код, и его больше, чем простое использование расширений.
Мои 2 цента
Прежде всего, include - это команда, которая читает исходный файл php и обрабатывает его в том виде, в каком он был написан, вместо директивы include. Вы можете использовать его в любом исходном файле php и не имеет отношения к наследованию классов.
Между прочим, если вы не включите файл, содержащий исходный код класса A, вы не сможете расширить этот класс.
Расширение класса с ключевым словом extends подразумевает концепцию наследования это ключевая концепция объектно-ориентированного программирования.
Вы получаете класс (A) с некоторыми методами и нуждаетесь в аналогичном классе (B) с немного другим поведением, вы можете получить новый класс, расширяя класс A и просто изменяя методы, которые необходимо изменить (это называется переопределение ) или добавить новые.
В противоположность наследованию есть композиция . С помощью композиции вы не расширяете класс, чтобы изменить его поведение, вместо этого вам нужно сделать лоскутное одеяло классов, чтобы получить желаемое поведение.
В википедии вы можете найти лучшее объяснение композиции объекта и [наследования классов] ( http://en.wikipedia.org/wiki/Inheritance_ (computer_science))
Это кажется, что в этих концепциях возникает небольшая путаница, поскольку вы расширяете свой класс A и в то же время пытаетесь его составить (кстати, правильный синтаксис - $ a = new B (); ]).
Полезная ссылка, очевидно, [Gof, Шаблоны проектирования] ( http://en.wikipedia.org/wiki/Design_Patterns_ (книга))