ฉันกำลังเริ่มปลั๊กอินใหม่ที่มีสไตล์ OOP
'OOP style' หมายถึงอะไรสำหรับคุณ ห่อฟังก์ชั่นทั้งหมดของคุณด้วยคำสั่งคลาส? จากนั้นคุณทำผิด คุณคิดถึงคลาสเป็น namespace
และฉันเพิ่งค้นพบว่าชั้นเรียนหลักของฉันกำลังได้รับการดัดแปลงมากมาย
ฮะ?
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(); } );
ลองและนับจำนวนไฟล์ที่สร้าง หากฉันลองใช้จะมีไฟล์หนึ่งไฟล์ที่สร้างขึ้นสำหรับคำขอแต่ละหน้า ซึ่งหมายความว่ามีเพียงอินสแตนซ์เดียวของคลาส Foo สำหรับคำขอแต่ละหน้า
ลองเรียกการกระทำ
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(); } );
หากฉันดู dir เนื้อหา wp ของฉันฉันพบสองไฟล์ ไม่มีอีกแล้ว หนึ่งไฟล์ถูกสร้างขึ้นเมื่อสร้างอินสแตนซ์ของคลาส และหนึ่งจะถูกสร้างขึ้นเมื่อมีการเรียกการดำเนินการ
ตกลงเรามาทำสิ่งที่งี่เง่ากับตัวอย่างของเรา ลบ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 );
คุณคาดหวังว่าจะมีกี่ไฟล์ ฉันคาดหวังสอง หนึ่งจากตัวสร้างหนึ่งจากวิธีการ
อินสแตนซ์ใหม่จะถูกสร้างขึ้นเฉพาะเมื่อมี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 );
ตอนนี้ฉันนับสี่ไฟล์ สองจากตัวสร้างและสองจากวิธีการ นี่เป็นเพราะ WordPress มีปลั๊กอินก่อนแล้วจึงทำการเชื่อมplugins_loaded
ต่อ
แนวทางปฏิบัติที่ดีที่สุดคือการใช้ action hook plugins_loaded
แทนที่จะสร้างอินสแตนซ์ออกจากฟังก์ชั่นเพราะหากไฟล์ปลั๊กอินถูกรวมไว้ที่ใดก็ได้ (เช่นในไฟล์อื่นของปลั๊กอินของคุณ) อินสแตนซ์ใหม่ของคลาสจะถูกสร้างขึ้นทุกครั้งที่รวมไฟล์ เบ็ดการดำเนินการplugins_loaded
จะทำเพียงครั้งเดียวสำหรับทุกการร้องขอหน้า