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' );