Nein, Sie können die Klasse nicht direkt über einen Hook 'initialisieren' oder instanziieren. Es wird immer zusätzlicher Code benötigt (und es ist nicht wünschenswert, dies zu tun, da Sie selbst eine Dose Würmer öffnen.
Hier ist eine bessere Möglichkeit:
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
Natürlich könnte man eine Interface-Klasse erstellen, um sie für den allgemeinen Fall noch weiter zu vereinfachen:
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
Beachten Sie, dass Sie als Schnittstelle ein Objekt dieses Typs nicht direkt erstellen können, sondern eine Unterklasse mit den folgenden Worten erstellen können:
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
Um dann automatisch alle Haken hinzuzufügen, müssen Sie nur definieren, was genau in einer Unterklasse gemacht wird, und es dann erstellen!
Auf Konstruktoren
Ich würde keinen Konstruktor als Hook-Funktion hinzufügen, das ist eine schlechte Praxis und kann zu vielen ungewöhnlichen Ereignissen führen. Auch in den meisten Sprachen gibt ein Konstruktor das Objekt zurück, das instanziiert wird. Wenn Ihr Hook also etwas wie in einem Filter zurückgeben muss, gibt er die gefilterte Variable nicht wie gewünscht zurück, sondern das Klassenobjekt.
Das Aufrufen eines Konstruktors oder eines Destruktors ist eine sehr, sehr, sehr schlechte Programmierpraxis, unabhängig davon, in welcher Sprache Sie sich befinden, und sollte niemals durchgeführt werden.
Konstruktoren sollten auch Objekte konstruieren, um sie gebrauchsfertig zu initialisieren, nicht für die eigentliche Arbeit. Die vom Objekt auszuführende Arbeit sollte in einer separaten Funktion erfolgen.
Statische Klassenmethoden, die überhaupt nicht instanziiert / initialisiert werden müssen
Wenn es sich bei Ihrer Klassenmethode um eine statische Klassenmethode handelt, können Sie den Namen der Klasse in Anführungszeichen anstatt $this
wie unten gezeigt übergeben:
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
Closures & PHP 5.3
Leider können Sie nicht vermeiden, dass die Linie die neue Klasse erstellt. Die einzige andere Lösung zum Überspringen wäre Kesselplattencode, der noch diese Zeile enthält, und würde PHP 5.3+ erfordern, zB:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
An diesem Punkt können Sie die Klasse auch überspringen und einfach eine Funktion verwenden:
add_action('admin_init',function(){
// do stuff
});
Denken Sie jedoch daran, dass Sie jetzt das Gespenst der anonymen Funktionen eingeführt haben. Es gibt keine Möglichkeit, die oben genannte Aktion mit zu entfernen. remove_action
Dies kann und bereitet Entwicklern, die mit dem Code anderer Leute arbeiten müssen, große Schmerzen.
Auf kaufmännischem und
Möglicherweise werden folgende Aktionen angezeigt:
array( &$this, 'getStuffDone' );
Das ist schlimm . &
wurde wieder in PHP 4 hinzugefügt, als Objekte als Werte und nicht als Referenzen übergeben wurden. PHP 4 ist mehr als ein Jahrzehnt alt und wurde von WordPress seit langem nicht mehr unterstützt.
Es gibt keinen Grund , &this
beim Hinzufügen von Hooks und Filtern zu verwenden, und das Entfernen der Referenz verursacht keine Probleme und kann sogar die Kompatibilität mit zukünftigen Versionen von PHP verbessern
Verwenden Sie dies stattdessen:
array( $this, 'getStuffDone' );
$class
als Variablennamen zu verwenden, sind diese Wörter eher reserviert. Ich denke, Sie geben sich viel Mühe, um zu vermeiden, etwas Ähnliches wie$x = new Y();
im globalen Rahmen zu sagen , und Sie fügen Komplexität hinzu, wo keine Notwendigkeit besteht. Ihr Versuch, die Menge des geschriebenen Codes zu reduzieren, hat das Schreiben von mehr Code erforderlich gemacht!add_action( 'admin_init', array('MyNamespace\MyClass','getStuffDone' ) );
Beispielklasse
Anmerkungen:
! class_exists
, um zu vermeiden, dass es zweimal aufgerufen wird, und platzieren Sie den Init-Aufrufer darininit
Funktion und die Klasse varstatic
new self
.Hier ist ein Beispiel
Php 5+
Bitte lassen Sie das
&
aus. Wir sind schon jenseits von PHP4. :)quelle
quelle
Sie können Ereignisse in Ihrer Klasse auslösen, ohne sie zuerst laden zu müssen . Dies ist praktisch, wenn Sie nicht die gesamte Klasse im Voraus laden möchten, sondern auf die WordPress-Filter und -Aktionen zugreifen müssen.
Hier ist ein sehr einfaches Beispiel
Dies ist eine sehr vereinfachte Version von Kaisers Antwort, zeigt aber in einfachen Worten das Verhalten. Könnte nützlich sein für diejenigen, die sich zum ersten Mal mit diesem Stil beschäftigen.
Andere Methoden können das Objekt bei Bedarf dennoch initiieren. Ich persönlich benutze diese Methode, um es optionalen Teilen meines Plugins zu ermöglichen, Skripte in die Warteschlange zu stellen, aber nur das Objekt bei einer AJAX-Anfrage auszulösen.
quelle
Das funktioniert bei mir:
quelle
Im Allgemeinen würden Sie einem Hook keine ganze Klasse hinzufügen . Der
add_action()
/add_filter()
Haken erwartet Rückruffunktionen , die können aus referenziert werden innerhalb einer Klasse .Angenommen, Sie haben eine
init()
Funktion in Ihrer Klasse, die Sie in den WordPress-init
Hook einbinden möchten .Platzieren Sie Ihren
add_action()
Anruf in Ihrer Klasse und identifizieren Sie den Rückruf folgendermaßen:(Hinweis: Ich gehe davon aus, dass Ihre Klasse einen korrekten Namespace hat. Andernfalls müssen Sie sicherstellen, dass Ihre Rückruffunktionen einen Namespace haben.)
quelle
init
(oder wo immer Sie es brauchen)?Sie sollten in der Lage sein, dies zu tun, indem Sie den Klassennamen anstelle des instanziierten Objekts übergeben:
(Theoretisch sollte auch Ihre andere Lösung funktionieren
Ich bin mir nicht sicher, warum es nicht so ist. Vielleicht, wenn Sie nicht per Referenz anrufen?)
quelle
init
Methode aufrufen . Siehe wordpress.stackexchange.com/a/48093/14052