Esiste una documentazione relativa al ciclo di vita dei plug-in?


11

Esiste una documentazione da qualche parte che spiega qual è il ciclo di vita dei plugin?

Sto iniziando un nuovo plugin con stile OOP e ho appena scoperto che la mia classe principale è stata istanziata molto (grazie a Xdebug e Netbeans).
Mi chiedo perché, e mi dà fastidio perché sto istanziando un oggetto Dropbox-API, e non pensavo davvero che WordPress avrebbe semplicemente instancato la mia classe principale.

Non ho trovato nulla correlato al ciclo di vita dei plug-in nel Codice né su Google.


E qui, hai cercato qui ? :)
brasofilo,

20
YouPorn può sempre definire la classe come Singleton stackoverflow.com/questions/203336/...
Bainternet

1
Grazie. Non ho pensato alle "migliori pratiche". Ho letto molte cose sul Codex, incluse le Linee guida per la codifica, ma non è qui .. Proverò il singleton allora, ma comunque trovo strano che il plugin php venga chiamato più volte .. No? Bainternet stai attento con il tuo completamento automatico :)
RitonLaJoie

brasofilo, creare un singleton sarebbe di aiuto, ma non risponde alla domanda che è: perché il codice viene eseguito più volte nel mio plugin? La classe OO nell'URL che hai collegato sta facendo esattamente quello che faccio
RitonLaJoie

2
Ho solo dovuto fare +1 sulla domanda. Solo per il commento e voti positivi: D
Kaiser

Risposte:


3

Sto iniziando un nuovo plugin con stile OOP

Cosa significa "stile OOP" per te? Avvolgere tutte le tue funzioni con un'istruzione di classe? Allora stai sbagliando. Ti perdi la classe come spazio dei nomi.

e ho appena scoperto che la mia classe principale è stata istanziata molto

Eh?

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

Provalo e conta il numero di file creati. Se lo provo, c'è un file creato per ogni richiesta di pagina. Ciò significa che solo un'istanza della classe Foo per ogni richiesta di pagina.

Proviamo una chiamata di azione

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

Se guardo nella mia directory wp-content, ho trovato due file. Non piu. Un file viene creato quando viene creata l'istanza della classe. E uno viene creato al termine della chiamata di azione.

OK, facciamo alcune cose stupide con la nostra istanza. Rimuovi invece add_action( 'plugins_loaded', .. )e aggiungi questo codice:

function bar( $foo ) {

    $baz = $foo;
    return $baz;
}

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

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

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

Quanti file ti aspetti? Ne aspetto due. Uno dal costruttore, uno dal metodo.

Una nuova istanza viene creata solo quando newviene utilizzato l' operatore.

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

Ora conto quattro file. Due dal costruttore e due dal metodo. Questo perché WordPress include prima il plug-in e quindi esegue l'hook dell'azione plugins_loaded.

È consigliabile utilizzare l'hook dell'azione plugins_loadedanziché creare un'istanza fuori da una funzione perché, se il file del plug-in è incluso ovunque (ad es. In un altro file del plug-in), viene creata una nuova istanza della classe ogni volta che il file viene incluso. L'hook dell'azione plugins_loadedviene eseguito una sola volta per ogni richiesta di pagina.


0

Ciò che potrebbe accadere è che passi una copia della tua classe a un filtro o un'azione. Ad esempio, se si desidera modificare direttamente le variabili di classe all'interno di un hook o di un filtro, è necessario passare anche l'hook per riferimento

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

invece di

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

Come menzionato da bainternet, puoi anche utilizzare un modello singleton per assicurarti che un oggetto specifico venga istanziato una sola volta (ulteriori chiamate restituiscono il riferimento a quell'oggetto).

Potresti anche considerare di rendere statiche alcune funzioni (assegnando loro la parola chiave statica. Questo di solito viene fatto per funzioni simili a "helper" che non interagiscono con il resto della classe. I metodi statici possono essere chiamati senza istanziare una classe.

Puoi anche passare funzioni statiche a un'azione / filtro:

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

Ho anche controllato http://codex.wordpress.org/Plugin_API/Action_Reference e ho scoperto che i plugin possono essere caricati solo in due fasi della richiesta (muplugins_loaded e plugins_loaded).


3
Quando un oggetto viene inviato per argomento, restituito o assegnato a un'altra variabile, le diverse variabili non sono alias: contengono una copia dell'identificatore, che punta allo stesso oggetto. dal manuale di PHP . In una chiamata o filtro di azione, la classe viene inviata come argomento. Dal momento che PHP5 non è necessario passarlo come riferimento.
Ralf912,

Sono corretto
Arevico,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.