Ich starte ein neues Plugin mit OOP-Stil
Was bedeutet "OOP-Stil" für Sie? Alle Ihre Funktionen mit einer Klassenanweisung abschließen? Dann machst du es falsch. Sie missbrauchen die Klasse als Namespace.
und ich habe gerade herausgefunden, dass meine Hauptklasse viel instanziiert wird
Huh?
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(); } );
Probieren Sie es aus und zählen Sie die Anzahl der erstellten Dateien. Wenn ich es ausprobiere, wird für jede Seitenanforderung eine Datei erstellt. Dies bedeutet, dass für jede Seitenanforderung nur eine Instanz der Foo-Klasse vorhanden ist.
Versuchen wir es mit einem Aktionsaufruf
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(); } );
Wenn ich in mein wp-Inhaltsverzeichnis schaue, habe ich zwei Dateien gefunden. Nicht mehr. Eine Datei wird erstellt, wenn die Klasseninstanz erstellt wird. Und eine wird erstellt, wenn der Aktionsaufruf abgeschlossen ist.
OK, lass uns ein paar dumme Sachen mit unserer Instanz machen. Entfernen Sie das add_action( 'plugins_loaded', .. )
und fügen Sie stattdessen diesen Code hinzu:
function bar( $foo ) {
$baz = $foo;
return $baz;
}
$f = new Foo();
$GLOBALS['foo'] = $f;
$f2 = $f;
$f3 = &$f;
$f4 = bar( $f2 );
$f5 = bar( $f3 );
Wie viele Dateien erwarten Sie? Ich erwarte zwei. Eine vom Konstruktor, eine von der Methode.
Eine neue Instanz wird nur erstellt, wenn der new
Operator verwendet wird.
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 );
Jetzt zähle ich vier Dateien. Zwei vom Konstruktor und zwei von der Methode. Dies liegt daran, dass WordPress zuerst das Plugin einbindet und dann den Aktions-Hook ausführt plugins_loaded
.
Es wird empfohlen, den Aktions-Hook zu verwenden, plugins_loaded
anstatt eine Instanz aus einer Funktion zu erstellen. Wenn die Plug-in-Datei an einer beliebigen Stelle enthalten ist (z. B. in einer anderen Datei Ihres Plug-ins), wird jedes Mal, wenn die Datei enthalten ist, eine neue Instanz der Klasse erstellt. Der Aktions-Hook plugins_loaded
wird für jede Seitenanforderung nur einmal ausgeführt.