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

у меня есть 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 метод, если он еще не создан.

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 учебный класс?

0

Решение

Чтобы это работало, вам нужно объявить 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 Ключевое слово из переменной экземпляра тоже.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector