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