Estou iniciando um novo plugin com o estilo OOP
O que significa 'estilo OOP' significa para você? Envolvendo todas as suas funções com uma declaração de classe? Então você está fazendo errado. Você usa a classe como espaço para nome.
e acabei de descobrir que minha classe principal está sendo instanciada bastante
Hã?
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(); } );
Experimente e conte o número de arquivos criados. Se eu experimentar, há um arquivo criado para cada solicitação de página. Isso significa que apenas uma instância da classe Foo para cada solicitação de página.
Vamos tentar uma chamada de ação
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 eu procurar no meu diretório wp-content, encontrei dois arquivos. Não mais. Um arquivo é criado quando a instância da classe é criada. E um é criado quando a chamada de ação é concluída.
OK, vamos fazer algumas coisas estúpidas com a nossa instância. Remova o add_action( 'plugins_loaded', .. )
e adicione este código:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Quantos arquivos você espera? Eu espero duas. Um do construtor, outro do método.
Uma nova instância é criada apenas quando o new
operador é usado.
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 );
Agora conto quatro arquivos. Dois do construtor e dois do método Isso ocorre porque o WordPress primeiro inclui o plug-in e depois executa o gancho de ação plugins_loaded
.
A melhor prática é usar o gancho de ação em plugins_loaded
vez de criar uma instância de uma função porque, se o arquivo do plug-in estiver incluído em qualquer lugar (por exemplo, em outro arquivo do seu plug-in), uma nova instância da classe será criada toda vez que o arquivo for incluído. O gancho de ação plugins_loaded
é feito apenas uma vez para cada solicitação de página.