Non, vous ne pouvez pas «initialiser» ou instancier la classe par un crochet, pas directement. Certains codes supplémentaires sont toujours nécessaires (et ce n’est pas souhaitable de pouvoir le faire, car vous ouvrez une boîte de Pandore.
Voici une meilleure façon de le faire:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Bien sûr, on pourrait créer une classe d'interface pour la simplifier encore plus pour le cas général:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Notez qu'en tant qu'interface, vous ne pouvez pas créer directement un objet de ce type, mais vous pouvez créer une sous-classe en vous permettant de dire:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Ce qui ajouterait ensuite automatiquement tous les points d'accroche, il vous suffira de définir ce qui est exactement fait dans une sous-classe, puis de le créer!
Sur les constructeurs
Je n’ajouterais pas de constructeur en tant que fonction de hook, c’est une mauvaise pratique, et je peux mener beaucoup d’événements inhabituels. De même, dans la plupart des langages, un constructeur renvoie l'objet en cours d'instanciation. Par conséquent, si votre hook doit renvoyer quelque chose comme dans un filtre, il ne renverra pas la variable filtrée comme vous le souhaitez, mais plutôt l'objet de classe.
Appeler un constructeur ou un destructeur est une très, très très mauvaise pratique de programmation, quelle que soit la langue dans laquelle vous vous trouvez, et ne devrait jamais être utilisé.
Les constructeurs doivent également construire des objets, pour les initialiser, prêts à être utilisés et non pour le travail réel. Le travail à effectuer par l'objet doit être dans une fonction distincte.
Méthodes de classe statiques, et n'ayant pas du tout besoin d'instancier / initialiser
Si votre méthode de classe est une méthode de classe statique, vous pouvez passer le nom de la classe entre guillemets plutôt que $this
comme indiqué ci-dessous:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Fermetures et PHP 5.3
Malheureusement, vous ne pouvez pas éviter la ligne créant la nouvelle classe. La seule autre solution à éviter consiste à utiliser un code de plaque de chaudière contenant toujours cette ligne et nécessitant PHP 5.3+, par exemple:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
À ce stade, vous pouvez également ignorer la classe et utiliser simplement une fonction:
add_action('admin_init',function(){
// do stuff
});
Mais gardez à l'esprit que vous avez maintenant introduit le spectre des fonctions anonymes. Il n'y a aucun moyen de supprimer l'action ci-dessus en utilisant remove_action
, et cela peut causer des problèmes aux développeurs qui doivent travailler avec du code d'autrui.
Sur les esperluettes
Vous pouvez voir des actions utilisées comme ceci:
array( &$this, 'getStuffDone' );
C'est mauvais . &
a été rajouté en PHP 4 lorsque les objets étaient passés en tant que valeurs et non en tant que références. PHP 4 a plus de dix ans et n’a pas été supporté par WordPress depuis très longtemps.
Il n'y a aucune raison d'utiliser &this
lors de l'ajout de points d'ancrage et de filtres, et la suppression de la référence ne posera aucun problème et pourrait même améliorer la compatibilité avec les futures versions de PHP.
Utilisez ceci à la place:
array( $this, 'getStuffDone' );