web-dev-qa-db-fra.com

Une manière d'hériter des méthodes de ma classe de plugin et de WP_List_Class?

Donc, WP 3.1 introduit la fantaisie WP_List_Class () me poussant à réécrire toutes mes tables d'administration personnalisées. C'est suffisant. Mais ... dans le bon temps, j’ai pu appeler mes méthodes de plug-in à l’aide de $this->method(), car j’ai inclus le fichier de page dans la méthode à laquelle l’accrochage s’est effectué via add_submenu_page(). C'était gentil et un peu élégant - ou du moins gentil - je pensais.

Maintenant, cependant, mon code doit vivre dans les méthodes de My_WP_List_Class, qui hérite de WP_List_Class. Étant donné que je ne peux pas utiliser l'héritage multiple, il me semble devoir référencer mon instance de plugin global ou le rétablir dans ma classe, ce qui me met un peu en colère.

L'empilement de classes ne semble pas être une option non plus, parce que je ne peux évidemment pas faire hériter WP_List_Class de ma classe de plugin, pas plus que je ne veux que ma classe de plugin hérite de WP_List_Class.

Suis-je en train de négliger quelque chose ou dois-je vivre avec?

Edit: plus de contexte:

Je pense peut-être trop compliqué, mais mon scénario est le suivant: j'ai une classe de plug-in 'méta' instanciée par d'autres plugins (plusieurs fois). Donc, je ne sais même pas ce que c'est instancié et franchement, je ne veux pas savoir. ;-) Chacune de ces instances se connecte au menu admin et crée une page de menu personnalisée. Chacune de ces instances reçoit également certains paramètres (par exemple, un id-id) qu’elle stocke en interne lors de l’instanciation. Si j'appelle une méthode, la méthode dépend de ces valeurs stockées en interne.

Jusqu'à présent, chacune de ces instances pouvait toutes vivre de manière autonome, je n'avais pas besoin de les enregistrer dans un tableau ou quoi que ce soit, vous pouviez même les instancier anonymement, si vous le vouliez.

Maintenant, j'ai besoin d'ajouter des méthodes à ma classe d'héritage WP_List_Class qui dépendra également de ces valeurs. Donc, la seule chose que je peux imaginer est de faire quelque chose comme ceci:

function table_me_some() {
    $table = new My_WP_List_Class(&$this);
    ...
}

et ensuite dans My_WP_List_Class faire quelque chose comme ceci:

function __construct($mama) {
    $this->_mama = $mama;
}

function whatever() {
    $this->_mama->my_plugin_class_instance_method();
}

Ensuite, my_plugin_class_instance_method() habite dans ma classe de plug-in instanciée et référence son propre magasin de variables internes.

Cependant, je ne l'ai que maintenant, mais je ne le trouve toujours pas très chouette.

2
wyrfel

C'est un modèle de conception commun, et je l'aurais résolu de la même façon que vous. Laissez My_WP_List_Class étendre WP_List_Class et transmettez-lui un objet "configuration". Vous pouvez même rendre la relation plus explicite en définissant une interface à laquelle votre objet de configuration doit adhérer:

interface My_WP_List_Configuration
{
    public function get_name();
    public function get_admin_page_uri();
    // ...
}

class WPSE10402_Plugin extends Wyrfel_Plugin implements My_WP_List_Configuration
{
    public function get_name()
    {
        return $this->_name;
    }

    public function get_admin_page_uri()
    {
         // ...
    }
}

Je ne vois pas beaucoup de différence avec la manière actuelle d’utiliser des actions pour accrocher vos fonctionnalités. Oui, votre code est maintenant structuré dans une classe plutôt que dans une liste de fonctions, mais c'est la seule différence, non?

2
Jan Fabry

Prenez 2:

Ma première réponse était ... pas juste.

Fondamentalement, PHP ne prend pas en charge l'héritage multiple. Cependant, il y a quelque chose qui peut vous rapprocher suffisamment. J'ai trouvé des références à symfony en utilisant des classes mixin, ce que j'ai utilisé avec succès dans d'autres langues.

Prenez la version 1.4.9 (stable actuelle) et faites grep -i mixin -r .

J'ai trouvé un certain nombre de références à ce sujet. Par exemple. lib/plugins/sfPropelPlugin/lib/addon/sfMixer.class.php. La documentation est un peu mince dans ce domaine, mais c'est peut-être ce dont vous avez besoin.

0
Peter Rowell