Có một tài liệu vòng đời Plugin?


11

Có một số tài liệu ở đâu đó giải thích vòng đời của các plugin là gì không?

Tôi đang bắt đầu một plugin mới với phong cách OOP và tôi phát hiện ra rằng lớp chính của mình đang được cung cấp rất nhiều (nhờ Xdebug và Netbeans).
Tôi tự hỏi tại sao, và điều đó làm tôi khó chịu vì tôi đang kích hoạt một đối tượng API Dropbox và tôi thực sự không nghĩ rằng WordPress sẽ kích hoạt lớp chính của mình nhiều như vậy.

Tôi chưa tìm thấy bất cứ điều gì liên quan đến vòng đời của plugin trong Codex cũng như trên Google.


Và ở đây, bạn đã tìm kiếm ở đây ? :)
brasofilo

20
YouPorn luôn có thể định nghĩa lớp của bạn là một stackoverflow.com/questions/203336/ cấp
Bai Internet

1
cảm ơn. Tôi đã không nghĩ về "thực hành tốt nhất". Tôi đã đọc rất nhiều thứ trên Codex, bao gồm cả Nguyên tắc mã hóa nhưng nó không có ở đây .. Sẽ thử bản singleton sau đó, nhưng tôi vẫn thấy lạ là plugin php được gọi nhiều lần .. Không? Hãy cẩn thận với tính năng tự động hoàn tất của bạn :)
RitonLaJoie

brasofilo, tạo một singleton sẽ giúp nhưng không trả lời câu hỏi đó là: tại sao mã được chạy nhiều lần trong plugin của tôi? Lớp OO trong URL bạn liên kết đang thực hiện chính xác những gì tôi làm
RitonLaJoie

2
Chỉ cần +1 câu hỏi. Chỉ cần bình luận và upvotes: D
kaiser

Câu trả lời:


3

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 newtoá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_loadedthay 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_loadedchỉ được thực hiện một lần cho mỗi yêu cầu trang.


0

Điều có thể xảy ra là bạn chuyển một bản sao của lớp bạn cho một bộ lọc hoặc hành động. Ví dụ: nếu bạn muốn sửa đổi trực tiếp các biến lớp trong một hook hoặc bộ lọc, bạn cũng nên chuyển hook theo tham chiếu

add_action("some_action",array(&$this,"somefunction"))

thay vì

add_action("some_action",array($this,"somefunction"))

Như được đề cập bởi bai Internet, bạn cũng có thể sử dụng một mẫu singleton để đảm bảo rằng một đối tượng cụ thể chỉ được kích hoạt một lần (các cuộc gọi tiếp theo trả về tham chiếu đến đối tượng đó).

Bạn cũng có thể xem xét làm cho một số hàm tĩnh (bằng cách cung cấp cho chúng từ khóa tĩnh. Điều này thường được thực hiện đối với các hàm giống như 'người trợ giúp' không tương tác với phần còn lại của lớp. Các phương thức tĩnh có thể được gọi mà không tạo ra một lớp.

Bạn cũng có thể chuyển các hàm tĩnh cho một hành động / bộ lọc:

add_action("some_action",array("ClassName","Method"))

Tôi cũng đã kiểm tra http://codex.wordpress.org/Plugin_API/Action_Reference và thấy rằng các plugin chỉ có thể được tải ở hai giai đoạn trong yêu cầu (muplugins_loaded và plugins_loaded).


3
Khi một đối tượng được gửi bằng đối số, được trả về hoặc được gán cho một biến khác, các biến khác nhau không phải là bí danh: chúng giữ một bản sao của mã định danh, trỏ đến cùng một đối tượng. từ hướng dẫn PHP . Trong một cuộc gọi hành động hoặc bộ lọc, lớp được gửi dưới dạng đối số. Vì PHP5 không cần phải vượt qua nó làm tài liệu tham khảo.
Ralf912

Tôi đứng chính xác
Arevico
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.