Поскольку у вас всегда есть доступ к базовому коду в PHP, переопределите функции основного класса, которые вы хотите переопределить, следующим образом, это должно оставить ваши интерфейсы без изменений:
class third_party_library {
public static $buggy_function;
public static $ranOnce=false;
public function __construct(){
if(!self::$ranOnce){
self::$buggy_function = function(){ return 'bad result'; };
self::$ranOnce=true;
}
.
.
.
}
function buggy_function() {
return self::$buggy_function();
}
}
Вы можете по какой-то причине использовать личную переменную, но тогда вы сможете получить доступ к функции только путем расширения класса или логики внутри класса. Точно так же возможно, что вы захотите, чтобы разные объекты одного и того же класса имели разные функции. Если это так, не используйте static, но обычно вы хотите, чтобы он был статическим, чтобы не дублировать использование памяти для каждого созданного объекта. Код ranOnce просто гарантирует, что вам нужно только инициализировать его один раз для класса, а не для каждого $myObject = new third_party_library()
Теперь, позже в вашем коде или другом классе - когда логика достигает точки, где вам нужно переопределить функцию - просто сделайте следующее:
$backup['buggy_function'] = third_party_library::$buggy_function;
third_party_library::$buggy_function = function(){
//do stuff
return $great_calculation;
}
.
.
. //do other stuff that needs the override
. //when finished, restore the original function
.
third_party_library::$buggy_function=$backup['buggy_function'];
В качестве примечания: если вы выполняете все функции класса таким образом и используете хранилище ключей / значений на основе строк, например public static $functions['function_name'] = function(...){...};
, это может быть полезно для размышления. В PHP не так много, как в других языках, потому что вы уже можете захватывать имена классов и функций, но вы можете сохранить некоторую обработку, и будущие пользователи вашего класса могут использовать переопределения в PHP. Это, однако, один дополнительный уровень косвенности, поэтому я бы по возможности не использовал его в примитивных классах.