2010-11-12 16 views
2

Vous pouvez rediriger les appels vers certaines propriétés/fonctions en utilisant __get, __call."__classe magic method" (médiation des références aux noms de classes par un code personnalisé)

Existe-t-il un moyen de le faire pour les cours?

Je voudrais convertir toutes les mentions de some_class_name dans le code à, MY_VERSION_some_class_name (pas seulement pour une classe, c'est un modèle).

Cela serait facile si les méthodes/propriétés étaient la cible de cette politique de renommage. Pouvez-vous penser à un moyen de le faire pour les classes en PHP?

Editer: J'ai besoin de cela pour faire référence à différentes variantes de classes dans différentes situations. J'ai besoin qu'un nom de classe soit résolu en différentes variantes de cette classe, en fonction d'une condition connue à l'exécution, et persistant tout au long de la session.

Merci

p.s. Si vous êtes curieux pourquoi je veux faire cela, regardez Maintaining variants of an application

Répondre

4

Vous ne pouvez pas convertir toutes les mentions de some_class_name dans le code à une autre classe. Cependant, vous pouvez utiliser des variables comme les noms de classe:

$className = "MyClass"; 
$obj = new $className; 
$className::myMethod(); 

Tout ce que vous devez faire est de changer la variable et vous utiliserez une autre classe. Si vous devez le faire pour beaucoup de cours, vous pouvez créer une sorte d'usine pour cela. Fondamentalement, la classe System retournerait un objet différent en fonction de la classe devant être utilisée pour cette exécution particulière.

+1

+1 pour recommander une usine plutôt qu'une autre méthode sinistre. Les usines s'avèrent souvent utiles de toute façon. –

+0

C'est une bonne idée mais ça va me forcer à refactoriser un gros code. Et aussi semblera laid - pensez à chaque mention de n'importe quel nom de classe ressemblant à $ factory-> classVariant ('classname') au lieu de simplement classname – shealtiel

+0

@gidireich Généralement vous feriez '$ factory-> getMyModule()'. Qu'est-ce qui se passe quand vous créez '$ factory', vous créez la classe d'usine qui a la combinaison de classes que vous voulez. –

0

La fonction magique que vous voulez est __autoload:

function __autoload($class_name) { 
    // include your special class in here 
    include $class_name . '.php'; 
} 

En savoir plus ici: http://php.net/manual/en/language.oop5.autoload.php

+0

Cela ne l'aidera pas à rediriger quelle classe est utilisée. –

+0

Ne répond pas directement à ma question, mais * est * utile. C'est utile, un des outils que j'ai essayé de maîtriser - en chargeant différentes versions de la classe. – shealtiel

1

approche non testé Aiden: les variables variables et générer une chaîne:

<?php 
$dog = "12"; 

function getDogClass($myNum) 
{ 
    global $dog; 
    // Do something dynamic here; 
    $dog = "Dog_" . $myNum; 
    return "dog"; 
} 

class Dog_13rc1 
{ 
    function __construct() 
    { 
     printf("Woof!"); 
    } 
} 

class Dog_12 
{ 
    function __construct() 
    { 
     printf("Grrrr"); 
    } 
} 

$myObj = new ${getDogClass('13rc1')}(); 
?> 

Tant que le appel à getDogClass() renvoie une chaîne du nom d'une variable dans la portée, alors vous êtes bon.

La sortie est woof. Cela signifie que le seul refactoring dont vous avez besoin est de trouver/remplacer les occurrences du nom de classe avec cet appel.

Mais c'est triste. et probablement lent. Aussi, un hack de type cauchemar de maintenance/bug-tracking.