Статическим методам потребуется другое количество аргументов, нежели их объективному аналогу - дополнительный аргумент будет контекстом выполнения. Если контекст выполнения отсутствует, то он только имеет смысл называть статически.
Мой предпочтительный подход, учитывая, что я создаю библиотеку с несколькими интерфейсами, подобными этому, заключается в создании статического класса и динамического класса. У одного прокси звонки на другой. Например:
class DynamicClass {
protected $foo;
protected $bar;
public function baz($arg1) {
return StaticClass::bar($this->foo, $arg1);
}
public function zop($arg1, $arg2) {
return StaticClass::zop($this->foo, $this->bar, $arg1, $arg2);
}
// Context-less helper function
public function womp($arg1) {
return StaticClass::womp($arg1);
}
}
class StaticClass {
public static function baz(&$fooContext, $arg1) { ... }
public static function zop(&$fooContext, &$barContext, $arg1, $arg2) { ... }
public static function womp($arg1) { ... }
}
Вам решать, как именно вы передаете контекст статическому классу - вам придется делать все, что имеет для вас смысл. Работа, выполняемая в большинстве функций, должна быть довольно незначительной (если вы делаете много, тогда вам, вероятно, следует разбить работу на более мелкие функции, как правило), и поэтому вам потребуется только несколько контекстных аргументов. Или вы можете создать полный массив контекста и передавать его везде (либо заполнять его в DynamicClass
непосредственно перед каждым вызовом, либо отслеживать все свойства DynamicClass
в этом массиве, чтобы вы могли быстро и легко передавать его.
Хотя на самом деле похоже, что вы могли бы извлечь пользу из шаблона проектирования Singleton. Из того, что я вижу, вы пытаетесь создать глобальный Configurable
, а также можете создать отдельные локальные Configurable
s. С помощью шаблона проектирования Singleton вы создаете глобально доступную версию класса, которую вы можете гарантировать, что у вас есть только один из них (без нарушения принципов проектирования ООП и необходимости полагаться на $ _GLOBALS и т. Д.). Например:
class DynamicClass {
protected $foo;
protected $bar;
public function baz($arg1) { ... }
public function zop($arg1, $arg2) { ... }
public static function getSingleton() {
static $instance = null;
if ($instance === null) $instance = new DynamicClass();
return $instance;
}
}
Независимо от того, где вы находитесь в своем коде, вы можете получить доступ к тому же экземпляру с помощью DynamicClass::getSingleton()
. У вас также есть возможность создания одноразовых не синглтонных версий. По сути, вы получаете лучшее из обоих миров, при этом вам нужно только написать все ваши методы исключительно с учетом динамического доступа.