2012-06-06 7 views
2

Très bien, alors j'essaie de comprendre comment structurer mon code le plus efficacement possible. Je l'ai récemment changé d'un fichier de classe géant avec toutes mes méthodes, en plus petits fichiers qui sont combinés avec une classe de base. C'est ce que je veux, mais je ne peux pas le faire fonctionner correctement et j'ai besoin d'aide avec la structure.PHP Extension des classes et accès aux frères et sœurs

Essentiellement, je dois faire ceci:

  • Il y aura des fonctions qui ne sont que des « outils » pour les autres classes (telles que les fonctions de conversion, etc.) - ils ont besoin d'être accessible par tous les classes d'enfants.
  • Dans certains cas, "child class one" devra utiliser des fonctions de "child class two".
  • Une classe enfant doit pouvoir définir une variable qu'une autre classe enfant peut voir.

Veuillez me faire savoir comment je peux commencer avec ces exigences; Des exemples de code seraient grandement appréciés! Peut-être un pseudo code aidera - mais si je suis éteint s'il vous plaît laissez-moi savoir ce qui fonctionnerait mieux!

class main { 
    private $test; 
    public function __construct() { 
     //do some stuff 
    } 
    public function getTest() { 
     echo('public call: '.$this->test); 
    } 
    private function randomFunc(){ 
     echo('hello'); 
    } 
} 
class child1 extends main { 
    public function __construct() { 
     parent::$test = 'child1 here'; 
    } 
} 
class child2 extends main { 
    public function __construct() { 
     echo('private call: '.parent::$test); //i want this to say "private call: child1 here" 
     parent::randomFunc(); 
    } 
} 
$base = new main; 
new child1; 
new child2; 
$base->getTest(); 

Je veux donc le résultat de ce soit:

private call: child1 here 
hello 
public call: child1 here 

Jusqu'à présent, ce que j'ai essayé ne fonctionne pas ... S'il vous plaît aider! Je vous remercie.

+0

Avez-vous regardé en utilisant Traits - http://php.net/manual/fr/language.oop5.traits.php –

Répondre

2

Premier point:

Pour une classe d'aide, vous pouvez choisir de faire vos méthodes statiques, de sorte que vous n'avez pas besoin d'une instance:

class Helper 
{ 
    public static function usefulMethod() 
    { 
    // do something useful here 
    } 
} 

qui est maintenant accessible de partout comme ceci:

Helper::usefulMethod() 

Les points suivants ont besoin une autre explication, que j'ajouté que les commentaires vous r pseudo code:

// always start your class names with upper case letter, it's a good convention 
class Main 
{ 
    // don't make this private if you want to access from the child classes too 
    // private $test; 

    // instead make it protected, so all sub classes can derive 
    protected $test; 

    public function __construct() 
    { 
     //do some stuff 
    } 

    public function getTest() 
    { 
     echo 'public call: '.$this->test; 
    } 

    private function randomFunc() 
    { 
     echo 'hello'; 
    } 
} 

class Child1 extends Main 
{ 
    public function __construct() 
    { 
     // $test is now derived from the parent into the sub class 
     $this->test = 'child1 here'; 
    } 
} 


class Child2 extends Main 
{ 
    public function __construct() 
    { 
     // this doesn't quite work like expected: 
     // echo 'private call: '.$this->test; //i want this to say "private call: child1 here" 

     // because this isn't a reference, but think of every class instance 
     // as a container which holds its own properties and methods (variables and functions) 
     // if you really want to do it like intended then you would need a subclass from main1 
     // but that is kind of strange, I don't know exactly what you want to achieve 

     // this will print out 'hello' as expected 
     parent::randomFunc(); 
    } 
} 

Je suis sûr que cela ne répond pas tout à fait, mais j'ai fait de mon mieux. Peut-être que vous pourriez proposer vos intentions un peu plus loin

+0

Je voterais cela, mais je ne le fais pas avoir assez de rep, merci pour l'aide! Ceci est un bon début. Je devrais ajouter cependant, je suppose que mon point est que je veux apporter des modifications aux variables protégées dans la classe de base à partir des classes enfants. Donc, plus exactement, je voudrais 'echo ('appel privé:' .parent :: $ test)'. Cela fonctionnerait-il? – iLoch

+0

De même, que se passerait-il si Child1 avait une méthode que Child2 devait utiliser? Comment puis-je y accéder? – iLoch

+0

Il suffit que vous appeliez $ this-> test, s'il est dérivé de la classe principale, car la propriété est fusionnée dans la classe de base. Si vous voulez accéder à une méthode depuis Child2, vous pouvez instancier un nouvel objet et le donner dans l'autre classe. Appelé [injection de dépendance] (http://fabien.potencier.org/article/11/what-is-dependency-injection). Si vous avez besoin d'aide, dites juste un mot :) –

Questions connexes