php call-Klasse-Methode statische Methode innerhalb derselben Klasse aber noch nicht instanziiert
php 5.3+
Sorry für die lange Frage, aber ich will lernen, diese völlig.
Ich weiß, ich kann nicht rufen Sie eine nicht-statische gleichen Klasse Methode innerhalb einer statischen Methode, ohne dass die Klasse instanziiert wird als ein Objekt.
class Person
{
private $people_array;
function data_all_get()
{ //touch database, return array of people
$this->people_array = //etc dbquery results
}
static function showPeople()
{ //call class method
$people_data = $this->data_all_get();
//Fatal error: Using $this when not in object context
}
} //end class Person
Suche auf SO, fand ich einige interessante Ansätze, aber Frage mich, wie jeder Ansatz wirkt sich auf die code-Umgebung.
Meine Fragen sind wie folgt:
Ich könnte instanziieren Sie die Klasse wie ein Objekt in der statischen Methode, um Zugriff auf die nicht-statische Methode
static function showPeople()
{ //instantiate as object
$person = New Person();
//call class method
$people_data = $this->data_all_get();
}
Q1 - welche Probleme könnte das hervorrufen ?
in meiner situation, die Klasse hat keinen Konstruktor, also keine andere Klasse Methoden noch vars betroffen wären von der Instanz. Würde das neue Objekt einfach nehmen ein wenig Platz im Speicher während der Skript-Ausführung? Scheint nicht allzu schlecht...
die andere option wäre, zu konvertieren, die "data_all_get" - Methode in einer statischen Methode, die so genannt werden könnte von innen die statische Methode "showPeople", d.h.
self::showPeople()
"data_all_get" - Methode verwendet wird, durch andere Methoden in der Klasse, wenn es instanziiert wird, als ein Objekt, um den Wert von private var, reduzieren sich die Fahrten auf die Datenbank, wenn es bereits gesetzt ist. Ich weiß, das könnte wahrscheinlich werden Sie Teil einer Konstruktor-Funktion, aber ich habe nie eine Notwendigkeit für diese "Person" Objekt instatiated mehr als einmal pro php-Skript Anfrage, die Klasse wird hauptsächlich dazu verwendet, um die Gruppe Funktionen und vars gemeinsam für die Organisation ...
Q2 - was sind die Auswirkungen des "data_all_get" in eine statische Methode ?
gibt es irgendwelche? wenn die Methode statisch sei, sondern es setzt den Wert des privaten var $people_array (ist nicht statisch), ich denke, dass var in der Lage sein würde, zu werden, aktualisiert oder überschrieben werden, wenn das Objekt, das jemals benötigt, um instanziiert zu werden ein zweites mal in einem einzigen Skript Anfrage, korrekt? Plus, da die Eigenschaft nicht andere statische Methoden der Klasse darauf zugreifen können.
Q3 - Könnte ich rufen Sie die statische Methode "data_all_get" so oft, wie ich wollte, ohne "etwas zu zerbrechen" (eine geladene Frage, IK).
Q4 - Tut es einfach zusätzlichen Speicher jedes mal, wenn die statische Methode aufgerufen wird?
Danke
vielen Dank für das feedback. ich mache die Methode static, damit es aufgerufen werden kann, aus anderen Gegenden / Strecken von der Anwendung, ohne zu instanziieren Sie ein Objekt zuerst (wie eine include-Datei in einem pre-oop-Welt). ich habe getan, einige weitere Forschungs - & - Prüfung und ich bin derzeit Neigung zu machen, die die Eigenschaften der statischen auch, und die andere Klasse von Methoden, müssen diese Eigenschaften statisch, so dass diese statische Klasse, nennen wir Sie. es jetzt arbeiten...
update: ich habe umgestaltet und aus den Elementeigenschaften, die statische und die getter & setter-Funktionen statisch, so dass Sie kann aufgerufen werden, indem Sie sowohl die statische member-Methode und die Klasse Methoden, und es funktioniert. möchte aber trotzdem alle Kommentare und Vorschläge Sie haben über meine 4 Fragen, die oben aufgeführt sind, vielen Dank.
InformationsquelleAutor Steve Wasiura | 2012-10-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur ein paar Notizen, einige vielleicht offensichtlich. 1) Wie ist Sie nicht der Rückkehr alles so offensichtlich ist der obige code wird scheitern. Es ist nichts falsch, pro sagen, mit dem code oben. In Antwort auf Ihre Q1 alles, was Sie getan haben, ist genommen ein paar Funktionsaufrufe, die Verwendung einer globalen Variablen und verkapselt Sie innerhalb einer Klasse. Ich würde abraten, manchmal als instantiierte Klasse und manchmal nicht, so zu tun, als es wird machen Sie Ihre endgültige code weniger lesbar und schwerer für die Menschen zu verstehen, wenn Sie suchen, ist es vorbei.
Wenn Sie sind besorgt über die Instanziierung dieser mehr als einmal, möchten Sie vielleicht Blick auf das singleton design pattern, aber im Allgemeinen wenn Sie planen, um die Klasse instanziieren irgendwann würde ich nochmals prüfen, warum Sie anrufen diese statisch in den ersten Platz. Es ist nichts falsch mit, dass, pro sagen, außer, dass es 'fühlt sich falsch an" zu mir.
Q2) Die einzige Andeutung zu machen data_all_get in einem statischen array ist, dann ist es verweisen auf eine statische Konstanteneigenschaft, was wiederum bedeutet, dass diese Eigenschaft zugegriffen werden, wenn instanziiert. Auch, Sie verlieren die Fähigkeit zu instanziieren mehrere Versionen dieser Klasse (wenn das von Bedeutung ist) und im Grunde drehen people_array in eine Globale variable. Das ist nicht unbedingt schlecht, aber ohne zu wissen, was der rest der Funktionalität zu tun es ist schwer zu sagen, was die Auswirkungen sind.
Q3), Das einzige Problem, es läuft mehrere Male ist A) die Vernichtung ist, was in Menschen-array, und B) Mehrere DB-Aufrufe. Ohne zu sehen, was andere code wird auf diese Fragen ist mehr oder weniger unmöglich zu beantworten.
Q4) Der Speicher für eine Methode die Größe von dem, was Sie hier aufgeführt haben, ist vernachlässigbar bis zu dem Punkt, der nicht der Rede Wert. Die Sorge kommt mit den DB-aufrufen selbst, und die Anzahl der Zeilen, auf die zugegriffen wird es
Schließlich, es ist ein wenig seltsam, als Sie diesen code geschrieben, nun, da showPeople tut genau das gleiche wie data_all_get. Sie wollen wahrscheinlich schreiben einige Logik in showPeople, um zu sehen, wenn $people_array leer ist oder nicht, und wenn ja, führen Sie data_all_get und wenn nicht, zurück people_array. Dadurch wird vermieden, zusätzliche DB liest. Wenn du gehst, zu gehen, Lesen Sie die DB jedes mal, egal wie, dann könnten Sie auch haben data_all_get return $people_array, in dem seltenen Fall, dass keiner dieser muss innerhalb einer Klasse stehen, und es kann nur eine Funktion aufrufen, die zurückgibt, was er findet in die db.
InformationsquelleAutor DaOgre