2010-12-09 9 views
4

Ich habe eine Frage. Es ist ziemlich praktisch in JS Objekte wie diese zu erstellen:Javascript-ähnliche Objekte in PHP?

test = { foo : { bar : "hello world" }, bar2 : "hello world 2" } 

und dann nutzen sie wie

test.foo.bar 
test.bar2 

Gibt es etwas wie dies in PHP ohne Klassen deklariert?

Antwort

5

Mit stdClass können Sie (im Wesentlichen) typenlose Objekte erstellen.Zum Beispiel:

$object = (object) array(
    'name' => 'Trevor', 
    'age' => 42 
); 

Wie hier gezeigt, der schnellste Weg, um ein stdClass Objekt zu erstellen ist ein assoziatives Array zu werfen. Für mehrere Ebenen, tun Sie einfach die gleiche Sache wieder nach innen wie folgt aus:

$object = (object) array(
    'name' => 'Trevor', 
    'age' => '42', 
    'car' => (object) array(
     'make' => 'Mini Cooper', 
     'model' => 'S', 
     'year' => 2010 
    ) 
); 

Eine andere Methode ist es, die assoziatives Array zu einem Objekt anschließend mit einer rekursiven Funktion zu konvertieren. Hier ist ein Beispiel.

Dies ist nützlich, wenn Sie nicht derjenige sind, der das assoziative Array erstellt.

Obwohl PHP 5.3 anonyme Methoden unterstützt, können Sie leider keine anonyme Methode in eine stdClass einfügen (obwohl Sie eine in ein assoziatives Array einfügen können). Aber das ist sowieso nicht so schlimm; Wenn Sie Funktionalität darin möchten, sollten Sie stattdessen eine Klasse erstellen.

6

Es heißt assoziative Arrays.

Beispiel (Anmerkung: die Vertiefung ist für Layoutzwecke):

$test = array(
    'foo' => array(
    'bar' => 'hello world' 
    ), 
    'bar2' => 'hello world 2' 
); 
$test['foo']['bar']; 
$test['bar2']; 

Dies entspricht dem folgenden Javascript-Code:

var test = { 
    'foo': { 
    'bar': 'hello world', 
    }, 
    'bar2': 'hello world 2' 
}; 

Als Alternative können Sie die Verwendung vordeklarierte StdClass.

$test = new StdClass; 
$test->foo = new StdClass; 
$test->foo->bar = 'hello world'; 
$test->bar2 = 'hello world 2'; 

, die in JavaScript geschrieben werden würde, wie:

var test = new Object; 
test.foo = new Object; 
test.foo.bar = 'hello world'; 
test.bar2 = 'hello world 2'; 

(Anmerkung: new Object ist die gleiche wie {} in Javascript)

+4

* (Nitpick) * Objekte sind nicht identisch mit Assoziativen Arrays, daher sind die ersten beiden Beispiele nicht * äquivalent *. Die Verwendung von json_encode für das assoc-Array würde JavaScript-Objekte erzeugen, da in JavaScript keine assoc-Arrays vorhanden sind, dies gilt jedoch nicht für die Verwendung von json_decode für das JavaScript-Objekt. Standardmäßig gibt json_decode Objekte dafür zurück. – Gordon

2

Sie ein StdClass Objekt oder ein Arrayobject verwenden können, die enthalten sind, in PHP (obwohl Letzteres erfordert, dass Sie SPL installiert haben). Wenn Sie nicht speziell auf die Werte mit dem Operator -> zugreifen müssen, ist es effizienter, stattdessen ein assoziatives Array zu verwenden.

0
ist

Die nächste Sache würde Arrays sein.

$test = array(
    'foo' => array('bar' => 'hello world'), 
    'bar2' => 'hello world 2', 
); 

echo $test['foo']['bar']; 
+0

Nun, ich weiß über Arrays. Ich habe speziell nach Objekten gefragt, da sie flexibler sind, z. Wenn Sie möchten, können Sie Methoden hinzufügen, nicht nur Daten. –

+0

Wie sind Objekte in diesem Fall flexibler? Wie in JavaScript können Sie einem ** StdClass ** -Objekt keine Methoden hinzufügen. Der nächste, den Sie erhalten können, ist das Deklarieren einer Eigenschaft im StdClass-Objekt und das Zuweisen eines Objekts mit den von Ihnen benötigten Methoden. Sie können dies genauso mit Arrays tun. Die ** einzige ** Sache, die sich unterscheidet, ist die Syntax, die verwendet wird, um zu bekommen, was Sie brauchen; Ich sehe keine Unterschiede in der Flexibilität. – simshaun

0

Technisch, nein. Allerdings, wenn Sie ein Datenobjekt erstellen (dh keine Methoden), könnten Sie technisch einen JSON-String schreiben und verwenden

$obj = json_decode($obj_string); 

Ich würde es aber nicht empfehlen. Ich nehme an, dass es einen erheblichen Geschwindigkeitsverlust geben würde.

BEARBEITEN Obwohl es ohne Erwähnung geht, sollten dafür assoziative Arrays anstelle von flachen Datenobjekten verwendet werden.

+0

* (sidenote) * Das OP enthält keine Anführungszeichen um die Eigenschaften, also wird 'json_decode' nichts zurückgeben, weil es Json ungültig ist. – Gordon

0

Der einzige Grund dafür ist, wenn Sie Daten mit JSON an eine JavaScript-Funktion zurückgeben möchten. Verwenden Sie in diesem Fall json_encode für das Array. Ansonsten behalte es einfach als Array, da es keinen Grund gibt, es zu codieren und dann zu decodieren, so dass es wie JavaScript aussieht.

0

auf diese Weise versuchen: https://github.com/ptrofimov/jslikeobject

Autor JS-ähnliche Objekte implementiert, können Sie auch Zugriff auf die Eigenschaften von Funktionen über $ this-Zeiger.

Aber vielleicht ist es nicht so gut, solche Objekte statt der üblichen zu verwenden.

Verwandte Themen