У меня есть класс 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
? Чтобы получить эту работу, вам нужно объявить методы 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
из переменной экземпляра.
getObject()
? И почему я должен сделать переменную$instance
статической? А что делаетstatic::
word?