Apakah Ada Dokumentasi Siklus Hidup Plugin?

11

Apakah ada beberapa dokumentasi di suatu tempat yang menjelaskan bagaimana siklus hidup plugin?

Saya memulai plugin baru dengan gaya OOP, dan saya baru tahu bahwa kelas utama saya banyak di- instanciated (terima kasih kepada Xdebug dan Netbeans).
Saya bertanya-tanya mengapa, dan itu mengganggu saya karena saya meng-instanci objek Dropbox-API, dan saya benar-benar tidak berpikir WordPress hanya akan membuat kelas utama saya terlalu banyak.

Saya belum menemukan sesuatu yang berhubungan dengan siklus hidup plugin di Codex maupun di Google.

RitonLaJoie
sumber
Dan di sini, sudahkah Anda mencari di sini ? :)
brasofilo
20
YouPorn selalu dapat mendefinisikan kelas Anda sebagai stackoverflow.com/questions/203336/…
Bainternet
1
Terima kasih. Saya tidak memikirkan 'praktik terbaik'. Saya membaca banyak hal di Codex, termasuk Coding Guidelines tetapi tidak ada di sini .. Akan mencoba singleton, tapi tetap saja, saya merasa aneh bahwa plugin php disebut berkali-kali .. Tidak? Bainternet berhati-hatilah dengan autocomplete Anda :)
RitonLaJoie
brasofilo, membuat singleton akan membantu tetapi tidak menjawab pertanyaan yaitu: mengapa kode dijalankan beberapa kali di dalam plugin saya? Kelas OO di URL yang Anda
tautkan
2
Baru saja memberi +1 pertanyaan. Hanya untuk komentar dan tanggapan: D
kaiser

Jawaban:

3

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 newoperator 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_loadedalih-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_loadeddilakukan hanya sekali untuk setiap permintaan halaman.

Ralf912
sumber
0

Apa yang mungkin terjadi adalah Anda menyerahkan salinan kelas Anda ke filter atau tindakan. Misalnya, jika Anda ingin secara langsung mengubah variabel kelas di dalam sebuah kail atau filter Anda juga harus melewati kail dengan referensi

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

dari pada

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

Seperti yang disebutkan oleh bainternet, Anda juga dapat menggunakan pola singleton untuk memastikan bahwa objek tertentu hanya akan dimunculkan sekali saja (panggilan selanjutnya mengembalikan referensi ke objek itu).

Anda juga dapat mempertimbangkan membuat beberapa fungsi statis (dengan memberi mereka kata kunci statis. Ini biasanya dilakukan untuk fungsi 'pembantu' yang tidak berinteraksi dengan anggota kelas lainnya. Metode statis dapat dipanggil tanpa memunculkan kelas.

Anda juga dapat meneruskan fungsi statis ke tindakan / filter:

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

Saya juga memeriksa http://codex.wordpress.org/Plugin_API/Action_Reference dan menemukan bahwa plugin hanya dapat dimuat pada dua tahap dalam permintaan (muplugins_loaded dan plugins_loaded).

Arevico
sumber
3
Ketika suatu objek dikirim dengan argumen, dikembalikan atau ditugaskan ke variabel lain, variabel yang berbeda bukan alias: mereka memegang salinan pengidentifikasi, yang menunjuk ke objek yang sama. dari manual PHP . Dalam panggilan tindakan atau filter, kelas dikirim sebagai argumen. Karena PHP5 tidak perlu meneruskannya sebagai referensi.
Ralf912
Saya berdiri dikoreksi
Arevico