2010-07-16 18 views
0

J'ai une classe:

class Module { 

    public function a(...params...) { 
     //do something, doesn't return anything 
    } 

    public function b(...params...) { 
     //do something, doesn't return anything 
    } 

    public function c(...params...) { 
     //do something, doesn't return anything 
    } 

    public function getAsArray() { 
     return get_object_vars($this); 
    } 

}

Est-il possible de modifier la classe de module, donc des méthodes un(), b() et c() retourner ce $? Je ne veux pas l'écrire dans toutes les fonctions. getAsArray() devrait retourner ce qu'il fait. Le module sera base pour d'autres classes et je veux que ce mécanisme soit implémenté en base, mais l'utilise dans les classes héritées.

Je veux l'utiliser comme ceci:

$module = new Module(); 
$module->a()->b()->c()->getAsArray(); 

Répondre

1

Si vous ne voulez pas ajouter une seule ligne de retour cette $ à chacune de vos méthodes, vous pouvez faire quelque chose comme:

class Module { 

    private function _a($value) { 
     echo 'Executing method a<br />'; 
     $this->aVar = $value; 
    } 

    private function _b($value) { 
     echo 'Executing method b<br />'; 
     $this->bVar = $value; 
    } 

    private function _c($value) { 
     echo 'Executing method c<br />'; 
     $this->cVar = $value; 
    } 

    public function getAsArray() { 
     return get_object_vars($this); 
    } 

    public function __call($name, $arguments) { 
     echo 'Calling method '.$name.'<br />'; 
     call_user_func_array(array($this,'_'.$name),$arguments); 
     return $this; 
    } 
} 


$x = new Module(); 

var_dump($x->a(1)->b(2)->c(3)->getAsArray()); 

mais il est vraiment plus de travail à faire pour vous que la seule ligne changement que vous semblez ne pas aimer.

Notez que vous ne pouvez pas incorporer d'appel de méthode immédiate dans une nouvelle ligne de module. Cela nécessite réellement de stocker l'objet instancié dans une variable, puis d'enchaîner les appels de méthode avec cette variable.

+0

C'est ce à quoi j'ai pensé, mais cela nécessite d'ajouter un préfixe à chaque définition de méthode. Il est préférable d'ajouter 'return $ this' à chaque méthode, mais toujours douloureux. Ce n'est pas une ligne, chaque méthode dans l'héritage des classes doit retourner '$ this' et je ne veux pas l'écrire ici. – LukLed

+0

Y a-t-il une raison particulière pour laquelle vous ne voulez pas écrire $ return this dans chaque méthode? –

+0

Il s'agit d'une redondance de code inutile. Pourquoi devrais-je l'écrire si je n'en ai pas besoin? – LukLed

0

Il y a des situations où j'utiliser ce baseclass:

abstract class FluentInterface 
{ 
    public function __call($method, $params) 
    { 
     if(substr($method, 0, 3) == 'set') 
     { 
      // remove leading 'set' from method 
      $prop = substr($method, 3); 
      // lowercase first char 
      $prop{0} = strtolower($prop{0}); 

      $rc = new ReflectionClass(get_class($this)); 
      if($rc->hasProperty($prop)) 
      { 
       $this->$prop = $params[0]; 
       return $this; 
      } 
     } 

     return false; 
    } 
} 

Mais il est spécialement conçu pour les getters/setters. Peut-être pourriez-vous développer un peu votre domaine de problème spécifique.

1

n °

Soit vous le faire manuellement ou écrire un programme pour passer par les fichiers source et de le faire pour vous.