いいえ、直接ではなく、フックを使用してクラスを「初期化」またはインスタンス化することはできません。いくつかの追加コードが常に必要です(そして、自分でワームの缶を開けているので、それを行うことができるのは望ましいことではありません。
より良い方法は次のとおりです。
class MyClass {
function __construct() {
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
function getStuffDone() {
// .. This is where stuff gets done ..
}
}
$var = new MyClass();
もちろん、インターフェイスクラスを作成して、一般的な場合のためにそれをさらに単純化することもできます。
class IGetStuffDone {
function IGetStuffDone(){
add_action( 'admin_init',array( $this, 'getStuffDone' ) );
}
public abstract function getStuffDone();
}
インターフェイスとして、このタイプのオブジェクトを直接作成することはできませんが、サブクラスを作成して、次のように言うことができます。
class CDoingThings extends IGetStuffDone {
function getStuffDone(){
// doing things
}
}
$var = new CDoingThings();
これにより、すべてのフックが自動的に追加され、サブクラスで何が行われているかを正確に定義して作成するだけです!
コンストラクター
私はコンストラクタをフック関数として追加しません。それは悪い習慣であり、多くの異常なイベントを引き起こす可能性があります。また、ほとんどの言語では、コンストラクターはインスタンス化されているオブジェクトを返すため、フックがフィルターのようなものを返す必要がある場合、必要に応じてフィルターされた変数を返すのではなく、クラスオブジェクトを返します。
コンストラクターまたはデストラクターを呼び出すことは、どの言語を使用しているかに関係なく、非常に非常に悪いプログラミングプラクティスであり、決して実行すべきではありません。
コンストラクターは、実際の作業ではなく、使用できる状態に初期化するためにオブジェクトも構築する必要があります。オブジェクトによって行われる作業は、別の関数で行う必要があります。
静的クラスメソッド、およびインスタンス化/初期化をまったく必要としない
クラスメソッドが静的なクラスメソッドである場合、$this
以下に示すように引用符でクラスの名前を渡すことができます。
class MyClass {
public static function getStuffDone() {
// .. This is where stuff gets done ..
}
}
add_action( 'admin_init', array('MyClass','getStuffDone' ) );
クロージャーとPHP 5.3
悲しいことに、新しいクラスを作成する行を避けることはできません。それをスキップする唯一の他の解決策は、まだその行を持っているボイラープレートコードを含み、PHP 5.3+を必要とします:
add_action('admin_init',function(){
$var = new MyClass();
$var->getStuffDone();
});
その時点で、クラスをスキップして、関数を使用するだけでもかまいません。
add_action('admin_init',function(){
// do stuff
});
ただし、匿名関数のスペクターを導入したことに注意してください。を使用して上記のアクションを削除する方法はありません。remove_action
これは、他の人のコードで作業しなければならない開発者にとって大きな痛みを引き起こす可能性があります。
アンパサンドについて
次のようなアクションが表示される場合があります。
array( &$this, 'getStuffDone' );
これは悪いです。&
PHP 4では、オブジェクトが参照としてではなく値として渡されたときに追加されました。PHP 4は10年以上前のものであり、WordPressで長い間サポートされていません。
存在しない理由を使用する&this
フックやフィルタを追加するときは、参照を削除しても問題が発生しないだろう、とさえPHPの将来のバージョンとの互換性を向上させることが
代わりにこれを使用してください:
array( $this, 'getStuffDone' );