Я ищу способ иметь один базовый класс, который может быть расширен несколькими дочерними классами, только один из которых будет активен одновременно. Очень простой пример:PHP/OOP - использование родительского класса для запуска дочерних функций
class API_Base {
public $context;
public function __construct() {
$this->init()
}
}
class Mailchimp_API extends API_Base {
public function init() {
$this->context = 'mailchimp';
$this->enabled = false;
}
public function add_contact($email_address) {
// mailchimp API for adding contact
}
}
class Infusionsoft_API extends API_Base {
public function init() {
$this->context = 'infusionsoft';
$this->enabled = true;
}
public function add_contact($email_address) {
// infusionsoft API for adding contact
}
}
Каждый ребенок инициализируется и регистрируется как опция для выбора пользователем. После того, как пользователь выбрал, какую интеграцию использовать, он сохраняется в базе данных. Я хотел бы в будущем доступ к API_Base, чтобы выглядеть примерно так:
$api = new API_Base();
$api->context; // should be "infusionsoft"
$api->add_contact($email_address);
Так что, когда $api->add_contact()
запускается, он работает только add_contact()
функции для активной интеграции API.
В конце концов я хотел бы как-то использовать get_class_methods();
, чтобы вернуть возможности только активного API, поэтому функции доступа к API могут знать, что возможно (например, списки поддержки электронной почты API, в то время как другие нет, или поддерживают создание пользовательских поля и т. д.).
У меня был некоторый успех при вызове parent::set_context($context);
из включенного класса, но я до сих пор не могу понять, как заставить родителя выполнять только методы в «включенном» дочернем классе.
Похоже, вы хотите какой-то завод. Если вы используете фреймворк, например, Symfony, также немного прочитал о контейнере обслуживания. –