Вызов функции в классе, который расширяет текущий абстрактный класс

0

У меня есть класс Connection который подключается к определенной " Service ". Вы вызываете конкретную Service такую как mysqli или PDO при создании экземпляра класса.

class Connection
{

    private $service;

    private $state = null;

    public function __construct(Service $service) {
        $this->service = $service;
    }

    public function initialize() {
       ....
    }

    public function destruct() {
       ....
    }

    //Maybe some getters and setters
}

В классе Service есть метод getObject(), который содержит объект, который должен быть создан для подключения к базе данных или что-то еще.

Существует также метод getInstance(). Это используется для возврата объекта в метод getObject если он еще не getObject.

abstract class Service
{

    public static function getInstance() {
        $instance = null;
        if ($instance == null) {
            $instance = self::getObject();
        }
        return $instance;
    }

    /**
     * @return object Returns the object where the service should start from.
     */
    public abstract function getObject();
}

Ниже приведен пример класса службы.

class MySQLService extends Service
{

    public function getObject() {
        return new mysqli('127.0.0.1', 'root', '', 'db');
    }
}

проблема

При использовании этого кода:

$connection = new Connection(MySQLService::getInstance());
$connection->initialize();

Он приходит с этой ошибкой:

Неустранимая ошибка: не удается вызвать абстрактный метод Service :: getObject() в C:\Users.\Documents...\Service.php в строке 18

Вопросов

  • Как получилось, что эта ошибка появляется?
  • Как я могу решить эту ошибку?
  • Как я могу вызвать функцию из класса, который расширяет класс Service?
Теги:
dependency-injection
oop

1 ответ

1

Чтобы получить эту работу, вам нужно объявить методы getObject статическими методами.

В Service:

public abstract function getObject()

Должно быть:

public static function getObject() {}

(Извините, у вас не может быть статический реферат)

В MySQLService:

public function getObject() {

Должно быть:

public static function getObject() {

Затем вы можете направить вызов в нужный класс, используя следующее:

public static function getInstance() {
    static $instance = null;
    if ($instance == null) {
        $instance = static::getObject();
    }
    return $instance;

}

Примечание. Вы также пропустили ключевое слово static из переменной экземпляра.

  • 0
    Хорошо, тогда спасибо :) Но как я могу заставить классы иметь метод getObject() ? И почему я должен сделать переменную $instance статической? А что делает static:: word?
  • 0
    Да - сложно! Увы, если вы хотите назвать это статически, вы не можете сделать это абстрактным (насколько я знаю). Кто-то еще может прийти и сказать мне, что я не прав!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню