In PHP 4 werden Variablen normalerweise mit var deklariert, während Sie in PHP 5 die Funktionen der objektorientierten Programmierung (OOP) verwenden können, um die Sichtbarkeit von Daten anzupassen – d. h. die Sichtbarkeit ist hier dem Variablenbereich sehr ähnlich. Da sie jedoch einen besseren Kontrollmechanismus bietet, gibt es drei Arten von Sichtbarkeitsmodifikatoren:
Öffentlich (Standard) – Auf Variablen kann im globalen Bereich zugegriffen oder diese geändert werden.
Geschützt: Auf Variablen kann nur innerhalb der Klasse selbst und direkt abgeleiteter Klassen (mithilfe der Extens-Anweisung) zugegriffen oder diese geändert werden.
Privat: Auf Variablen kann nur innerhalb der Klasse zugegriffen oder sie geändert werden.
Wie bei Schnittstellenimplementierungen führt ein Verstoß gegen diese Regeln in einem Programm zu schwerwiegenden Fehlern; und wie bei Schnittstellen dienen sie ausschließlich der Bequemlichkeit der Programmierer. Dies bedeutet jedoch nicht, dass sie ignoriert werden können. Durch die Angabe der Sichtbarkeit einer bestimmten Klassenmitgliedsvariablen können die Daten innerhalb des Objekts vor äußeren Einflüssen geschützt werden.
Angenommen, es gibt eine MySqlDB-Klasse und eine $link-Variable ist darin als privat deklariert, was bedeutet, dass auf diese Variable nur innerhalb des Objekts mit der $this-Variablen zugegriffen werden kann. Dies verhindert ein versehentliches Überschreiben durch andere Objekte oder Funktionen außerhalb der Klasse , wir werden das Sichtbarkeitsattribut verwenden, um uns beim Erstellen eines Abfrageobjekts zu helfen.
Sie können sich eine Abfrage als eine separate Entität vorstellen, die ausgeführt werden kann und Ergebnisse zurückgibt. Einige Datenbanksysteme verfügen auch über gespeicherte Prozeduren, die Abfrageanweisungen speichern und beim Aufruf entsprechende Parameter akzeptieren. Allerdings stellte MySQL vor Version 5.1 keine ähnlichen Funktionen bereit.
In diesem Artikel werden die beiden oben genannten Funktionen im Abfrageobjekt des Beispiels kombiniert. Das Beispiel simuliert eine grundlegende gespeicherte Prozedur und speichert den Ergebniszeiger intern. Im Moment liegt der Schwerpunkt auf der Ausführung der Abfrage vom Objekt aus, wobei Sie die Funktion query() des MySqlDB-Objekts aufrufen können.
Die folgenden öffentlichen Funktionen können im Abfrageobjekt definiert werden:
__construct() – Der Konstruktor akzeptiert einen Parameter, der einen Instanzverweis auf das Objekt enthält, das die DB-Schnittstelle implementiert.
Prepare() – Die Funktion Prepare() initialisiert die gespeicherte Abfrageprozedur. Es kann einen oder mehrere begrenzte Platzhalter enthalten, die als Parameter an die Funktionexecute() übergeben werden. Ein Platzhalter ist als Doppelpunkt definiert, der sich auf die Anzahl der Parameter bezieht, gefolgt von einer Ganzzahl und einem Buchstaben, der sich auf den Parametertyp bezieht.
Eine einfache Abfrage mit Platzhaltern sieht wie folgt aus:
SELECT col1,col2 FROM table_name WHERE col1=:1I
Execute() – Die Funktion Execute() führt die Abfrage aus. Wenn es durch die Funktion Prepare() vorzeitig als gespeicherte Prozedur initialisiert wird, werden alle übergebenen Parameter als Ausführungsparameter der gespeicherten Prozedur verwendet. Andernfalls wird der erste Parameter nur als Abfragetext verwendet. Die Funktionexecute() gibt die Ergebnisse zurück, nachdem die Abfrage ausgeführt wurde.
compilieren() – Die Funktion Compilieren() ähnelt der Funktion Execute(). Tatsächlich wird die Abfrage nicht ausgeführt, sondern ersetzt alle Platzhalter in der Abfragezeichenfolge, akzeptiert die Parameter der gespeicherten Prozedur und gibt die kompilierte Version zurück der Abfrage.
Geschützte Mitglieder
Wie oben erwähnt, kann das Konzept der Sichtbarkeit verwendet werden, um das Innenleben eines Objekts zu verbergen und so die für das Innenleben erforderliche Datenintegrität zu schützen. Wie bereits erläutert, wird der von der Abfrage zurückgegebene Ergebniszeiger als geschütztes Attribut gespeichert. Das geschützte Mitglied wird hier verwendet, da ein bestimmtes Datenbankabfrageobjekt, das vom Abfrageobjekt abgeleitet wird, einige Kernfunktionen überlasten kann.
Genug der
Beschäftigung mit der Code-
Theorie. Beginnen wir nun mit dem Schreiben von Code. Erstellen Sie zunächst eine Vorlage wie in Beispiel 1 gezeigt:Beispiel 1: Eine Vorlagenklasse
DBQuery
der Datenbankabfrageklasse
{
/**
*Speichern Sie einen Verweis auf ein Objekt, das die DB-Schnittstelle implementiert.
*/
protected $db;
/**
*Wenn es sich um eine gespeicherte Prozedur handelt, setzen Sie diese auf „true“.
*/
protected $stored_procedure = false;
/**
*Speichern Sie eine Abfrage mit gelöschten Zeichenfolgen.
*/
private $query;
/**
* wird verwendet, um Anführungszeichen in SQL abzugleichen.
*/
private static $QUOTE_MATCH = "/(".*(?db = $db;
}
öffentliche Funktion Prepare($query)
{
$this->stored_procedure = true;
}
öffentliche Funktion kompilieren($args)
{}
öffentliche Funktion ausführen($query)
{}
}
Die Prepare-Funktion
ist die Vorlage in Beispiel 1. Als Erstes müssen Sie die Prepare()-Funktion erstellen. Um sicherzustellen, dass nicht in Anführungszeichen gesetzte Zeichen versehentlich als Platzhalter geparst werden, sollte die Funktion alle Zeichen in der Abfrage entfernen Speichern Sie sie vorübergehend in einem Array. Auch der String selbst wird durch Platzhalter ersetzt, die üblicherweise als String-Sequenzen erkannt werden, die nicht in der SQL-Anweisung vorkommen sollen. Während der Kompilierung der Abfrage wird zunächst der Prozedurplatzhalter ersetzt und dann die Zeichenfolge wieder in die Abfrage eingefügt. Dies erfolgt über die Funktion preg_replace() und eine weitere Hilfs-Callback-Funktion, die als Funktion preg_replace() verwendet wird.
Beispiel 2: Prepare()-Funktion
/**
* Bereiten Sie die Abfrage als gespeicherte Prozedur vor.
* @param string $query Vorbereiteter Abfragetext
* @return void
*/
öffentliche Funktion Prepare($query)
{
$this->stored_procedure = true;
$this->quote_store = array(); //Anführungszeichen löschen $this->query = preg_replace(self::$QUOTE_MATCH, '$this->sql_quote_replace("1"?"1":'2')', $ Abfrage);
}
private Funktion sql_quote_replace($match)
{
$number = count($this->query_strings);
$this->query_strings[] = $match;
return „$||$$number“;
}
Beachten Sie hier die Verwendung des statischen privaten QUOTE_MATCH-Attributs sowie des quote_store-Attributs und der Funktion sql_quote_replace(). Im Vergleich zu protected stellt die Definition als privat sicher, dass jede Unterklasse, die die Prepare()-Methode der Abfrageklasse überschreibt, ihren eigenen Mechanismus zum Entfernen von Anführungszeichen verwendet.
Funktion kompilierenDer
nächste Schritt besteht darin, die Funktionen „compile()“ und „execute()“ zu erstellen.
Die Funktion „compile()“ hat, wie in Beispiel 3 gezeigt, die folgenden Funktionen:
· Die Anzahl der akzeptierten Parameter ist variabel (d. h. variable Parameter), die mit den Platzhaltern in der Abfrage übereinstimmen.
· Überprüfen Sie, ob der Platzhalter den richtigen Datentyp hat, und ersetzen Sie ihn durch den Wert im Parameter.
·Die Abfrage als Zeichenfolge zurückgeben, aber nicht ausführen.
·Wenn das Abfrageobjekt nicht mit der Funktion Prepare() als gespeicherte Prozedur initialisiert wird, wird eine Ausnahme ausgelöst.
Beispiel 3: Funktion „compile()“
/**
* Gibt die kompilierte Abfrage zurück, führt sie jedoch nicht aus.
* @param gemischte $args,... Abfrageparameter
* @return string Kompilierte Abfrage
*/
öffentliche Funktion kompilieren($params)
{
if (! $this->stored_procedure) {
throw new Exception("Die gespeicherte Prozedur wurde nicht initialisiert!");
}
/* Substitutionsparameter*/
$params = func_get_args(); // Funktionsparameter abrufen $query = preg_replace("/(?query);
return $this->add_strings($query); // Den String wieder in die Abfrage einfügen
}
/**
* Fügen Sie die durch die Prepare()-Funktion entfernte Zeichenfolge erneut ein.
*/
private Funktion add_strings($string)
{
$numbers = array_keys($this->query_strings);
$count = count($numbers);
$searches = array();
for($x = 0; $x < $count; $x++) {
$searches[$x] = "$||${$numbers[$x]}";
}
return str_replace($searches, $this->query_strings, $string);
}
/**
* Bei jeder Ausführung wird ein Platzhalter in der gespeicherten Prozedur ersetzt.
*/
geschützte Funktion Compile_Callback($params, $index, $type)
{
--$index;
/* Eine Ausnahme auslösen */
if (! isset($params[$index])) {
throw new Exception("Die gespeicherte Prozedur hat nicht die erforderliche Anzahl an Parametern empfangen!");
}
/* Sie können hier andere Typen hinzufügen, z. B. Datum und Uhrzeit. */
switch ($type) {
Fall 'S':
return '"' . $this->db->escape_string($params[$index]) . '"';
brechen;
Fall 'I':
return (int) $params[$index];
brechen;
Fall 'N':
return (float) $params[$index];
Standard:
throw new Exception("Der in der gespeicherten Prozedur angegebene Datentyp '$type' wird nicht erkannt.");
}
}
Zwei zusätzliche Funktionen werden in der Funktion „compile()“ verwendet. Die Funktion „compile_callback()“ wird als Callback-Funktion im Funktionsaufruf „preg_replace()“ verwendet. Jedes Mal, wenn ein Platzhalter in der Abfrage gefunden wird, wird er durch den übergebenen Wert ersetzt Beim Kompilieren des Werts einer Funktion wird dieser ausgeführt.
Funktion „execute“
Abschließend müssen Sie die Funktion „execute()“ konstruieren. Die Funktion „execute()“ kompiliert die Abfrage und führt sie mithilfe des DB-Objekts aus, das hier zur Initialisierung des DBQuery-Objekts verwendet wird. Bitte beachten Sie in Beispiel 4, wie die Funktion call_user_func_array() verwendet wird, um die kompilierte Abfrage zu erhalten. Der Grund dafür ist, dass die Funktionexecute() die Anzahl der an sie übergebenen Argumente erst zur Laufzeit ermitteln kann.
Beispiel 4: Funktion „execute()“
/**
*
* Führen Sie die aktuelle Abfrage aus und ersetzen Sie die Platzhalter durch die bereitgestellten Parameter.
*
* @param gemischt mit $queryParams,... Abfrageparameter
* @return resources Ein Verweis auf die Ressource, die die ausgeführte Abfrage darstellt.
*/
öffentliche Funktion ausführen($queryParams = '')
{
//Zum Beispiel: SELECT * FROM table WHERE name=:1S AND type=:2I AND level=:3N
$args = func_get_args();
if ($this->stored_procedure) {
/* Rufen Sie die Kompilierungsfunktion auf, um eine Abfrage zu erhalten */
$query = call_user_func_array(array($this, 'compile'), $args);
} anders {
/* Wenn die gespeicherte Prozedur nicht initialisiert wurde, führen Sie sie als Standardabfrage aus. */
$query = $queryParams;
}
$this->result = $this->db->query($query
return $this->result);
}
zu
veranschaulichen, wird unten ein kleines Beispiel erstellt, das das DBQuery-Objekt als gespeicherte Prozedur verwendet und prüft, ob der richtige Benutzername und das richtige Kennwort eingegeben werden. Siehe Beispiel 5:
Beispiel 5:
erfordern ' mysql_db.php5';
require_once 'query2.php5';
$db = new MySqlDb;
$db->connect('host', 'username', 'pass');
$db->query('use content_management_system');
$
query = new DBQuery($db);
');
if ($result = $query->execute("visualad", "apron", time())) {
if ($db->num_rows($result) == 1) {
echo('Die Anmeldeinformationen sind korrekt.');
} anders {
echo('Die Anmeldeinformationen sind falsch und die Sitzung ist abgelaufen.');
}
} anders {
echo('Beim Ausführen der Abfrage ist ein Fehler aufgetreten:' . $db->error());
}
In diesem Artikel haben Sie gesehen, wie Sie Daten schützen und die Sichtbarkeit von Datenobjekten mithilfe der Zugriffsmodifikatoren private, protected und public bei der Deklaration von Klassenvariablen einschränken. Gleichzeitig können diese Konzepte auch in PHP 5 verwendet werden andere Datenklasse, um ihre wichtigen internen Daten zu schützen.