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 new
viene 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_loaded
anziché 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_loaded
viene eseguito una sola volta per ogni richiesta di pagina.