2013-09-05 6 views
10

Ich habe Arrays verwendet, um verwandte Felder für eine lange Zeit zu speichern. Wenn ich im Zusammenhang Benutzerfelder haben wollte, habe ich:Was ist besser stdClass oder (Objekt) Array, um verwandte Daten zu speichern?

$user = array(
    'id' => 27 
    'name' => 'Pepe' 
); 

Aber in letzter Zeit habe ich viel mit Objekten arbeitet, und Ich mag es mehr zu $ ​​user-> id statt $ user [verwenden‘ Ich würde'].

Meine Frage: ein objektorientiertes Design zu erreichen, können Sie stdClass verwenden:

$user = new stdClass(); 
$user->id = 27; 
$user->name = 'Pepe'; 

oder aus einem Array Gießen

$user = (object) array(
    'id' => 27 
, 'name' => 'Pepe' 
); 

ist einer von ihnen besser als die anderen, in der Reihenfolge der Leistung und Stil, oder können Sie, was Sie wollen, undeutlich verwenden?

Danke!

Update: Ich stimme allen Kommentaren zu, das ist überhaupt nicht OOP, ist nur über verwandte Daten in einer Struktur gruppiert. Mein $ user-Beispiel ist nicht das beste, weil es ein typisches Beispiel für die Verwendung von Klassen mit Methoden, Eigenschaften, blablabla ist ... Ich habe gefragt, weil ich viele config-Strukturen habe, wie uns "initTable", und ich möchte etwas wie:

$table => page => init => 1 
       => end => 25 
      sort => field => name 
       => order => asc 

und so weiter, und ich möchte wissen, was besser ist init Seite zu erhalten:

$table->page->init **OR** $table['page']['init'] 
+0

Instinktiv würde ich sagen, ein Objekt zu erstellen ist besser als ein Array zu erstellen und es in Bezug auf Speicherverbrauch und allgemeine Leistung auf ein Objekt zu werfen. – mhafellner

+3

nur weil etwas in einem Objekt ist, bedeutet nicht, dass Sie OOP verwenden. – Prisoner

+0

Wenn Sie ein tatsächliches typisiertes Objekt verwenden, kann Ihre IDE eine Intellisense/Korrektheitsprüfung durchführen. Subjektiv ist das viel nützlicher als mikroskopische Unterschiede zwischen diesen Möglichkeiten. – DCoder

Antwort

5

Basierend auf kleinen Test (http://phpfiddle.org/lite/code/cz0-hyf) kann ich sagen, dass die Verwendung von "new stdClass()" ist etwa 3 mal langsamer als andere Optionen.

Es ist seltsam, aber ein Array zu werfen ist sehr effizient im Vergleich zu StdClass getan.

Aber dieser Test misst nur die Ausführungszeit. Speicher wird nicht gemessen.

P.S. Ich benutzte phpFiddle nur, um Code zu teilen. Der Test wurde an meinem lokalen PC durchgeführt.

3

versuchen, das Problem zu untersuchen, hier ein Test machen jeweils 1.000.000 mal jeweils:

$start = microtime(true); 
for ($i=0;$i<1000000;$i++) { 
    $user = new stdClass(); 
    $user->id = 27; 
    $user->name = 'Pepe'; 
} 
$end = microtime(true); 
echo $end - $start; 

echo '<br><br>'; 

$start = microtime(true); 
for ($i=0;$i<1000000;$i++) { 
    $user = (object) array(
     'id' => 27, 
     'name' => 'Pepe' 
    ); 
} 
$end = microtime(true); 
echo $end - $start; 

meldet

0.75109791755676 
0.51117610931396 

so - appearently, in diesem speziellen Fall - von Array Gießen ist der schnellste Weg, es zu tun. Beats stdClass mit vielen Prozent. Aber ich würde nicht darauf als allgemeine universelle Regel oder Gesetz zählen.

3

Ich denke nicht, ein Array zu einem Standardobjekt zu bewegen würde einen Unterschied machen. Außer dass Sie die meisten der array_* Funktionen nicht mehr verwenden können.
Ich kann keine Vorteile mit einem dynamischen Objekt über ein indiziertes Array sehen.

In diesem Fall würde ich eine Klasse für jedes Element und Eigenschaften erstellen, die Sie benötigen.

class User 
{ 
    protected $id; 
    protected $name; 

    public function __construct($id = null, $name = null) 
    { 
     $this->id = $id; 
     $this->name = $name; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 

    public function setName($name) 
    { 
     $this->name = $name; 
    } 
} 

Mit solch einem Design wissen Sie genau, welche Art von Parametern Sie haben.

$user = new User(21, 'Foo'); 
echo $user->getName(); // Foo 

$blank = new User(22); 
echo $blank->getName(); // NULL 

Keine Fehler, keine Überprüfung mehr.
Mit einem array oder stdClass Sie wäre so etwas wie die für diese Art von Verhalten

$user = array('id' => 21, 'name' => 'Foo'); 
echo $user['name']; // Foo 

$blank = array('id' => 22); 
echo $blank['name']; // NOTICE: Undefined offset 
echo isset($blank['name']) ? $blank['name'] : null; // NULL 

hat, einen festen Gegenstand, in dem Sie die Schnittstelle wissen, ist leichter zu pflegen und zu verdrehen.

Verwandte Themen