Как в php отделить объявление класса от его реализации? Заранее извиняюсь, если вопрос глупый, Гуглил долго, но так и не нашел ответа.
Допустим, есть класс DataKeeper:class DataKeeper {
private $data;
public function setData($data) {
// реализация
}
public function getData() {
// реализация
}
public function saveData() {
// реализация
}
private function processData() {
// реализация
}
}
Тому, кто будет использовать класс нет необходимости знать, как именно работают функции. Ему достаточно знать только о наличии открытых функций, с которыми он может работать.
Раскрытие деталей реализации класса я хочу вынести в отдельный файл, а в «основном» иметь что-то типа:class DataKeeper {
public function getData()
public function setData($data)
public function saveData()
}
Как это сделать?Upd:
Спасибо за ответы про интерфейсы. Наверное, я туплю, но мне кажется, это не решение проблемы.
Живой пример:
Вот, допустим, есть у меня файл DataKeeper.php. В нем объявлен интерфейс DataKeeper.
Его реализует класс FileDataKeeper (сохраняет данные в файл), находящийся в своём файле.class FileDataKeeper implements DataKeeper
Получается, что в проекте, мне все равно надо будет писать:$dk = new FileDataKeeper;
В файле DataKeeper.php (а только его, по идее, мы должны смотреть) нет ни слова о FileDataKeeper.
Кроме того, если я захочу поменять реализацию хранения, заменив класс FileDataKeeper, например, на MySQLDataKeeper, интерфейс и открытые методы-то не изменятся, а вот «new FileDataKeeper» надо будет менять по всему проекту.

21 Авг 2019 в 07:10
184 +1
0
Ответы
1

Для отделения объявления класса от его реализации в PHP можно использовать интерфейсы. Интерфейс позволяет определить набор методов, которые должны быть реализованы в классе, но не содержит реализацию этих методов. Таким образом, вы можете иметь следующую структуру:

В файле DataKeeperInterface.php объявляем интерфейс:```php
interface DataKeeperInterface {
public function getData();
public function setData($data);
public function saveData();
}

В файле DataKeeper.php реализуем класс, который реализует этот интерфейс:```php
class DataKeeper implements DataKeeperInterface {
private $data;
public function getData() {
// реализация
}
public function setData($data) {
// реализация
}
public function saveData() {
// реализация
}
}

При использовании класса DataKeeper в других частях проекта вы можете работать с ним через интерфейс DataKeeperInterface, не зная конкретной реализации класса. Это позволит легко заменить реализацию класса DataKeeper на другую, не затрагивая код, который использует этот класс:

$dk = new DataKeeper();
$dk->setData($data);
$dk->saveData();

Если вам все равно не нравится использовать интерфейсы, вариантов отделения объявления класса от его реализации в одном файле PHP нет. В большинстве случаев использование интерфейсов является наиболее распространенным и удобным подходом к этой проблеме.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 718 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир