Erweiterung in PHP ArrayObject richtig?
Problem: ich bin versucht zu verlängern PHP ArrayObject
wie unten gezeigt. Leider kann ich es nicht mehr ordnungsgemäß funktioniert, wenn die Einstellung multi-dimensionale Objekte und stattdessen wird ein Fehler geworfen, als ich den strengen Einstellungen in PHP aktiviert. (Error: Strict standards: Creating default object from empty value
)
Frage: Wie kann ich änderungen an meiner Klasse und erstellen Sie automatisch nicht vorhandene Ebenen für mich?
Code:
$config = new Config;
$config->lvl1_0 = true; //Works
$config->lvl1_1->lvl2 = true; //Throws error as "lvl1" isn't set already
class Config extends ArrayObject
{
function __construct() {
parent::__construct(array(), self::ARRAY_AS_PROPS);
}
public function offsetSet($k, $v) {
$v = is_array($v) ? new self($v) : $v;
return parent::offsetSet($k, $v);
}
}
- Welche version von PHP verwenden Sie?
5.3.5
Ich denke, es ist!- Hallo Industrial! Brauchen Sie wirklich Ihre
Config
Klasse eine Spezialisierung derArrayObject
oder Sie brauchen einfach nur, weil die Informationen, die Speicherung von Einrichtungen, die es bietet? - Hi Nick! Nein, ich hab mich entschieden für ein
ArrayObject
Umsetzung nach dieser Frage: stackoverflow.com/questions/7202784/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nehmen einer oop-Sicht auf Ihr Problem, Sie können eine Klasse erstellen, Modelle das Konzept eines multi-dimensionalen Objekt.
Die Lösung im posting nicht reicht von
ArrayObject
erreichen die Ziele, die Sie erwähnen. Als Sie mit dem Stichwort Ihrer Frage, wie der oop, ich denke, es ist wichtig zur Stärkung der Trennung, die Art und Weise Sie speichern den Zustand eines Objekts wie Sie darauf zugreifen.Hoffe, dies wird Ihnen helfen zu erreichen, was Sie brauchen!
Von dem, was Sie sagte, ein multi-dimensionales Objekt ist ein Objekt, dass:
$config->database->host = 'localhost'
diedatabase
undhost
Ebenen werden automatisch initialisiert, und diehost
zurück'localhost'
wenn diese abgefragt wird.Vorgeschlagene Lösung
Also, wie können diese features umgesetzt werden?
Die zweite ist einfach: mit Hilfe von PHP -
__get
und__set
Methoden. Diese wird aufgerufen, wenn ein lese - /Schreibzugriff ist beign auf inaccesible-Eigenschaft (eines, das nicht definiert, die in einem Objekt).Der trick wird sein, dann ist nicht zu erklären, jede Eigenschaft und Griff propertie-Operationen, die durch diese Methoden, ordnen Sie die Eigenschaft name beign der Zugang als Schlüssel zu einer assosiative array als Speicher. Sie erhalten von uns grundsätzlich eine Schnittstelle für accesing Informationen intern gespeichert werden.
Für die Dritte, wir brauchen einen Weg, um erstellen Sie eine neue Verschachtelungsebene, wenn eine nicht deklarierte Eigenschaft ist mir gelesen.
Der entscheidende Punkt hier ist zu realisieren, dass der Rückgabewert für die Eigenschaft muss ein multi-dimensionales Objekt, so dass weitere Ebenen der Schachtelung erstellt werden können, von ihm auch: Wann wurden gebeten, für eine Eigenschaft, deren name nicht vorhanden ist, in das interne array ein, gut assoziieren diesen Namen mit einer neuen Instanz von
MultiDimensionalObject
und gibt es zurück. Das zurückgegebene Objekt wird in der Lage sein zu handhaben definierte oder nicht definierte Eigenschaften zu.Wenn eine nicht deklarierte Eigenschaft geschrieben, alles, was wir tun müssen, ist, weisen Sie ihm den Namen mit dem angegebenen Wert in das interne array ein.
Die vierte ist einfach (siehe, es auf
__construct
Umsetzung). Wir müssen nur sicherstellen, dass wir erstellen eineMultiDimensionalObject
wenn Sie den Wert einer Eigenschaft ist ein array.Schließlich die Faust eines: die Art, wie wir behandeln die zweite und Dritte Feature ermöglicht es uns, zu Lesen und schreiben von Eigenschaften ("deklarierte und nicht deklarierte) in einer beliebigen Ebene der Schachtelung.
Sie können Dinge tun, wie
$config->foo->bar->baz = 'hello'
auf eine leere Instanz und dann die Abfrage für$config->foo->bar->baz
erfolgreich.Wichtig
Beachten Sie, dass
MultiDimensionalObject
statt beign selbst ein array ist es komponiert mit einer Reihe, so dass Sie ändern die Art und Weise Sie speichern den Zustand des Objekts Bedarf.Umsetzung
Demo
Code:
var_dump(neue MultiDimensionalObject());
Ergebnis:
Code:
Ergebnis:
Code:
Ergebnis:
Code:
Ergebnis:
Umsetzung der
offsetGet
Methode. Wenn Sie Zugriff auf einen nicht vorhanden-Eigenschaft, können Sie eins erstellen, wie Sie möchten.Als Sie ArrayObject erweitern, sollten Sie mithilfe der array-Weg [] zu setzen oder zu erhalten.
Kopiert, eingefügt mit dem code und es funktioniert gut auf mein PHP-test-box (PHP 5.3.6). Er erwähnt, dass die Strengen Warnung, aber es funktioniert immer noch wie erwartet. Hier ist die Ausgabe von print_r:
Es ist erwähnenswert, dass auf die PHP-docs gibt es einen Kommentar mit der Führung und der Bezug zu dem, was Sie zu tun versuchen:
Detaillierte Erläuterung weiter oben verlinkt aber zusätzlich zu
offsetSet
die Sie haben undoffsetGet
die xdazz erwähnt, die Sie auch implementieren müssenoffsetExists
undoffsetUnset
. Dies sollte damit nichts zu tun haben mit Ihrem aktuellen Fehler, aber es ist etwas, das Sie achten sollten.Update: xdazz' der zweiten Hälfte hat die Antwort auf Ihr problem. Wenn Sie auf Ihr Config-Objekt wie ein array ist, funktioniert es ohne Fehler:
Können Sie das tun, oder sind Sie beschränkt sich auf die Objekt-syntax für einige Grund?
ini_set('display_errors', 0);
oder ausschalten Strengen error reportingerror_reporting(E_ALL);
entweder dieser eine option?