Sollten die Funktionen bei der Entwicklung eines Plugins zu einer Klasse zusammengefasst werden, um Namespace-Konflikte zu vermeiden?
Ja, aber das ist nur eines der kleinen Argumente. Tatsächlich ist das nicht die "wahre" Natur einer Klasse in OOAD .
Verursacht die Verwendung von Klassen einen Performance-Overhead für PHP?
Nein, nicht besonders. Schlechtes Design und / oder schlecht geschriebener Code oder vorzeitige Optimierung verursachen weitaus mehr Leistungsprobleme als tatsächliche Sprachfunktionen.
Sollten bei einem Leistungstreffer stattdessen Funktionsnamen vorab festgelegt werden?
Wie geschrieben, gibt es keine Leistungseinbußen. Schlecht geschriebener Code ist eher ein Leistungsverlust als gut geschriebener Code, der mehr Codezeilen enthält, Sie jedoch nicht zu schlechten Dingen zwingt.
Endeffekt:
Sie können Klassen für Plugins unterschiedlich nutzen. Sie können sie nur verwenden, um eine Art Namespace zu haben, und sie "nur" für globale Funktionen verwenden. Die direkteste Form davon sind statische Klassenfunktionen. Das folgende Codebeispiel zeigt beide, zuerst globale Funktionen, dann globale statische Klassenfunktionen:
/* global function */
function myplug_hook()
{
}
add_filter('the_hook', 'myplug_hook');
/* global static function */
class myplug
{
public static function hook()
{
}
}
add_filter('the_hook', 'myplug::hook');
Dies ist nur ein kleines Beispiel, das zeigt, dass Sie mehr für den einzelnen Haken eingeben müssen. Außerdem wird gezeigt, wie der Namespace funktioniert: Sie können den Namen einer einzelnen Klasse einfacher ersetzen, um alle statischen Funktionen umzubenennen und dann zu suchen und zu ersetzen, myplug::
was myplug_
aufgrund von Fehlalarmen schwieriger sein könnte . Aber am Ende gibt es keinen großen Unterschied.
Der entscheidende Punkt ist: Statische Klassenfunktionen Docs sind nicht wirklich viel anderes als globale Funktionen Docs .
Und dieses Beispiel zeigt auch: Namespacing ist in Ordnung, aber bei worpdress hört der Namespacing bei Verwendung von Hooks auf: Die Callback-Funktion ist hartcodiert, daher der Vorteil des Namespacing mit der Klasse (eine Stelle für den Basisnamen, den Klassennamen) nicht Hilfe, wenn Sie Ihren Code mit WordPress für die Hook-Namen eingreifen.
Der eigentliche Vorteil beginnt mit der Verwendung von tatsächlichen Klasseninstanzen und nicht statischen Funktionen. Dies hat den Vorteil, dass Sie anfangen können, OO-Prinzipien anzuwenden, und Ihren Code rationalisieren können. Statische Klassenfunktionen sind eher ein Problem als eine Lösung.
Dann ist es mehr als nur syntaktischer Zucker.
Entscheidend ist: Machen Sie etwas, das Ihnen hilft, den Code zu schreiben, mit dem Sie problemlos umgehen und den Sie warten können. Überbewerten Sie die Leistung nicht, das ist ein häufiger Fehler. Wichtiger ist, dass Sie Code schreiben, der einfach zu lesen und zu verstehen ist und der genau das tut, was Sie brauchen. Vielleicht ist diese Frage und Antwort hilfreich für ein größeres Bild in diesem Zusammenhang: Multiple Custom Metabox Help .
Ein gängiger Ansatz, den ich auch bei kleineren Plugins habe, ist die Verwendung einer statischen Hilfsfunktion, um das Plugin zu instanziieren. Der Rest befindet sich dann in der Plugin-Instanz. Dies hilft, die Haupt-Plug-in-Logik zu kapseln, und es hat den Vorteil, dass Namespaces mit den Hooks verwendet werden können, was mit globalen Standardfunktionen nicht möglich ist. Das folgende Codebeispiel zeigt das Muster:
<?php
/** Plugin Headers ... */
return MyPlugin::bootstrap();
class MyPlugin
{
/** @var MyPlugin */
static $instance;
static public function bootstrap() {
if (NULL === self::$instance) {
self::$instance = new __CLASS__;
}
return self::$instance;
}
# ...
}
Dies ist ein allgemeines Muster, das ich für die Basis-Plugin-Datei verwende. Die Plugin-Klasse repräsentiert einerseits das Plugin für WordPress und ermöglicht andererseits, objektorientierte Paradigmen für den eigenen Code zu verwenden, die sogar vollständig objektorientiert sein können (aber nicht müssen). Es ist eine Art Controller, der mit der gesamten WordPress-API als Anfrage (n) verbunden ist.
Wie das Beispiel zeigt, wird eine Instanz des Plugins erstellt. Auf diese Weise können Sie bekannte Commons wie Constructor Docs ( __construct
) verwenden , um das eigentliche Plugin zu initialisieren:
# ...
class MyPlugin
{
# ...
public function __construct()
{
add_filter('the_hook', array($this, 'hook'));
}
public function hook()
{
}
# ...
}
Zum Zeitpunkt der Registrierung des Hooks profitiert dieses Plugin-Objekt bereits von seinem Design: Sie haben aufgehört, die eigentliche Hook-Funktion mit dem konkreten Plugin- Klassennamen fest zu codieren . Dies ist möglich, weil die Klasse für den Rückruf an die Objektinstanz gebunden ist. Klingt kompliziert, nur zu sagen: $this
ist das Plugin. Kann in Hook-Rückrufen verwendet werden. Vergleichen Sie die Methoden von Registering Class als Hook-Rückrufe .
Dieses Muster ermöglicht eine einfachere Schnittstelle mit WordPress: Die Injektion wird auf die Namen der Hooks und die von ihnen bereitgestellten Daten reduziert. Sie können dann beginnen, direkt in diese Plugin-Klasse zu implementieren oder Ihre Implementierung dahingehend umzugestalten, dass nur Code in die Plugin-Klasse eingefügt wird, der das absolute Minimum für die Definition der Plugin-Schnittstelle gegen WordPress darstellt. Hier beginnt der Spaß und höchstwahrscheinlich das, was jeder Plugin-Autor auf lange Sicht erreichen möchte.
Also nicht mit Wurmkleid programmieren, sondern dagegen. Da worpdress sehr flexibel ist, gibt es keine gemeinsame oder einfach zu beschreibende Programmierschnittstelle. Eine Basis-Plug-in-Klasse kann diese Rolle übernehmen und bietet Ihnen mehr Flexibilität für Ihren eigenen Code, was zu einfacherem Code und einer besseren Leistung führt.
Es gibt also mehr als nur einen Vorteil für den Namensabstand. Der beste Vorschlag, den ich machen kann, ist: Versuchen Sie es selbst. Es gibt nicht viel zu verlieren, nur Neues zu entdecken.
Sie werden höchstwahrscheinlich Unterschiede bemerken, nachdem Sie einige größere Aktualisierungen von WordPress durchgeführt haben, während Ihr Plugin kompatibel bleibt.
Vorsichtsmaßnahme : Wenn Ihr Plugin direkt in WordPress integriert ist, um die Aufgabe zu erledigen, ist es möglicherweise besser, eine oder zwei öffentliche Funktionen zu verwenden. Nehmen Sie das richtige Werkzeug für den Job.