Tôi đang bắt đầu một plugin mới với phong cách OOP
"Phong cách OOP" nghĩa là gì đối với bạn? Bao bọc tất cả các chức năng của bạn với một tuyên bố lớp? Sau đó, bạn làm sai. Bạn bỏ lỡ lớp như không gian tên.
và tôi phát hiện ra rằng lớp học chính của tôi đang được truyền tải rất nhiều
Huh?
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(); } );
Hãy thử nó và đếm số lượng tập tin được tạo ra. Nếu tôi thử nó, có một tệp được tạo cho mỗi yêu cầu trang. Điều này có nghĩa, chỉ một phiên bản của lớp Foo cho mỗi yêu cầu trang.
Hãy thử một cuộc gọi hành động
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(); } );
Nếu tôi tìm trong thư mục nội dung wp của mình, tôi đã tìm thấy hai tệp. Không còn nữa. Một tệp được tạo khi thể hiện của lớp được tạo. Và một được tạo khi cuộc gọi hành động được thực hiện.
OK, chúng ta hãy làm một số điều ngu ngốc với ví dụ của chúng tôi. Xóa add_action( 'plugins_loaded', .. )
và thêm mã này thay thế:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Bạn mong đợi bao nhiêu tập tin? Tôi mong đợi hai. Một từ phương thức khởi tạo, một từ phương thức.
Một phiên bản mới chỉ được tạo khi new
toán tử được sử dụng.
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 );
Bây giờ tôi đếm bốn tập tin. Hai từ phương thức khởi tạo và hai từ phương thức. Điều này là do WordPress trước tiên bao gồm plugin và sau đó thực hiện hành động hookplugins_loaded
.
Cách thực hành tốt nhất là sử dụng hook hành động plugins_loaded
thay vì tạo một thể hiện ra khỏi hàm bởi vì, nếu tệp plugin được bao gồm ở bất cứ đâu (ví dụ: trong một tệp khác của plugin của bạn), một thể hiện mới của lớp được tạo ra mỗi khi tệp được bao gồm. Móc hành động plugins_loaded
chỉ được thực hiện một lần cho mỗi yêu cầu trang.