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' );
$class
comme nom de variable, ces mots ont tendance à être réservés. Je pense que vous vous efforcez d'éviter de dire quelque chose de similaire à$x = new Y();
la portée mondiale, et vous ajoutez de la complexité là où aucune n'est nécessaire. Votre tentative de réduire la quantité de code écrite a impliqué d’écrire plus de code!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Exemple de classe
Remarques:
! class_exists
pour éviter de l'appeler deux fois et placez l'appelant init à l'intérieurinit
fonction et la classe varstatic
new self
.Voici un exemple
Php 5+
S'il vous plaît , laissez le
&
dehors. Nous sommes déjà au-delà de php4. :)la source
la source
Vous pouvez déclencher des événements dans votre classe sans avoir à le charger initialement . C'est pratique si vous ne voulez pas charger toute la classe à l'avance, mais que vous devez accéder aux filtres et actions WordPress.
Voici un exemple très simple
Ceci est une version très simplifiée de la réponse de Kaiser mais montre en termes simples le comportement. Pourrait être utile pour ceux qui regardent ce style pour la première fois.
D'autres méthodes peuvent toujours initier l'objet si nécessaire. Personnellement, j'utilise cette méthode pour autoriser des parties facultatives de mon plug-in à mettre en file d'attente des scripts, mais uniquement en déclenchant l'objet sur une requête AJAX.
la source
Cela fonctionne pour moi:
la source
De manière générale, vous n’ajoutez pas une classe entière à un crochet. Les
add_action()
/add_filter()
hooks attendent des fonctions de rappel , qui peuvent être référencées depuis une classe .Disons que vous avez une
init()
fonction dans votre classe, que vous voulez accrocher au hook WordPressinit
.Mettez votre
add_action()
appel dans votre classe, puis identifiez le rappel comme suit:(Remarque: je suppose que votre classe utilise correctement les noms, sinon, assurez-vous de nommer vos fonctions de rappel.)
la source
init
(ou partout où vous en avez besoin)?Vous devriez pouvoir le faire en passant le nom de la classe à la place de l'objet instancié:
(En théorie, votre autre solution devrait aussi fonctionner
Je ne sais pas pourquoi. Peut-être que si vous n'appelez pas par référence?)
la source
init
méthode statique . Voir wordpress.stackexchange.com/a/48093/14052