2017-09-28 1 views
0

Ich habe begonnen, PHP Programmierung objektorientierte Programmierung.
Ich habe begrenzte Erfahrung mit PHP im Allgemeinen.PHP Array Rückgabewerte nur

Ich habe PHP-Code wie folgt:

A "Cars" Klasse:

class Cars { 
    static $car_specs = array("wheel_count", "name", "color"); 
    static function set_car_detail() { 
     self::$car_specs["wheel_count"] = 4; 
     self::$car_specs["name"] = "default"; 
     self::$car_specs["color"] = "generic"; 
    } 
    static function get_car_detail() { 
     return self::$car_specs; 
    } 
} 

und dann zur Ausgabe Ich versuche, dieses:

Cars::set_car_detail(); 
echo implode(',', Cars::get_car_detail()); 

das Echo ist:

wheel_count,name,color,4,default,generic 

aber ich ' m versuchen zu bekommen:

4,default,generic 

foreach Versuche ergaben ähnliche Antworten. Ich möchte verstehen, was ich falsch mache.

+2

Dies ist nicht OOP- sollten Sie Getter/Setter statt jede Eigenschaft in 1-Array setzen + auch keine Notwendigkeit für statische –

+0

Mögliche doppelte Verwendung von [PHP - Merge zwei Arrays (gleiche Länge) in einem assoziativen?] (Https://stackoverflow.com/questions/1200885/php-merge-two-arrays-same-length-into-one-associative) – War10ck

+0

Warum tun Sie legen die Details in einer separaten Funktion fest? Planen Sie in Zukunft diese Werte weiterzugeben? Andernfalls macht es keinen Sinn, warum Sie das bereits hydratisierte Array nicht erstellen würden. – War10ck

Antwort

1

Der von Ihnen gepostete Code ist überhaupt keine Klasse. Es ist nur eine Reihe von globalen Funktionen und Variablen mit funky Namen. Versuchen Sie, statische Eigenschaften und Methoden zu vermeiden, da sie nicht OOP sind. Versuchen Sie auch, öffentliche Eigenschaften und Getter/Setter zu vermeiden, da sie nur verkappte prozedurale Programmierung sind.

Ein Skelett einer Car Klasse könnte wie folgt aussehen:

class Car { 
    private $wheel_count; 
    private $name; 
    private $color; 

    public function __construct($wheel_count, $name, $color) 
    { 
     $this->wheel_count = $wheel_count; 
     $this->name = $name; 
     $this->color = $color; 
    } 

    public function paint($new_color) 
    { 
     $this->color = $new_color; 
    } 

    public function describe() 
    { 
     return sprintf('%d wheels, %s %s', $this->wheel_count, $this->color, $this->name); 
    } 
} 

Die Objekteigenschaften sind privat. Kapselung ist eines der Schlüsselkonzepte von OOP. Sie sind im Konstruktor festgelegt. Die Rolle des Konstruktors besteht darin, das Objekt zu initialisieren und betriebsbereit zu machen. Stellen Sie sicher, dass der Konstruktor alle Eigenschaften des Objekts initialisiert und nichts anderes tut (keine Arbeit im Konstruktor).

Erstellen Sie Methoden in der Klasse für die Aktionen, die für Ihre Klasse sinnvoll sind. Zum Beispiel ändert sich die Anzahl der Räder eines Autos nie, es hat keinen Sinn, eine Methode zu schreiben, um eine andere Anzahl von Rädern einzustellen. Aber die Farbe des Autos ändert sich manchmal und die paint() Methode behandelt das.

Vermeiden Sie es, "getters" zu schreiben (d. H. Methoden, die nichts tun, als den Wert einer Eigenschaft zurückzugeben). Sie sind das Zeichen, dass irgendein Code, der zu der Klasse gehört, irgendwo außerhalb der Klasse geschrieben ist (und oft wird er hier und da und überall dupliziert, mit geringen oder keinen Änderungen). Wann immer es möglich und angemessen ist, schreibe eine Methode, die die Eigenschaften des Objekts verwendet, um einen nützlichen Wert zu erzeugen (im Gegensatz zum Schreiben von Gettern, um den nützlichen Wert irgendwo anders berechnen zu lassen).

Dies ist, wie die Car Klasse weiter unten beschrieben verwendet wird:

$car1 = new Car(4, 'Mazda', 'red'); 
$car2 = new Car(8, 'big truck', 'blue'); 

echo($car1->describe()); 
# 4 wheels, red Mazda 

$car1->paint('green'); 
echo($car1->describe()); 
# 4 wheels, green Mazda 
+0

Vielen Dank. Ihre Antwort war sehr informativ. Ich stimme zu, dass die bereitgestellte Klasse nicht wirklich eine Klasse war ... mein Fokus lag auf dieser Zeit darauf, wie statische Variablen und Funktionen funktionieren. –

+0

Statische Eigenschaften sind nur globale Variablen mit komplizierten Namen (und Sichtbarkeitseinschränkungen). Sie werden nicht vererbt; Sie können auf eine statische Variable ('Cars :: $ car_specs') von einer Klasse zugreifen, die' Cars' erweitert, indem Sie 'self :: $ car_specs' verwenden, aber solange Sie die Eigenschaft in der Child-Klasse nicht erneut deklarieren: : $ car_specs' in der Kindklasse ist das gleiche wie 'Cars :: $ car_specs'. Dies ist ein kontraintuitives Verhalten, das zu Verwirrung und Fehlern führt. Statische Methoden sind nur globale Funktionen mit komplizierten Namen (und Sichtbarkeitseinschränkungen). – axiac

0

Es gibt eine selbsterklärende Funktion speziell für diesen

static function get_car_detail() { 
     return array_values(self::$car_specs); 
    } 
+2

'implode' funktioniert bereits nur bei Array-Werten, das ist hier nicht das Problem – iainn

2

Sie das Array mit Werten initialisiert, aber vielleicht wollen Sie es mit den Tasten initialisieren:

static $car_specs = array(
    "wheel_count" => null, 
    "name" => null, 
    "color" => null 
); 
+0

Ich sehe, wie das funktioniert aber unsicher warum vergleichen mit dem, was ich geschrieben habe? Ich nehme an, ich mache eine schlechte Übung, wenn ich ein Array nur mit Schlüsseln initialisiere und später Werte hinzufüge? –

+0

@ AviE.Koenig: Sicher hast du Recht. Es ist nur eine der möglichen Antworten auf die Frage "Was mache ich falsch?". – Walrus

1

Da Sie bereits eine haben Array von key Werte, warum erstellen Sie kein entsprechendes Array von values für jeden Schlüssel und verwenden Sie array_combine().

class Cars { 
    static $car_specs; 

    static function set_car_detail() { 
     $keys = array("wheel_count", "name", "color"); 
     $values = array(4, "default", "generic"); 

     self::$car_specs = array_combine($keys, $values); 
    } 

    static function get_car_detail() { 
     return self::$car_specs; 
    } 
} 

Cars::set_car_detail(); 
echo implode(',', Cars::get_car_detail());