2016-12-01 1 views
0

gefiltert werden Ich habe dieses PHP-Projekt geerbt. Ich habe eine Klasse, die vielleicht 20 verschiedene Methoden enthält, von denen die meisten Werte zurückgeben. Ich möchte jeden Wert filtern, der von Methoden in dieser Klasse zurückgegeben wird. Gibt es eine einfache und elegante Möglichkeit, dies zu tun, oder muss ich jeden Wert in eine Filtermethode einschließen, bevor sie zurückgegeben wird?Wie alle zurückgegebenen Werte von Methoden in der Klasse

Die Klasse sieht wie folgt aus:

class db_ops 
{ 

    // ... 

    public function get_var($query) { 
     // ... 
     return $values; 
    } 

    public function get_name($query) { 
     // ... 
     return $name; 
    } 

    // ... 

} 
+1

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

+0

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

+0

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". –

Antwort

0

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'); 
Verwandte Themen