OOPスタイルで新しいプラグインを開始しています
「OOPスタイル」とはどういう意味ですか?すべての関数をクラスステートメントでラップしますか?その後、あなたはそれを間違ってやっています。クラスを名前空間として誤用しています。
そして私はちょうど私のクラスがたくさんインスタンス化されていることを知りました
え?
class Foo
{
public function __construct() {
// assuming your wp-content dir is writeable
$filename = sprintf( WP_CONTENT_DIR . '/dummyfile-%d.txt', time() );
$handle = fopen( $filename, 'w' );
if ( $handle ) {
fputs( $handle, '-' );
fclose( $handle );
}
}
}
add_action( 'plugins_loaded', function() { new Foo(); } );
それを試して、作成されたファイルの数を数えてください。試してみると、各ページリクエストごとに1つのファイルが作成されます。つまり、各ページリクエストに対してFooクラスのインスタンスは1つだけです。
アクション呼び出しを試してみましょう
class Foo
{
public function __construct() {
$this->write_file( 'in_constructor' );
add_action( 'init', array( $this, 'action_test' ), 10, 0 );
}
public function action_test() {
$this->write_file( 'in_method_with_action_call' );
}
public function write_file( $filename ) {
// assuming your wp-content dir is writeable
$counter = 1;
$fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter );
if ( file_exists( $fname ) ) {
preg_match( '/(\d)\.txt/is', $fname, $match );
if ( isset( $match[1] ) ) {
$counter = (int) $match[1] + 1;
$fname = sprintf( WP_CONTENT_DIR . '/%s-%d.txt', $filename, $counter );
}
}
$handle = fopen( $fname, 'a+' );
if ( $handle ) {
fputs( $handle, '-' );
fclose( $handle );
} else {
throw new Exception( "Cannot open file {$fname} for writing" );
}
}
}
add_action( 'plugins_loaded', function() { new Foo(); } );
wp-content dirを見ると、2つのファイルが見つかりました。もういや。クラスインスタンスが作成されると、1つのファイルが作成されます。そして、アクションの呼び出しが完了すると作成されます。
OK、インスタンスを使用してバカなことをしましょう。を削除してadd_action( 'plugins_loaded', .. )
、代わりにこのコードを追加します。
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
いくつのファイルが必要ですか?2つ期待しています。1つはコンストラクターから、もう1つはメソッドから。
新しいインスタンスは、new
演算子が使用される場合にのみ作成されます。
add_action( 'plugins_loaded', 'new_foo', 10, 0 );
function new_foo() {
// first instance
new Foo();
}
function bar( $foo ) {
$baz = $foo;
return $baz;
}
// second instance here!!
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
次に、4つのファイルをカウントします。コンストラクターから2つ、メソッドから2つ。これは、WordPressが最初にプラグインを組み込み、次にアクションフックを実行するためplugins_loaded
です。
plugins_loaded
プラグインファイルがどこか(プラグインの別のファイルなど)に含まれている場合、ファイルが含まれるたびにクラスの新しいインスタンスが作成されるため、ベストプラクティスは関数からインスタンスを作成する代わりにアクションフックを使用することです。アクションフックplugins_loaded
は、ページリクエストごとに1回だけ実行されます。