Eklenti Yaşam Döngüsü Belgeleri Var mı?


11

Eklentilerin yaşam döngüsünün ne olduğunu açıklayan bazı belgeler var mı?

Ben OOP tarzı ile yeni bir eklenti başlıyorum ve ben sadece benim ana sınıfı instanciated olan öğrendim çok (Xdebug ve Netbeans sayesinde).
Nedenini merak ediyorum ve bu beni rahatsız ediyor çünkü bir Dropbox-API nesnesi başlatıyorum ve gerçekten WordPress'in ana sınıfımı o kadar çok örnekleyeceğini düşünmüyordum.

Codex veya Google'daki eklentilerin yaşam döngüsü ile ilgili hiçbir şey bulamadım.


Ve burada, burada arama yaptınız mı? :)
brasofilo

20
YouPorn her zaman sınıfınızı singleton olarak tanımlayabilir stackoverflow.com/questions/203336/…
Bainternet

1
Teşekkürler. 'En iyi uygulamaları' düşünmemiştim. Kodlama yönergeleri de dahil olmak üzere, Codex üzerinde bir çok şey okudum ama burada değil .. Singleton deneyecek, ama yine de, ben php eklenti birden çok kez denir garip buluyorum .. Hayır? Bainternet otomatik tamamlama konusunda dikkatli olun :)
RitonLaJoie

brasofilo, bir singleton yapmak yardımcı olur ama şu soruya cevap vermez: kod neden eklentim içinde birden çok kez çalıştırıldı?
Bağladığınız

2
Sadece soruyu + 1'lemek zorunda kaldım. Sadece yorum ve upvotes için: D
kaiser

Yanıtlar:


3

OOP stiliyle yeni bir eklenti başlatıyorum

'OOP tarzı' sizin için ne ifade ediyor? Tüm işlevlerinizi bir sınıf ifadesiyle mi sarmak istiyorsunuz? Sonra yanlış yapıyorsun. Sınıfı ad alanı olarak yanlış kullanıyorsunuz.

ve az önce öğrendim ki ana sınıfım çok fazla örnekleniyor

Ha?

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(); } );

Deneyin ve oluşturulan dosya sayısını sayın. Ben denemek, her sayfa isteği için oluşturulan bir dosya var . Bu, her sayfa isteği için Foo sınıfının yalnızca bir örneği anlamına gelir .

Bir eylem çağrısı deneyelim

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(); } );

Eğer wp-content dizinime bakarsam, iki dosya buldum. Daha fazla yok. Sınıf örneği oluşturulduğunda bir dosya oluşturulur. Ve eylem çağrısı tamamlandığında bir tane oluşturulur.

Tamam, örneğimizle aptalca şeyler yapalım. add_action( 'plugins_loaded', .. )Bu kodu kaldırın ve bunun yerine ekleyin:

function bar( $foo ) {

    $baz = $foo;
    return $baz;
}

$f = new Foo();
$GLOBALS['foo'] = $f;

$f2 = $f;
$f3 = &$f;

$f4 = bar( $f2 );
$f5 = bar( $f3 );

Kaç dosya bekliyorsunuz? İki tane bekliyorum. Biri yapıcıdan, biri yöntemden.

Yeni bir örnek yalnızca newoperatör kullanıldığında oluşturulur.

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 );

Şimdi dört dosya sayıyorum. İki kurucudan ve iki yöntemden. Bunun nedeni, WordPress'in önce eklentiyi içermesi ve ardından eylem kancasını yapmasıdır plugins_loaded.

En iyi uygulama, plugins_loadedişlev dışında bir örnek oluşturmak yerine eylem kancasını kullanmaktır, çünkü eklenti dosyası herhangi bir yere dahil edilirse (örneğin, eklentinizin başka bir dosyasına), dosya her eklendiğinde sınıfın yeni bir örneği oluşturulur. Eylem kancası plugins_loaded, her sayfa isteği için yalnızca bir kez yapılır.


0

Ne olabilir sınıfınızın bir kopyasını bir filtreye veya eyleme geçirmenizdir. Örneğin, bir kanca veya filtre içindeki sınıf değişkenlerini doğrudan değiştirmek istiyorsanız, kancaya referans ile de geçmelisiniz.

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

onun yerine

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

Bainternet tarafından belirtildiği gibi, belirli bir nesnenin yalnızca bir kez örneklendiğinden emin olmak için tek bir desen de kullanabilirsiniz (sonraki çağrılar bu nesneye referansı döndürür).

Bazı işlevleri statik yapmayı da düşünebilirsiniz (onlara statik anahtar sözcük vererek. Bu genellikle sınıfın geri kalanıyla etkileşimde bulunmayan 'yardımcı' işlevlere yapılır. Bir sınıf somutlaştırılmadan statik yöntemler çağrılabilir.

Statik fonksiyonları bir eyleme / filtreye de aktarabilirsiniz:

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

Ayrıca http://codex.wordpress.org/Plugin_API/Action_Reference öğesini kontrol ettim ve eklentilerin yalnızca istekte iki aşamada yüklenebileceğini buldum (muplugins_loaded ve plugins_loaded).


3
Bir nesne bağımsız değişken tarafından gönderildiğinde, döndürüldüğünde veya başka bir değişkene atandığında, farklı değişkenler takma ad değildir: tanımlayıcının aynı nesneyi işaret eden bir kopyasını tutarlar. PHP kılavuzundan . Bir eylem çağrısında veya filtrede, sınıf bağımsız değişken olarak gönderilir. PHP5'ten beri referans olarak geçmeye gerek yoktur.
Ralf912

Düzeltilmiş duruyorum
Arevico
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.