2009-10-01 6 views
0

Vous vous demandez si cela est possible en PHP Terrain:PHP Importation Méthode étrangère Classe de dans MyClass

Disons que j'ai une classe comme suit:

class myClass{ 
    var $myVar; 
    ... 
    myMethod(){ 
     $this->myVar = 10; 
    } 
} 

et une autre classe:

class anotherClass { 
    ... 
    addFive(){ 
     $this->myVar += 5; 
    } 
} 

La 'anotherClass' a une longueur de 3500 lignes et je veux juste que la méthode 'addFive' soit utilisée dans myClass.

  • Y a-t-il un moyen d'importer la fonction et de pouvoir l'appeler dans ma classe et le $ cela référencerait l'objet myClass?
  • Est-ce une bonne/mauvaise pratique?
  • (optionnel) Comment cela fonctionne-t-il en Python? (Juste curieux que je commence à apprendre Python)

Répondre

2

La meilleure façon de le faire est d'avoir une classe d'étendre l'autre

class myClass extends anotherClass { 
} 

La classe myClass a désormais accès à toutes les méthodes de anotherClass qui sont publics ou protégés.

Si vous voulez que la classe ait une méthode de l'autre, ou il n'est pas pratique d'avoir une classe qui s'étend de l'autre, il n'y a rien de construit dans PHP qui vous permettra de faire cela. Le concept que vous recherchez pour Google est "Mixin", comme dans Mix In Dans la fonctionnalité d'une classe avec une autre. Il y a un article or two sur certains modèles que vous pouvez essayer d'obtenir cette fonctionnalité en PHP, mais je ne l'ai jamais essayé moi-même.

Bonne idée/mauvaise idée? Une fois que vous avez réduit la technique, c'est pratique et utile, mais cela vous coûte plus cher en performance et rend plus difficile pour un débutant de comprendre ce que vous faites avec votre code, en particulier (mais pas uniquement) quelqu'un de moins familier avec les concepts OO.

+1

Le lien montre exactement ce que je voulais faire. Lire plus sur cela. Merci. – safoo

+0

Cela pourrait fonctionner, mais l'utilisation d'eval pour accomplir même une fin justifiable comme celle-ci me rend méfiant. –

0

Si votre myClass extends anotherClass il hérite de toutes les méthodes et propriétés de anotherClass (sauf celles marquées privées).

class AnotherClass { 
    protected $myVar; 
    public function addFive(){ 
    $this->myVar += 5; 
    } 
} 

class MyClass extends AnotherClass { 
    public function __construct() { 
    $this->myVar = 0; 
    } 

    public function myMethod(){ 
    $this->myVar = 10; 
    } 
} 

$m = new MyClass; 
$m->myMethod(); 
$m->addFive(); 
var_dump($m); 

impressions

object(MyClass)#1 (1) { 
    ["myVar":protected]=> 
    int(15) 
} 
+0

Merci. Oui, mais je veux éviter d'étendre la classe de ligne 3500 car il a 3490 lignes de fonctionnalités dont je n'ai pas besoin. Fondamentalement, je cherche à prolonger seulement cette méthode. – safoo

2

Une meilleure approche serait de déplacer la méthode complexe dans sa propre classe. Ensuite, vos deux classes peuvent l'instancier, transmettre les données nécessaires et appeler la méthode.

Questions connexes