ich eine Art Wrapper-Klasse verwendet haben, bevor so etwas zu tun. Hier ist ein generisches Beispiel, nur um zu zeigen, wie es funktioniert. Wenn Sie diese Idee mögen, sollten Sie in der Lage sein, Ihre eigenen in diese Richtung umzusetzen.
class FilteredExample
{
private $example;
function __construct($example)
{
$this->example = $example;
}
public function __call($name, $arguments)
{
if (method_exists($this->example, $name)) {
$result = call_user_func_array([$this->example, $name], $arguments);
if (is_string($result)) {
return "$result filtered";
} elseif (is_array($result)) {
return array_map(function($item){ return "$item filtered"; }, $result);
} else {
return $result;
}
} else {
throw new BadMethodCallException("Method '$name' not found", 1);
}
}
}
Sie injizieren das Objekt, dessen Methoden wollen Sie im Konstruktor filtern, und verwenden Sie dann die __call()
magische Methode, so dass Sie alle von der ursprünglichen Objektmethoden aufrufen können. Mit method_exists
können Sie jede aufgerufene Methode validieren und eine Ausnahme auslösen, wenn sie nicht existiert, genau so, wie Sie sie erhalten würden, wenn Sie sie für das ursprüngliche Objekt aufgerufen hätten. Wenn es gibt, dann können Sie es mit call_user_func_array
aufrufen, das Ergebnis filtern und zurückgeben.
Ich habe einen kleinen Abschnitt hinzugefügt, um zu zeigen, dass Sie verschiedene Ergebnistypen verarbeiten können, oder geben Sie einfach das unmodifizierte Ergebnis zurück, wenn es sich nicht um einen bestimmten Typ handelt. Sie müssen dies natürlich nicht tun, wenn alle Methoden Ihres ursprünglichen Objekts den gleichen Typ zurückgeben.
Hier ist ein Beispiel dafür, wie man es am Beispiel der Klasse von Ihrer Frage verwenden:
$dbOps = new db_ops;
$filteredDbOps = new FilteredExample($dbOps);
$result = $filteredDbOps->get_var('something');
Zeigen Sie uns Ihren Code. Erklären Sie genauer, was es tut und was Sie tun möchten. Möglich geben Sie ein Beispiel. So haben wir keine Ahnung, wovon du sprichst. Es gibt nur ein paar hundert Möglichkeiten, etwas zu "filtern". – icecub
Wie auch immer. Zur Sache: Es gibt 2 Orte, an denen man etwas "filtern" kann. Innerhalb der Methode oder wo auch immer der Wert in Ihrem Code zurückgegeben wird. Wenn Ihr "Filter" auf alle verschiedenen Methoden angewendet werden kann, ist es am besten, Letzteres zu tun. Ansonsten müssen Sie es innerhalb der Methode tun. Wenn Sie beispielsweise ganze Zahlen filtern möchten, aber einige Methoden eine Zeichenfolge zurückgeben, würde dies zu Problemen führen, wenn diese Zeichenfolge denselben Filter durchläuft. – icecub
Danke. Es gibt also keine Möglichkeit, einen zusätzlichen Code zu schreiben, der im Grunde sagt: "Filtere alle Werte, die von irgendeiner Methode in Klasse X zurückgegeben werden". –