Plugin Aktivierung Haken in einer abstrakten class

Ich möchte eine gemeinsame abstrakte class erstellen, um sie für jedes von mir entwickelte WordPress-Plugin zu verwenden. Als Teil des Initiationsprozesses der class möchte ich den Aktivierungs-Hook auslösen, der eine abstrakte Methode aufruft, die von der class des Kindes definiert wird.

Beispielsweise:

abstract class AbstractPlugin extends WP_Plugin { public function init() { register_activation_hook( __FILE__, array( $this, 'on_activation' ) ); register_deactivation_hook( __FILE__, array( $this, 'on_deactivation' ) ); } public abstract function on_activation(); public abstract function on_deactivation(); } 

Das erste Argument in register_activation_hook sollte jedoch der Pfad zu der Datei sein, in der die class des Kindes definiert ist, die unbekannt ist, und selbst wenn sie bekannt ist, funktioniert sie nicht.

Gibt es eine Möglichkeit, dieses Problem zu umgehen?

Solutions Collecting From Web of "Plugin Aktivierung Haken in einer abstrakten class"

Der beste Weg, um dieses Problem zu umgehen, ist nicht diese abstrakte class zu erstellen.

Kombinieren Sie niemals Objekt-Erstellung mit Geschäftslogik in derselben class. Dies wird als statisch verknüpfte Abhängigkeit und in der Regel als errorshaftes Design bezeichnet, da Sie es zur Laufzeit nicht ändern können (z. B. für Tests oder per Hooks). Vermeide inheritance .

Trennung von Sorgen und Abhängigkeitsinjektion wird das lösen.

Beispiel

 interface Plugin_Setup_Interface { public function activate( $network_wide ); public function deactivate( $network_wide ); } class Plugin_Setup implements Plugin_Setup_Interface { public function activate( $network_wide ) {} public function deactivate( $network_wide ) {} } class Plugin_Starter { private $plugin_file = ''; private $setup = NULL; public function __construct( $plugin_file, Plugin_Setup_Interface $setup = NULL ) { $this->plugin_file = $plugin_file; $this->setup = $setup; } public function init() { if ( ! is_null( $this->setup ) ) { register_activation_hook( $this->plugin_file, array ( $this->setup, 'activate' ) ); register_deactivation_hook( $this->plugin_file, array ( $this->setup, 'deactivate' ) ); } } } // call your auto-loader, then … $start = new Plugin_Starter( __FILE__, new Plugin_Setup() ); $start->init(); 

Jetzt können Sie für jedes Plugin spezielle de / activation-Routinen erstellen und trotzdem die Starterklasse wiederverwenden.