Saya memulai plugin baru dengan gaya OOP
Apa arti 'gaya OOP' bagi Anda? Membungkus semua fungsi Anda dengan pernyataan kelas? Maka Anda salah melakukannya. Anda salah menggunakan kelas sebagai namespace.
dan saya baru tahu bahwa kelas utama saya banyak di-instanciated
Hah?
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(); } );
Cobalah dan hitung jumlah file yang dibuat. Jika saya mencobanya, ada satu file yang dibuat untuk setiap permintaan halaman. Ini berarti, hanya satu instance kelas Foo untuk setiap permintaan halaman.
Mari kita coba panggilan aksi
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(); } );
Jika saya melihat di dir konten wp saya, saya menemukan dua file. Tidak lagi. Satu file dibuat ketika instance kelas dibuat. Dan satu dibuat ketika panggilan aksi dilakukan.
OK, mari kita lakukan beberapa hal bodoh dengan contoh kita. Hapus add_action( 'plugins_loaded', .. )
dan tambahkan kode ini sebagai gantinya:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Berapa banyak file yang Anda harapkan? Saya mengharapkan dua. Satu dari konstruktor, satu dari metode.
Mesin virtual baru dibuat hanya ketika new
operator digunakan.
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 );
Sekarang saya menghitung empat file. Dua dari konstruktor dan dua dari metode. Ini karena WordPress pertama memasukkan plugin dan kemudian melakukan hook tindakan plugins_loaded
.
Praktik terbaik adalah dengan menggunakan kait tindakan plugins_loaded
alih-alih membuat turunan dari suatu fungsi karena, jika file plugin disertakan di mana saja (misalnya dalam file plugin lainnya), instance kelas baru dibuat setiap kali file disertakan. Kait tindakan plugins_loaded
dilakukan hanya sekali untuk setiap permintaan halaman.