Недавно наша компания была принята на закрытое тестирование для некоторого программного обеспечения, где я взял API, который находится в стадии разработки, и начал разработку класса-оболочки для использования в наших собственных системах.
Базовый класс устанавливает соединение с API, отправляет запросы JSON и обрабатывает все основные функции. Однако система работает с плагинами / модулями, которые добавляют дополнительную функциональность при загрузке.
Поддерживает ли PHP подклассы, которые будут работать для этого сценария? Будет ли лучше всего передать экземпляр базового класса «подклассам» в качестве параметра при их инициализации и использовать его для отправки запросов?
Псевдокод:
<?php
class PluginClass
{
private base = null;
public function __construct($base_system)
{
if (isset($base_system))
{
$this->base = $base_system;
}
$this->base->sendRequest("someData");
}
}
class BaseClass
{
public function __construct($host = 'localhost', $port = '8080', $user = 'admin', $pass = '')
{
if(!empty($host) && !empty($port) && !empty($user) && !empty($pass))
{
$this->login($host, $port, $user, $pass);
}
}
public function sendRequest($data)
{
// Send JSON Request Data
}
}
?>
Да, это совершенно нормальный сценарий.
Я бы не назвал это subclass
хотя, чтобы не путать это с дочерними классами, которые расширяют родительский класс через extend
механизм.
То, что вы описываете, я использую почти каждый день.
Скажем, класс, которому дан массив для работы.
Или другой класс, которому дано соединение с базой данных для работы.
Например,
$object_screwer = new ObjectScrewer( $some_object );
$object_screwer->screw_it();
…который он в свою очередь называет $this->object->some_method()
например
Некоторые также ошибочно называют это strategy
шаблон.
Это не так по определению, но выглядит очень похоже.
Просто быть чистым, strategy
шаблон будет:
$P = new Payment( new PayPal('username','password') );
$P->pay(10.00);
В strategy
шаблон, мы даем начальному объекту некоторые параметры: не просто свойства, но определяя стратегия его поведения. В этом случае я создал объект платежа и передал ему объект плагина PayPal для обработки платежей.
Удачи в кодировании!
Других решений пока нет …