Я запускаю новый плагин в стиле ООП
Что для вас значит «стиль ООП»? Обернуть все ваши функции оператором класса? Тогда вы делаете это неправильно. Вы пропускаете класс как пространство имен.
и я только что узнал, что мой основной класс часто создается
А?
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(); } );
Попробуйте и посчитайте количество созданных файлов. Если я попробую, то для каждого запроса страницы будет создан один файл. Это означает, что только один экземпляр класса Foo для каждого запроса страницы.
Давайте попробуем призыв к действию
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(); } );
Если я загляну в мой каталог wp-content, я найду два файла. Больше не надо. Один файл создается при создании экземпляра класса. И один создается, когда вызов действия сделан.
Хорошо, давайте сделаем некоторые глупости с нашим экземпляром. Удалите add_action( 'plugins_loaded', .. )
и добавьте этот код:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Сколько файлов вы ожидаете? Я ожидаю два. Один из конструктора, один из метода.
Новый экземпляр создается только при использовании new
оператора.
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 );
Сейчас я считаю четыре файла. Два из конструктора и два из метода. Это потому, что WordPress сначала включает плагин, а затем выполняет действие plugins_loaded
.
Рекомендуется использовать ловушку действия plugins_loaded
вместо создания экземпляра из функции, потому что, если файл плагина включен где-либо (например, в другом файле вашего плагина), новый экземпляр класса создается каждый раз, когда файл включается. Хук действия plugins_loaded
выполняется только один раз для каждого запроса страницы.