OOP stiliyle yeni bir eklenti başlatıyorum
'OOP tarzı' sizin için ne ifade ediyor? Tüm işlevlerinizi bir sınıf ifadesiyle mi sarmak istiyorsunuz? Sonra yanlış yapıyorsun. Sınıfı ad alanı olarak yanlış kullanıyorsunuz.
ve az önce öğrendim ki ana sınıfım çok fazla örnekleniyor
Ha?
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(); } );
Deneyin ve oluşturulan dosya sayısını sayın. Ben denemek, her sayfa isteği için oluşturulan bir dosya var . Bu, her sayfa isteği için Foo sınıfının yalnızca bir örneği anlamına gelir .
Bir eylem çağrısı deneyelim
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(); } );
Eğer wp-content dizinime bakarsam, iki dosya buldum. Daha fazla yok. Sınıf örneği oluşturulduğunda bir dosya oluşturulur. Ve eylem çağrısı tamamlandığında bir tane oluşturulur.
Tamam, örneğimizle aptalca şeyler yapalım. add_action( 'plugins_loaded', .. )
Bu kodu kaldırın ve bunun yerine ekleyin:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Kaç dosya bekliyorsunuz? İki tane bekliyorum. Biri yapıcıdan, biri yöntemden.
Yeni bir örnek yalnızca new
operatör kullanıldığında oluşturulur.
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 );
Şimdi dört dosya sayıyorum. İki kurucudan ve iki yöntemden. Bunun nedeni, WordPress'in önce eklentiyi içermesi ve ardından eylem kancasını yapmasıdır plugins_loaded
.
En iyi uygulama, plugins_loaded
işlev dışında bir örnek oluşturmak yerine eylem kancasını kullanmaktır, çünkü eklenti dosyası herhangi bir yere dahil edilirse (örneğin, eklentinizin başka bir dosyasına), dosya her eklendiğinde sınıfın yeni bir örneği oluşturulur. Eylem kancası plugins_loaded
, her sayfa isteği için yalnızca bir kez yapılır.