2016-03-28 5 views
3

Ich habe eine Klasse wie folgt aus:Wie die gleiche Methode auf allen Datenelementvariablen nennen eine fließend Schnittstelle

class example{ 

    private $foo = array(); 
    private $bar = array(); 

    public function getFoo(){ 
     return $this->foo; 
    } 

    public function getBar(){ 
     return $this->bar; 
    } 

    //for example 
    public function doSomth(array $smth){ 
     // do somth on $smth 
     return $smth; 
    } 
} 

Ich möchte in der Lage sein, ein Verfahren zu definieren, die auf allen Daten Mitglieder meiner Klasse arbeitet was sie haben die Art von Array, etwas wie folgt:

$exmpl = new Example(); 
$exmpl->getFoo()->doSmth(); 
//or 
$exmpl->getBar()->doSmth(); 

Was soll ich tun?

+2

Ich sehe nicht, wo das Problem ist und was genau Sie hier tun möchten? Vielleicht können Sie ein konkretes Beispiel hinzufügen. – Rizier123

Antwort

0

Statt $this->foo oder $this->bar direkt zurückkehrt, kehren ein Objekt, das die Daten nimmt und ein doSmth Verfahren, wie:

class example{ 
    private $foo = array(); 
    private $bar = array(); 

    public function getFoo(){ 
     return new dosmth($this->foo); 
    } 

    public function getBar(){ 
     return new dosmth($this->bar); 
    } 
} 

class dosmth { 
    public function __construct(array $smth) { 
     $this->smth = $smth; 
    } 
    public function doSmth() { 
     echo 'do something on $this->smth'; 
     return $this->smth; 
    } 
    private $smth; 
} 

$exmpl = new Example(); 
$exmpl->getFoo()->doSmth(); 
$exmpl->getBar()->doSmth(); 

Siehe auch Fluent Interface.

Während dies scheint, um das Problem zu lösen, wie gesagt, ich warne, dass es möglicherweise eine bessere Design-Ansatz. Insbesondere sei "Beispiel" ein reiner Datencontainer mit Zugriffsmethoden für "foo" und "bar", und "dosmth" sollte eine Hilfsklasse sein, die Sie bei Bedarf instanziieren und aufrufen. Dies wäre ein Äquivalent API-Aufruf, die nur geringfügig mehr Typisierung ist aber hält die Bedenken deutlich zwischen den Klassen getrennt:

$helper = new dosmth; 
$exmpl = new example; 
$helper->doSmth($exmpl->getFoo()); 
$helper->doSmth($exmpl->getBar()); 

Fluent Interfaces ein Sirenengesang sind. Verwenden Sie sie, wo sie helfen, aber implementieren Sie sie nicht, nur weil Sie können.

Verwandte Themen