Я запускаю новий плагін зі стилем OOP
Що означає для вас стиль OOP? Обгортання всіх своїх функцій заявою класу? Тоді ти робиш це неправильно. Ви неправильно використовуєте клас як простір імен.
і я щойно дізнався, що мій основний клас багато інстанціюється
Так?
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(); } );
Якщо я заглянув у свій dp-контент, я знайшов два файли. Не більше. Один файл створюється при створенні екземпляра класу. І один створюється, коли виконується виклик дій.
Гаразд, давайте зробимо деякі дурні речі з нашим екземпляром. Видаліть 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
виконується лише один раз для кожного запиту на сторінку.